Naive compiler from Hons AIGs into C/C++ code fragments.
The idea here is to be able to take an AIG and embed it in a C or
C++ program. You can tweak various aspects of the code that gets generated,
but some basic example output is:
const uint32_t n_8 = inputs.a; // prologue: initializes temp variables
const uint32_t n_2 = inputs.b; // you can control the rhs'es here
const uint32_t n_4 = inputs.c;
const uint32_t n_3 = ~n_4; // main aig contents
const uint32_t n_1 = n_2 & n_3; // never try to understand this
const uint32_t n_7 = ~n_8;
const uint32_t n_6 = n_4 & n_7;
const uint32_t n_5 = n_6 & n_1;
out1 = n_1; // epilogue: extracts aigs to outputs
out2 = n_5; // you can control the lhs'es here
We try to make relatively few assumptions about how you might actually use
this code. Toward that goal, you may configure, e.g., the names and types of the temporary
variables, and the operators used to carry out each AND and NOT operation.
Some high level notes:
- We basically turn each AIG node into one line of C/C++ code.
- We do at least take advantage of shared structure in the AIG, and avoid
recomputing an AND node just because it has multiple fanouts.
- We don't even do basic optimizations like using | or ^ operators,
but doing so might be useful.
- We do nothing to smartly collapse the AIG into vectors to take advantage
of, e.g., 32-bit bitwise ANDs, or anything like that.
The top-level function is aig2c-compile.
- Configuration object that governs how we translate an AIG into C/C++.
- Compile an alist of AIGs into a C code fragment.
- Create the temporary C code variable names that will be used for each
each AIG node, for a single AIG.
- Create the assignments for a single AIG.
- Create the assignments for AIG constant and variable nodes.
- Create the temporary C code variable names for a whole list of AIGs.
- Create the assignments from AIG nodes to outputs.
- Create the assignments for a list of AIGs.