mirror of
https://github.com/The-OpenROAD-Project/abc.git
synced 2026-03-12 11:26:17 +08:00
72 lines
4.8 KiB
Plaintext
72 lines
4.8 KiB
Plaintext
Using AIG Package in ABC
|
|
|
|
- Download the latest snapshot of ABC
|
|
- Compile the code found in "abc\src\aig\aig", "abc\src\aig\saig", and "abc\src\misc\vec" as a static library.
|
|
- Link the library to the project.
|
|
- Add #include "saig.h".
|
|
- Start the AIG package using Aig_ManStart().
|
|
- Assign primary inputs using Aig_ObjCreateCi().
|
|
- Assign register outputs using Aig_ObjCreateCi().
|
|
(it is important to create all PIs first, before creating register outputs).
|
|
- Construct AIG in the topological order using Aig_And(), Aig_Or(), Aig_Not(), etc.
|
|
- If constant-0/1 AIG nodes are needed, use Aig_ManConst0() or Aig_ManConst1()
|
|
- Create primary outputs using Aig_ObjCreateCo().
|
|
- Create register inputs using Aig_ObjCreateCo().
|
|
(it is important to create all POs first, before creating register inputs).
|
|
- Set the number of registers by calling Aig_ManSetRegNum().
|
|
- Remove dangling AIG nodes (produced by structural hashing) using Aig_ManCleanup().
|
|
- Call the consistency checking procedure Aig_ManCheck().
|
|
- Dump AIG into a file using the new BLIF dumper Saig_ManDumpBlif().
|
|
- For each object in the design annotated with the constructed AIG node (pNode), remember its AIG node ID by calling Aig_ObjId( Aig_Regular(pNode) ). To check whether the corresponding AIG node is complemented use Aig_IsComplement(pNode).
|
|
- Quit the AIG package using Aig_ManStop().
|
|
The above process should not produce memory leaks.
|
|
|
|
|
|
|
|
Using GIA Package in ABC
|
|
|
|
- Add #include "gia.h".
|
|
- Start the AIG package using Gia_ManStart( int nObjMax ).
|
|
(Parameter 'nNodeMax' should approximately reflect the expected number of objects, including PIs, POs, flop inputs, and flop outputs. If the number of objects is more, memory will be automatically reallocated.)
|
|
- If structural hashing is to be used, start hash table by calling Gia_ManHashStart().
|
|
- Similarly, whenever structural hashingn is no longer needed, deallocate hash table by calling Gia_ManHashStop().
|
|
- Assign primary inputs using Gia_ManAppendCi().
|
|
- Assign flop outputs using Gia_ManAppendCi().
|
|
(It is important to create all PIs first, before creating flop outputs).
|
|
(Flop control logic, if present, should be elaborated into AND gates. For example, to represent a flop enable, create the driver of enable signal, which can be a PI or an internal node, and then add logic for <flop_input_new> = MUX( <enable>, <flop_input>, <flop_output> ). The output of this logic feeds into the flop.
|
|
- Construct AIG in the topological order using Gia_ManHashAnd(), Gia_ManHashOr(), Gia_Not(), etc.
|
|
- If constant-0/1 AIG nodes are needed, use Gia_ManConst0() or Gia_ManConst1()
|
|
- Create primary outputs using Gia_ManAppendCo().
|
|
- Create flop inputs using Gia_ManAppendCo().
|
|
(it is important to create all POs first, before creating register inputs).
|
|
- Set the number of flops by calling Gia_ManSetRegNum().
|
|
- Remove dangling AIG nodes (produced by structural hashing) by running Gia_ManCleanup(), which will return a new AIG. If object mapping is defined for the original AIG, it should be remapped into the new AIG.
|
|
- Dump AIG into an AIGER file use Gia_DumpAiger().
|
|
- For each object in the design annotated with the constructed AIG node (pNode), remember its AIG node ID by calling Gia_ObjId(pMan,pNode).
|
|
- Quit the AIG package using Gia_ManStop().
|
|
The above process should not produce memory leaks.
|
|
|
|
|
|
|
|
|
|
Using MiniAIG Package
|
|
|
|
- Add #include "miniaig.h".
|
|
- Start the AIG package using Mini_AigStart().
|
|
- Assign primary inputs using Mini_AigCreatePi().
|
|
- Assign flop outputs using Mini_AigCreatePi().
|
|
(It is important to create all PIs first, before creating flop outputs.)
|
|
(Flop control logic, if present, should be elaborated into AND gates. For example, to represent a flop enable, create the driver of enable signal, which can be a PI or an internal node, and then add logic for <flop_input_new> = MUX( <enable>, <flop_input>, <flop_output> ). The output of this logic feeds into the flop.
|
|
- Construct AIG in a topological order using Mini_AigAnd(), Mini_AigOr(), etc.
|
|
- If constant-0 or constant-1 functions are needed, use 0 or 1.
|
|
- Create primary outputs using Mini_AigCreatePo().
|
|
- Create flop inputs using Mini_AigCreatePo().
|
|
(It is important to create all POs first, before creating register inputs.)
|
|
- Set the number of flops by calling Mini_AigSetRegNum().
|
|
- The AIG may contain internal nodes without fanout and/or internal nodes fed by constants.
|
|
- Dump AIG in internal MiniAIG binary format using Mini_AigDump() and read it into ABC using "&read -m file.mini"
|
|
- Dump AIG in standard AIGER format (https://fmv.jku.at/aiger/index.html) using Mini_AigerWrite() and read it into ABC using "&read file.aig"
|
|
- For each object in the design represented using MiniAIG, it may be helpful to save the MiniAIG literal returned by Mini_AigAnd(), Mini_AigOr(), etc when constructing that object.
|
|
- Quit the AIG package using Mini_AigStop().
|
|
The above process should not produce memory leaks.
|