1 /**CFile****************************************************************
2
3 FileName [acb.h]
4
5 SystemName [ABC: Logic synthesis and verification system.]
6
7 PackageName [Hierarchical word-level netlist.]
8
9 Synopsis [External declarations.]
10
11 Author [Alan Mishchenko]
12
13 Affiliation [UC Berkeley]
14
15 Date [Ver. 1.0. Started - July 21, 2015.]
16
17 Revision [$Id: acb.h,v 1.00 2014/11/29 00:00:00 alanmi Exp $]
18
19 ***********************************************************************/
20
21 #ifndef ABC__base__acb__acb_h
22 #define ABC__base__acb__acb_h
23
24 ////////////////////////////////////////////////////////////////////////
25 /// INCLUDES ///
26 ////////////////////////////////////////////////////////////////////////
27
28 #include "aig/gia/gia.h"
29 #include "misc/extra/extra.h"
30 #include "misc/util/utilNam.h"
31 #include "misc/vec/vecHash.h"
32 #include "aig/miniaig/abcOper.h"
33 #include "misc/vec/vecQue.h"
34
35 ////////////////////////////////////////////////////////////////////////
36 /// PARAMETERS ///
37 ////////////////////////////////////////////////////////////////////////
38
39 ABC_NAMESPACE_HEADER_START
40
41 ////////////////////////////////////////////////////////////////////////
42 /// BASIC TYPES ///
43 ////////////////////////////////////////////////////////////////////////
44
45
46 typedef struct Acb_Aig_t_ Acb_Aig_t;
47 typedef struct Acb_Ntk_t_ Acb_Ntk_t;
48 typedef struct Acb_Man_t_ Acb_Man_t;
49
50 // network
51 struct Acb_Ntk_t_
52 {
53 Acb_Man_t * pDesign; // design
54 int Id; // network ID
55 int NameId; // name ID
56 int iCopy; // copy module
57 unsigned Mark : 1; // visit mark
58 unsigned fComb: 1; // the network is combinational
59 unsigned fSeq : 1; // the network is sequential
60 // interface
61 Vec_Int_t vCis; // inputs
62 Vec_Int_t vCos; // outputs
63 Vec_Int_t vOrder; // order
64 Vec_Int_t vSeq; // sequential objects
65 int nRegs; // flop count
66 int nFaninMax; // default fanin count
67 int nObjTravs; // trav ID
68 int LevelMax; // max level
69 int nPaths; // the number of paths
70 // stucture
71 Vec_Str_t vObjType; // type
72 Vec_Int_t vObjFans; // fanin offsets
73 Vec_Int_t vFanSto; // fanin storage
74 // optional
75 Vec_Int_t vObjCopy; // copy
76 Vec_Int_t vObjFunc; // function
77 Vec_Int_t vObjWeight; // weight
78 Vec_Wrd_t vObjTruth; // function
79 Vec_Int_t vObjName; // name
80 Vec_Int_t vObjRange; // range
81 Vec_Int_t vObjTrav; // trav ID
82 Vec_Int_t vObjBits; // obj mapping into AIG nodes
83 Vec_Int_t vObjAttr; // attribute offset
84 Vec_Int_t vAttrSto; // attribute storage
85 Vec_Int_t vNtkObjs; // instances
86 Vec_Int_t vTargets; // targets
87 Vec_Int_t vLevelD; // level
88 Vec_Int_t vLevelR; // level
89 Vec_Int_t vPathD; // path
90 Vec_Int_t vPathR; // path
91 Vec_Flt_t vCounts; // priority counts
92 Vec_Wec_t vFanouts; // fanouts
93 Vec_Wec_t vCnfs; // CNF
94 Vec_Str_t vCnf; // CNF
95 Vec_Int_t vSuppOld; // previous support
96 // other
97 Vec_Que_t * vQue; // temporary
98 Vec_Int_t vCover; // temporary
99 Vec_Int_t vArray0; // temporary
100 Vec_Int_t vArray1; // temporary
101 Vec_Int_t vArray2; // temporary
102 };
103
104 // design
105 struct Acb_Man_t_
106 {
107 char * pName; // design name
108 char * pSpec; // spec file name
109 Abc_Nam_t * pStrs; // string manager
110 Abc_Nam_t * pFuns; // constant manager
111 Abc_Nam_t * pMods; // module name manager
112 Hash_IntMan_t * vHash; // variable ranges
113 Vec_Int_t vNameMap; // mapping names
114 Vec_Int_t vNameMap2; // mapping names
115 Vec_Int_t vUsed; // used map entries
116 Vec_Int_t vUsed2; // used map entries
117 char * pTypeNames[ABC_OPER_LAST];
118 int nObjs[ABC_OPER_LAST]; // counter of objects of each type
119 int nAnds[ABC_OPER_LAST]; // counter of AND gates after blasting
120 // internal data
121 int iRoot; // root network
122 Vec_Ptr_t vNtks; // networks
123 // user data
124 int nOpens;
125 Vec_Str_t vOut;
126 Vec_Str_t vOut2;
127 void * pMioLib;
128 };
129
130 ////////////////////////////////////////////////////////////////////////
131 /// MACRO DEFINITIONS ///
132 ////////////////////////////////////////////////////////////////////////
133
Acb_ManName(Acb_Man_t * p)134 static inline char * Acb_ManName( Acb_Man_t * p ) { return p->pName; }
Acb_ManSpec(Acb_Man_t * p)135 static inline char * Acb_ManSpec( Acb_Man_t * p ) { return p->pSpec; }
Acb_ManNtkNum(Acb_Man_t * p)136 static inline int Acb_ManNtkNum( Acb_Man_t * p ) { return Vec_PtrSize(&p->vNtks)-1; }
Acb_ManNtkIsOk(Acb_Man_t * p,int i)137 static inline int Acb_ManNtkIsOk( Acb_Man_t * p, int i ) { return i > 0 && i <= Acb_ManNtkNum(p); }
Acb_ManNtk(Acb_Man_t * p,int i)138 static inline Acb_Ntk_t * Acb_ManNtk( Acb_Man_t * p, int i ) { return Acb_ManNtkIsOk(p, i) ? (Acb_Ntk_t *)Vec_PtrEntry(&p->vNtks, i) : NULL; }
Acb_ManNtkFindId(Acb_Man_t * p,char * pName)139 static inline int Acb_ManNtkFindId( Acb_Man_t * p, char * pName ) { return Abc_NamStrFind(p->pMods, pName); }
Acb_ManNtkFind(Acb_Man_t * p,char * pName)140 static inline Acb_Ntk_t * Acb_ManNtkFind( Acb_Man_t * p, char * pName ) { return Acb_ManNtk( p, Acb_ManNtkFindId(p, pName) ); }
Acb_ManRoot(Acb_Man_t * p)141 static inline Acb_Ntk_t * Acb_ManRoot( Acb_Man_t * p ) { return Acb_ManNtk(p, p->iRoot); }
Acb_ManStr(Acb_Man_t * p,int i)142 static inline char * Acb_ManStr( Acb_Man_t * p, int i ) { return Abc_NamStr(p->pStrs, i); }
Acb_ManStrId(Acb_Man_t * p,char * pStr)143 static inline int Acb_ManStrId( Acb_Man_t * p, char * pStr ) { return Abc_NamStrFind(p->pStrs, pStr); }
Acb_ManNameIdMax(Acb_Man_t * p)144 static inline int Acb_ManNameIdMax( Acb_Man_t * p ) { return Abc_NamObjNumMax(p->pStrs) + 1; }
Acb_ManConst(Acb_Man_t * p,int i)145 static inline char * Acb_ManConst( Acb_Man_t * p, int i ) { return Abc_NamStr(p->pFuns, i); }
Acb_ManConstId(Acb_Man_t * p,char * pStr)146 static inline int Acb_ManConstId( Acb_Man_t * p, char * pStr ) { return Abc_NamStrFind(p->pFuns, pStr); }
Acb_ManConstIdMax(Acb_Man_t * p)147 static inline int Acb_ManConstIdMax( Acb_Man_t * p ) { return Abc_NamObjNumMax(p->pFuns) + 1; }
148
Acb_NtkMan(Acb_Ntk_t * p)149 static inline Acb_Man_t * Acb_NtkMan( Acb_Ntk_t * p ) { return p->pDesign; }
Acb_NtkNtk(Acb_Ntk_t * p,int i)150 static inline Acb_Ntk_t * Acb_NtkNtk( Acb_Ntk_t * p, int i ) { return Acb_ManNtk(p->pDesign, i); }
Acb_NtkId(Acb_Ntk_t * p)151 static inline int Acb_NtkId( Acb_Ntk_t * p ) { return p->Id; }
Acb_NtkCi(Acb_Ntk_t * p,int i)152 static inline int Acb_NtkCi( Acb_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vCis, i); }
Acb_NtkCo(Acb_Ntk_t * p,int i)153 static inline int Acb_NtkCo( Acb_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vCos, i); }
Acb_NtkCioOrder(Acb_Ntk_t * p,int i)154 static inline int Acb_NtkCioOrder( Acb_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vOrder, i); }
Acb_NtkBoxSeq(Acb_Ntk_t * p,int i)155 static inline int Acb_NtkBoxSeq( Acb_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vSeq, i); }
Acb_NtkNam(Acb_Ntk_t * p)156 static inline Abc_Nam_t * Acb_NtkNam( Acb_Ntk_t * p ) { return p->pDesign->pStrs; }
Acb_NtkStr(Acb_Ntk_t * p,int i)157 static inline char * Acb_NtkStr( Acb_Ntk_t * p, int i ) { return Acb_ManStr(p->pDesign, i); }
Acb_NtkStrId(Acb_Ntk_t * p,char * pName)158 static inline int Acb_NtkStrId( Acb_Ntk_t * p, char * pName ) { return Acb_ManStrId(p->pDesign, pName); }
Acb_NtkConst(Acb_Ntk_t * p,int i)159 static inline char * Acb_NtkConst( Acb_Ntk_t * p, int i ) { return Acb_ManConst(p->pDesign, i); }
Acb_NtkSop(Acb_Ntk_t * p,int i)160 static inline char * Acb_NtkSop( Acb_Ntk_t * p, int i ) { return Acb_ManConst(p->pDesign, i); }
Acb_NtkNameId(Acb_Ntk_t * p)161 static inline int Acb_NtkNameId( Acb_Ntk_t * p ) { return p->NameId; }
Acb_NtkName(Acb_Ntk_t * p)162 static inline char * Acb_NtkName( Acb_Ntk_t * p ) { return Acb_NtkStr(p, p->NameId); }
Acb_NtkTypeName(Acb_Ntk_t * p,int Type)163 static inline char * Acb_NtkTypeName( Acb_Ntk_t * p, int Type ) { return p->pDesign->pTypeNames[Type]; }
Acb_NtkCopy(Acb_Ntk_t * p)164 static inline int Acb_NtkCopy( Acb_Ntk_t * p ) { return p->iCopy; }
Acb_NtkCopyNtk(Acb_Man_t * pNew,Acb_Ntk_t * p)165 static inline Acb_Ntk_t * Acb_NtkCopyNtk(Acb_Man_t * pNew, Acb_Ntk_t * p) { return Acb_ManNtk(pNew, Acb_NtkCopy(p)); }
Acb_NtkSetCopy(Acb_Ntk_t * p,int i)166 static inline void Acb_NtkSetCopy( Acb_Ntk_t * p, int i ) { assert(p->iCopy == 0); p->iCopy = i; }
Acb_NtkHashRange(Acb_Ntk_t * p,int l,int r)167 static inline int Acb_NtkHashRange( Acb_Ntk_t * p, int l, int r ) { return Hash_Int2ManInsert( p->pDesign->vHash, l, r, 0 ); }
Acb_NtkRangeLeft(Acb_Ntk_t * p,int h)168 static inline int Acb_NtkRangeLeft( Acb_Ntk_t * p, int h ) { return h ? Hash_IntObjData0( p->pDesign->vHash, h ) : 0; }
Acb_NtkRangeRight(Acb_Ntk_t * p,int h)169 static inline int Acb_NtkRangeRight( Acb_Ntk_t * p, int h ) { return h ? Hash_IntObjData1( p->pDesign->vHash, h ) : 0; }
Acb_NtkRangeSize(Acb_Ntk_t * p,int h)170 static inline int Acb_NtkRangeSize( Acb_Ntk_t * p, int h ) { int l = Acb_NtkRangeLeft(p, h), r = Acb_NtkRangeRight(p, h); return 1 + (l > r ? l-r : r-l);}
171
Acb_NtkCiNum(Acb_Ntk_t * p)172 static inline int Acb_NtkCiNum( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vCis); }
Acb_NtkCoNum(Acb_Ntk_t * p)173 static inline int Acb_NtkCoNum( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vCos); }
Acb_NtkCioNum(Acb_Ntk_t * p)174 static inline int Acb_NtkCioNum( Acb_Ntk_t * p ) { return Acb_NtkCiNum(p) + Acb_NtkCoNum(p); }
Acb_NtkCiNumAlloc(Acb_Ntk_t * p)175 static inline int Acb_NtkCiNumAlloc( Acb_Ntk_t * p ) { return Vec_IntCap(&p->vCis); }
Acb_NtkCoNumAlloc(Acb_Ntk_t * p)176 static inline int Acb_NtkCoNumAlloc( Acb_Ntk_t * p ) { return Vec_IntCap(&p->vCos); }
Acb_NtkRegNum(Acb_Ntk_t * p)177 static inline int Acb_NtkRegNum( Acb_Ntk_t * p ) { return p->nRegs; }
Acb_NtkSetRegNum(Acb_Ntk_t * p,int nRegs)178 static inline void Acb_NtkSetRegNum( Acb_Ntk_t * p, int nRegs ) { p->nRegs = nRegs; }
Acb_NtkPiNum(Acb_Ntk_t * p)179 static inline int Acb_NtkPiNum( Acb_Ntk_t * p ) { return Acb_NtkCiNum(p) - Acb_NtkRegNum(p); }
Acb_NtkPoNum(Acb_Ntk_t * p)180 static inline int Acb_NtkPoNum( Acb_Ntk_t * p ) { return Acb_NtkCoNum(p) - Acb_NtkRegNum(p); }
Acb_NtkCioOrderNum(Acb_Ntk_t * p)181 static inline int Acb_NtkCioOrderNum( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vOrder); }
Acb_NtkObjNumAlloc(Acb_Ntk_t * p)182 static inline int Acb_NtkObjNumAlloc( Acb_Ntk_t * p ) { return Vec_StrCap(&p->vObjType)-1; }
Acb_NtkObjNum(Acb_Ntk_t * p)183 static inline int Acb_NtkObjNum( Acb_Ntk_t * p ) { return Vec_StrSize(&p->vObjType)-1; }
Acb_NtkObjNumMax(Acb_Ntk_t * p)184 static inline int Acb_NtkObjNumMax( Acb_Ntk_t * p ) { return Vec_StrSize(&p->vObjType); }
Acb_NtkTypeNum(Acb_Ntk_t * p,int Type)185 static inline int Acb_NtkTypeNum( Acb_Ntk_t * p, int Type ) { return Vec_StrCountEntry(&p->vObjType, (char)Type); }
Acb_NtkBoxNum(Acb_Ntk_t * p)186 static inline int Acb_NtkBoxNum( Acb_Ntk_t * p ) { return Acb_NtkTypeNum(p, ABC_OPER_BOX); }
Acb_NtkNodeNum(Acb_Ntk_t * p)187 static inline int Acb_NtkNodeNum( Acb_Ntk_t * p ) { return Vec_StrCountLarger(&p->vObjType, (char)ABC_OPER_BOX); }
Acb_NtkSeqNum(Acb_Ntk_t * p)188 static inline int Acb_NtkSeqNum( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vSeq); }
189
Acb_NtkCleanObjCopies(Acb_Ntk_t * p)190 static inline void Acb_NtkCleanObjCopies( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjCopy, Vec_StrCap(&p->vObjType), -1); }
Acb_NtkCleanObjFuncs(Acb_Ntk_t * p)191 static inline void Acb_NtkCleanObjFuncs( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjFunc, Vec_StrCap(&p->vObjType), -1); }
Acb_NtkCleanObjWeights(Acb_Ntk_t * p)192 static inline void Acb_NtkCleanObjWeights( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjWeight,Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjTruths(Acb_Ntk_t * p)193 static inline void Acb_NtkCleanObjTruths( Acb_Ntk_t * p ) { Vec_WrdFill(&p->vObjTruth, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjNames(Acb_Ntk_t * p)194 static inline void Acb_NtkCleanObjNames( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjName, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjRanges(Acb_Ntk_t * p)195 static inline void Acb_NtkCleanObjRanges( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjRange, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjTravs(Acb_Ntk_t * p)196 static inline void Acb_NtkCleanObjTravs( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjTrav, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjAttrs(Acb_Ntk_t * p)197 static inline void Acb_NtkCleanObjAttrs( Acb_Ntk_t * p ) { Vec_IntFill(&p->vObjAttr, Vec_StrCap(&p->vObjType), 0); Vec_IntFill(&p->vAttrSto, 1, -1); }
Acb_NtkCleanObjLevelD(Acb_Ntk_t * p)198 static inline void Acb_NtkCleanObjLevelD( Acb_Ntk_t * p ) { Vec_IntFill(&p->vLevelD, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjLevelR(Acb_Ntk_t * p)199 static inline void Acb_NtkCleanObjLevelR( Acb_Ntk_t * p ) { Vec_IntFill(&p->vLevelR, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjPathD(Acb_Ntk_t * p)200 static inline void Acb_NtkCleanObjPathD( Acb_Ntk_t * p ) { Vec_IntFill(&p->vPathD, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjPathR(Acb_Ntk_t * p)201 static inline void Acb_NtkCleanObjPathR( Acb_Ntk_t * p ) { Vec_IntFill(&p->vPathR, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjCounts(Acb_Ntk_t * p)202 static inline void Acb_NtkCleanObjCounts( Acb_Ntk_t * p ) { Vec_FltFill(&p->vCounts, Vec_StrCap(&p->vObjType), 0); }
Acb_NtkCleanObjFanout(Acb_Ntk_t * p)203 static inline void Acb_NtkCleanObjFanout( Acb_Ntk_t * p ) { Vec_WecInit(&p->vFanouts, Vec_StrCap(&p->vObjType) ); }
Acb_NtkCleanObjCnfs(Acb_Ntk_t * p)204 static inline void Acb_NtkCleanObjCnfs( Acb_Ntk_t * p ) { Vec_WecInit(&p->vCnfs, Vec_StrCap(&p->vObjType) ); }
205
Acb_NtkHasObjCopies(Acb_Ntk_t * p)206 static inline int Acb_NtkHasObjCopies( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjCopy) > 0; }
Acb_NtkHasObjFuncs(Acb_Ntk_t * p)207 static inline int Acb_NtkHasObjFuncs( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjFunc) > 0; }
Acb_NtkHasObjWeights(Acb_Ntk_t * p)208 static inline int Acb_NtkHasObjWeights( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjWeight)> 0; }
Acb_NtkHasObjTruths(Acb_Ntk_t * p)209 static inline int Acb_NtkHasObjTruths( Acb_Ntk_t * p ) { return Vec_WrdSize(&p->vObjTruth) > 0; }
Acb_NtkHasObjNames(Acb_Ntk_t * p)210 static inline int Acb_NtkHasObjNames( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjName) > 0; }
Acb_NtkHasObjRanges(Acb_Ntk_t * p)211 static inline int Acb_NtkHasObjRanges( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjRange) > 0; }
Acb_NtkHasObjTravs(Acb_Ntk_t * p)212 static inline int Acb_NtkHasObjTravs( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjTrav) > 0; }
Acb_NtkHasObjAttrs(Acb_Ntk_t * p)213 static inline int Acb_NtkHasObjAttrs( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vObjAttr) > 0; }
Acb_NtkHasObjLevelD(Acb_Ntk_t * p)214 static inline int Acb_NtkHasObjLevelD( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vLevelD) > 0; }
Acb_NtkHasObjLevelR(Acb_Ntk_t * p)215 static inline int Acb_NtkHasObjLevelR( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vLevelR) > 0; }
Acb_NtkHasObjPathD(Acb_Ntk_t * p)216 static inline int Acb_NtkHasObjPathD( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vPathD) > 0; }
Acb_NtkHasObjPathR(Acb_Ntk_t * p)217 static inline int Acb_NtkHasObjPathR( Acb_Ntk_t * p ) { return Vec_IntSize(&p->vPathR) > 0; }
Acb_NtkHasObjCounts(Acb_Ntk_t * p)218 static inline int Acb_NtkHasObjCounts( Acb_Ntk_t * p ) { return Vec_FltSize(&p->vCounts) > 0; }
Acb_NtkHasObjFanout(Acb_Ntk_t * p)219 static inline int Acb_NtkHasObjFanout( Acb_Ntk_t * p ) { return Vec_WecSize(&p->vFanouts) > 0; }
Acb_NtkHasObjCnfs(Acb_Ntk_t * p)220 static inline int Acb_NtkHasObjCnfs( Acb_Ntk_t * p ) { return Vec_WecSize(&p->vCnfs) > 0; }
221
Acb_NtkFreeObjCopies(Acb_Ntk_t * p)222 static inline void Acb_NtkFreeObjCopies( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjCopy); }
Acb_NtkFreeObjFuncs(Acb_Ntk_t * p)223 static inline void Acb_NtkFreeObjFuncs( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjFunc); }
Acb_NtkFreeObjWeights(Acb_Ntk_t * p)224 static inline void Acb_NtkFreeObjWeights( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjWeight); }
Acb_NtkFreeObjTruths(Acb_Ntk_t * p)225 static inline void Acb_NtkFreeObjTruths( Acb_Ntk_t * p ) { Vec_WrdErase(&p->vObjTruth); }
Acb_NtkFreeObjNames(Acb_Ntk_t * p)226 static inline void Acb_NtkFreeObjNames( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjName); }
Acb_NtkFreeObjRanges(Acb_Ntk_t * p)227 static inline void Acb_NtkFreeObjRanges( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjRange); }
Acb_NtkFreeObjTravs(Acb_Ntk_t * p)228 static inline void Acb_NtkFreeObjTravs( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjTrav); }
Acb_NtkFreeObjAttrs(Acb_Ntk_t * p)229 static inline void Acb_NtkFreeObjAttrs( Acb_Ntk_t * p ) { Vec_IntErase(&p->vObjAttr); }
Acb_NtkFreeObjLevelD(Acb_Ntk_t * p)230 static inline void Acb_NtkFreeObjLevelD( Acb_Ntk_t * p ) { Vec_IntErase(&p->vLevelD); }
Acb_NtkFreeObjLevelR(Acb_Ntk_t * p)231 static inline void Acb_NtkFreeObjLevelR( Acb_Ntk_t * p ) { Vec_IntErase(&p->vLevelR); }
Acb_NtkFreeObjPathD(Acb_Ntk_t * p)232 static inline void Acb_NtkFreeObjPathD( Acb_Ntk_t * p ) { Vec_IntErase(&p->vPathD); }
Acb_NtkFreeObjPathR(Acb_Ntk_t * p)233 static inline void Acb_NtkFreeObjPathR( Acb_Ntk_t * p ) { Vec_IntErase(&p->vPathR); }
Acb_NtkFreeObjCounts(Acb_Ntk_t * p)234 static inline void Acb_NtkFreeObjCounts( Acb_Ntk_t * p ) { Vec_FltErase(&p->vCounts); }
Acb_NtkFreeObjFanout(Acb_Ntk_t * p)235 static inline void Acb_NtkFreeObjFanout( Acb_Ntk_t * p ) { Vec_WecErase(&p->vFanouts); }
Acb_NtkFreeObjCnfs(Acb_Ntk_t * p)236 static inline void Acb_NtkFreeObjCnfs( Acb_Ntk_t * p ) { Vec_WecErase(&p->vCnfs); }
237
Acb_ObjType(Acb_Ntk_t * p,int i)238 static inline Acb_ObjType_t Acb_ObjType( Acb_Ntk_t * p, int i ) { assert(i>0); return (Acb_ObjType_t)(int)(unsigned char)Vec_StrEntry(&p->vObjType, i); }
Acb_ObjCleanType(Acb_Ntk_t * p,int i)239 static inline void Acb_ObjCleanType( Acb_Ntk_t * p, int i ) { assert(i>0); Vec_StrWriteEntry( &p->vObjType, i, (char)ABC_OPER_NONE ); }
Acb_TypeIsSeq(Acb_ObjType_t Type)240 static inline int Acb_TypeIsSeq( Acb_ObjType_t Type ) { return Type >= ABC_OPER_RAM && Type <= ABC_OPER_DFFLAST; }
Acb_TypeIsUnary(Acb_ObjType_t Type)241 static inline int Acb_TypeIsUnary( Acb_ObjType_t Type ) { return Type == ABC_OPER_BIT_BUF || Type == ABC_OPER_BIT_INV || Type == ABC_OPER_LOGIC_NOT || Type == ABC_OPER_ARI_MIN || Type == ABC_OPER_ARI_SQRT || Type == ABC_OPER_ARI_ABS || (Type >= ABC_OPER_RED_AND && Type <= ABC_OPER_RED_NXOR); }
Acb_TypeIsMux(Acb_ObjType_t Type)242 static inline int Acb_TypeIsMux( Acb_ObjType_t Type ) { return Type == ABC_OPER_BIT_MUX || Type == ABC_OPER_SEL_NMUX || Type == ABC_OPER_SEL_SEL || Type == ABC_OPER_SEL_PSEL; }
243
Acb_ObjIsCi(Acb_Ntk_t * p,int i)244 static inline int Acb_ObjIsCi( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_CI; }
Acb_ObjIsCo(Acb_Ntk_t * p,int i)245 static inline int Acb_ObjIsCo( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_CO; }
Acb_ObjIsCio(Acb_Ntk_t * p,int i)246 static inline int Acb_ObjIsCio( Acb_Ntk_t * p, int i ) { return Acb_ObjIsCi(p, i) || Acb_ObjIsCo(p, i); }
Acb_ObjIsFon(Acb_Ntk_t * p,int i)247 static inline int Acb_ObjIsFon( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_FON; }
Acb_ObjIsBox(Acb_Ntk_t * p,int i)248 static inline int Acb_ObjIsBox( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_BOX; }
Acb_ObjIsGate(Acb_Ntk_t * p,int i)249 static inline int Acb_ObjIsGate( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_GATE; }
Acb_ObjIsSlice(Acb_Ntk_t * p,int i)250 static inline int Acb_ObjIsSlice( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_SLICE; }
Acb_ObjIsConcat(Acb_Ntk_t * p,int i)251 static inline int Acb_ObjIsConcat( Acb_Ntk_t * p, int i ) { return Acb_ObjType(p, i) == ABC_OPER_CONCAT; }
Acb_ObjIsUnary(Acb_Ntk_t * p,int i)252 static inline int Acb_ObjIsUnary( Acb_Ntk_t * p, int i ) { return Acb_TypeIsUnary(Acb_ObjType(p, i)); }
253
Acb_ObjFanOffset(Acb_Ntk_t * p,int i)254 static inline int Acb_ObjFanOffset( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vObjFans, i); }
Acb_ObjFanins(Acb_Ntk_t * p,int i)255 static inline int * Acb_ObjFanins( Acb_Ntk_t * p, int i ) { return Vec_IntEntryP(&p->vFanSto, Acb_ObjFanOffset(p, i)); }
Acb_ObjFanin(Acb_Ntk_t * p,int i,int k)256 static inline int Acb_ObjFanin( Acb_Ntk_t * p, int i, int k ) { return Acb_ObjFanins(p, i)[k+1]; }
Acb_ObjFaninNum(Acb_Ntk_t * p,int i)257 static inline int Acb_ObjFaninNum( Acb_Ntk_t * p, int i ) { return Acb_ObjFanins(p, i)[0]; }
Acb_ObjFanoutNum(Acb_Ntk_t * p,int i)258 static inline int Acb_ObjFanoutNum( Acb_Ntk_t * p, int i ) { return Vec_IntSize( Vec_WecEntry(&p->vFanouts, i) ); }
Acb_ObjFanoutVec(Acb_Ntk_t * p,int i)259 static inline Vec_Int_t * Acb_ObjFanoutVec( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_WecEntry( &p->vFanouts, i ); }
Acb_ObjFanout(Acb_Ntk_t * p,int i,int k)260 static inline int Acb_ObjFanout( Acb_Ntk_t * p, int i, int k ) { return Vec_IntEntry( Acb_ObjFanoutVec(p, i), k ); }
Acb_ObjFanin0(Acb_Ntk_t * p,int i)261 static inline int Acb_ObjFanin0( Acb_Ntk_t * p, int i ) { return Acb_ObjFanins(p, i)[1]; }
Acb_ObjCioId(Acb_Ntk_t * p,int i)262 static inline int Acb_ObjCioId( Acb_Ntk_t * p, int i ) { return Acb_ObjFanins(p, i)[2]; }
263
Acb_ObjCopy(Acb_Ntk_t * p,int i)264 static inline int Acb_ObjCopy( Acb_Ntk_t * p, int i ) { assert(i>0); assert( Acb_NtkHasObjCopies(p) ); return Vec_IntEntry(&p->vObjCopy, i); }
Acb_ObjFunc(Acb_Ntk_t * p,int i)265 static inline int Acb_ObjFunc( Acb_Ntk_t * p, int i ) { assert(i>0); assert( Acb_NtkHasObjFuncs(p) ); return Vec_IntEntry(&p->vObjFunc, i); }
Acb_ObjWeight(Acb_Ntk_t * p,int i)266 static inline int Acb_ObjWeight( Acb_Ntk_t * p, int i ) { assert(i>0); assert( Acb_NtkHasObjWeights(p) );return Vec_IntEntry(&p->vObjWeight, i); }
Acb_ObjTruth(Acb_Ntk_t * p,int i)267 static inline word Acb_ObjTruth( Acb_Ntk_t * p, int i ) { assert(i>0); assert( Acb_NtkHasObjTruths(p) ); return Vec_WrdEntry(&p->vObjTruth, i); }
Acb_ObjTruthP(Acb_Ntk_t * p,int i)268 static inline word * Acb_ObjTruthP( Acb_Ntk_t * p, int i ) { assert(i>0); assert( Acb_NtkHasObjTruths(p) ); return Vec_WrdEntryP(&p->vObjTruth, i); }
Acb_ObjName(Acb_Ntk_t * p,int i)269 static inline int Acb_ObjName( Acb_Ntk_t * p, int i ) { assert(i>0); assert( Acb_NtkHasObjNames(p) ); return Vec_IntEntry(&p->vObjName, i); }
Acb_ObjNameStr(Acb_Ntk_t * p,int i)270 static inline char * Acb_ObjNameStr( Acb_Ntk_t * p, int i ) { assert(i>0); return Acb_NtkStr(p, Acb_ObjName(p, i)); }
Acb_ObjAttr(Acb_Ntk_t * p,int i)271 static inline int Acb_ObjAttr( Acb_Ntk_t * p, int i ) { assert(i>=0); return Acb_NtkHasObjAttrs(p) ? Vec_IntEntry(&p->vObjAttr, i) : 0; }
Acb_ObjAttrSize(Acb_Ntk_t * p,int i)272 static inline int Acb_ObjAttrSize( Acb_Ntk_t * p, int i ) { assert(i>=0); return Acb_ObjAttr(p, i) ? Vec_IntEntry(&p->vAttrSto, Acb_ObjAttr(p, i)) : 0; }
Acb_ObjAttrArray(Acb_Ntk_t * p,int i)273 static inline int * Acb_ObjAttrArray( Acb_Ntk_t * p, int i ) { assert(i>=0); return Acb_ObjAttr(p, i) ? Vec_IntEntryP(&p->vAttrSto, Acb_ObjAttr(p, i)+1) : NULL; }
Acb_ObjAttrValue(Acb_Ntk_t * p,int i,int x)274 static inline int Acb_ObjAttrValue( Acb_Ntk_t * p, int i, int x ) { int k, s = Acb_ObjAttrSize(p, i), * a = Acb_ObjAttrArray(p, i); for ( k = 0; k < s; k += 2) if (a[k] == x) return a[k+1]; return 0; }
Acb_ObjLevelD(Acb_Ntk_t * p,int i)275 static inline int Acb_ObjLevelD( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vLevelD, i); }
Acb_ObjLevelR(Acb_Ntk_t * p,int i)276 static inline int Acb_ObjLevelR( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vLevelR, i); }
Acb_ObjPathD(Acb_Ntk_t * p,int i)277 static inline int Acb_ObjPathD( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vPathD, i); }
Acb_ObjPathR(Acb_Ntk_t * p,int i)278 static inline int Acb_ObjPathR( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_IntEntry(&p->vPathR, i); }
Acb_ObjCounts(Acb_Ntk_t * p,int i)279 static inline float Acb_ObjCounts( Acb_Ntk_t * p, int i ) { assert(i>0); return Vec_FltEntry(&p->vCounts, i); }
Acb_ObjCnfs(Acb_Ntk_t * p,int i)280 static inline Vec_Str_t * Acb_ObjCnfs( Acb_Ntk_t * p, int i ) { assert(i>0); return (Vec_Str_t *)Vec_WecEntry(&p->vCnfs, i); }
281
Acb_ObjSetCopy(Acb_Ntk_t * p,int i,int x)282 static inline void Acb_ObjSetCopy( Acb_Ntk_t * p, int i, int x ) { assert(Acb_ObjCopy(p, i) == -1); Vec_IntWriteEntry( &p->vObjCopy, i, x ); }
Acb_ObjSetFunc(Acb_Ntk_t * p,int i,int x)283 static inline void Acb_ObjSetFunc( Acb_Ntk_t * p, int i, int x ) { assert(Acb_ObjFunc(p, i) == -1); Vec_IntWriteEntry( &p->vObjFunc, i, x ); }
Acb_ObjSetWeight(Acb_Ntk_t * p,int i,int x)284 static inline void Acb_ObjSetWeight( Acb_Ntk_t * p, int i, int x ) { assert(Acb_ObjWeight(p, i)== 0); Vec_IntWriteEntry( &p->vObjWeight, i, x ); }
Acb_ObjSetTruth(Acb_Ntk_t * p,int i,word x)285 static inline void Acb_ObjSetTruth( Acb_Ntk_t * p, int i, word x ) { assert(Acb_ObjTruth(p, i) == 0); Vec_WrdWriteEntry( &p->vObjTruth, i, x ); }
Acb_ObjSetName(Acb_Ntk_t * p,int i,int x)286 static inline void Acb_ObjSetName( Acb_Ntk_t * p, int i, int x ) { assert(Acb_ObjName(p, i) == 0); Vec_IntWriteEntry( &p->vObjName, i, x ); }
Acb_ObjSetAttrs(Acb_Ntk_t * p,int i,int * a,int s)287 static inline void Acb_ObjSetAttrs( Acb_Ntk_t * p, int i, int * a, int s ) { assert(Acb_ObjAttr(p, i) == 0); if ( !a ) return; Vec_IntWriteEntry(&p->vObjAttr, i, Vec_IntSize(&p->vAttrSto)); Vec_IntPush(&p->vAttrSto, s); Vec_IntPushArray(&p->vAttrSto, a, s); }
Acb_ObjSetLevelD(Acb_Ntk_t * p,int i,int x)288 static inline int Acb_ObjSetLevelD( Acb_Ntk_t * p, int i, int x ) { Vec_IntWriteEntry( &p->vLevelD, i, x ); return x; }
Acb_ObjSetLevelR(Acb_Ntk_t * p,int i,int x)289 static inline int Acb_ObjSetLevelR( Acb_Ntk_t * p, int i, int x ) { Vec_IntWriteEntry( &p->vLevelR, i, x ); return x; }
Acb_ObjSetPathD(Acb_Ntk_t * p,int i,int x)290 static inline int Acb_ObjSetPathD( Acb_Ntk_t * p, int i, int x ) { Vec_IntWriteEntry( &p->vPathD, i, x ); return x; }
Acb_ObjSetPathR(Acb_Ntk_t * p,int i,int x)291 static inline int Acb_ObjSetPathR( Acb_Ntk_t * p, int i, int x ) { Vec_IntWriteEntry( &p->vPathR, i, x ); return x; }
Acb_ObjSetCounts(Acb_Ntk_t * p,int i,float x)292 static inline float Acb_ObjSetCounts( Acb_Ntk_t * p, int i, float x ) { Vec_FltWriteEntry( &p->vCounts, i, x ); return x; }
Acb_ObjUpdateLevelD(Acb_Ntk_t * p,int i,int x)293 static inline int Acb_ObjUpdateLevelD( Acb_Ntk_t * p, int i, int x ) { Vec_IntUpdateEntry( &p->vLevelD, i, x ); return x; }
Acb_ObjUpdateLevelR(Acb_Ntk_t * p,int i,int x)294 static inline int Acb_ObjUpdateLevelR( Acb_Ntk_t * p, int i, int x ) { Vec_IntUpdateEntry( &p->vLevelR, i, x ); return x; }
Acb_ObjAddToPathD(Acb_Ntk_t * p,int i,int x)295 static inline int Acb_ObjAddToPathD( Acb_Ntk_t * p, int i, int x ) { Vec_IntAddToEntry( &p->vPathD, i, x ); return x; }
Acb_ObjAddToPathR(Acb_Ntk_t * p,int i,int x)296 static inline int Acb_ObjAddToPathR( Acb_Ntk_t * p, int i, int x ) { Vec_IntAddToEntry( &p->vPathR, i, x ); return x; }
297
Acb_ObjNtkId(Acb_Ntk_t * p,int i)298 static inline int Acb_ObjNtkId( Acb_Ntk_t * p, int i ) { assert(i>0); return Acb_ObjIsBox(p, i) ? Acb_ObjFanin(p, i, Acb_ObjFaninNum(p, i)) : 0; }
Acb_ObjNtk(Acb_Ntk_t * p,int i)299 static inline Acb_Ntk_t * Acb_ObjNtk( Acb_Ntk_t * p, int i ) { assert(i>0); return Acb_NtkNtk(p, Acb_ObjNtkId(p, i)); }
Acb_ObjIsSeq(Acb_Ntk_t * p,int i)300 static inline int Acb_ObjIsSeq( Acb_Ntk_t * p, int i ) { assert(i>0); return Acb_ObjIsBox(p, i) ? Acb_ObjNtk(p, i)->fSeq : Acb_TypeIsSeq(Acb_ObjType(p, i)); }
301
Acb_ObjRangeId(Acb_Ntk_t * p,int i)302 static inline int Acb_ObjRangeId( Acb_Ntk_t * p, int i ) { return Acb_NtkHasObjRanges(p) ? Vec_IntEntry(&p->vObjRange, i) : 0; }
Acb_ObjRange(Acb_Ntk_t * p,int i)303 static inline int Acb_ObjRange( Acb_Ntk_t * p, int i ) { return Abc_Lit2Var( Acb_ObjRangeId(p, i) ); }
Acb_ObjLeft(Acb_Ntk_t * p,int i)304 static inline int Acb_ObjLeft( Acb_Ntk_t * p, int i ) { return Acb_NtkRangeLeft(p, Acb_ObjRange(p, i)); }
Acb_ObjRight(Acb_Ntk_t * p,int i)305 static inline int Acb_ObjRight( Acb_Ntk_t * p, int i ) { return Acb_NtkRangeRight(p, Acb_ObjRange(p, i)); }
Acb_ObjSigned(Acb_Ntk_t * p,int i)306 static inline int Acb_ObjSigned( Acb_Ntk_t * p, int i ) { return Abc_LitIsCompl(Acb_ObjRangeId(p, i)); }
Acb_ObjRangeSize(Acb_Ntk_t * p,int i)307 static inline int Acb_ObjRangeSize( Acb_Ntk_t * p, int i ) { return Acb_NtkRangeSize(p, Acb_ObjRange(p, i)); }
Acb_ObjSetRangeSign(Acb_Ntk_t * p,int i,int x)308 static inline void Acb_ObjSetRangeSign( Acb_Ntk_t * p, int i, int x ) { assert(Acb_NtkHasObjRanges(p)); Vec_IntWriteEntry(&p->vObjRange, i, x); }
Acb_ObjSetRange(Acb_Ntk_t * p,int i,int x)309 static inline void Acb_ObjSetRange( Acb_Ntk_t * p, int i, int x ) { assert(Acb_NtkHasObjRanges(p)); Vec_IntWriteEntry(&p->vObjRange, i, Abc_Var2Lit(x,0)); }
Acb_ObjHashRange(Acb_Ntk_t * p,int i,int l,int r)310 static inline void Acb_ObjHashRange( Acb_Ntk_t * p, int i, int l, int r ) { Acb_ObjSetRange( p, i, Acb_NtkHashRange(p, l, r) ); }
Acb_ObjRangeSign(Acb_Ntk_t * p,int i)311 static inline int Acb_ObjRangeSign( Acb_Ntk_t * p, int i ) { return Abc_Var2Lit( Acb_ObjRangeSize(p, i), Acb_ObjSigned(p, i) ); }
312
Acb_ObjTravId(Acb_Ntk_t * p,int i)313 static inline int Acb_ObjTravId( Acb_Ntk_t * p, int i ) { return Vec_IntEntry(&p->vObjTrav, i); }
Acb_ObjTravIdDiff(Acb_Ntk_t * p,int i)314 static inline int Acb_ObjTravIdDiff( Acb_Ntk_t * p, int i ) { return p->nObjTravs - Vec_IntEntry(&p->vObjTrav, i); }
Acb_ObjIsTravIdCur(Acb_Ntk_t * p,int i)315 static inline int Acb_ObjIsTravIdCur( Acb_Ntk_t * p, int i ) { return Acb_ObjTravId(p, i) == p->nObjTravs; }
Acb_ObjIsTravIdPrev(Acb_Ntk_t * p,int i)316 static inline int Acb_ObjIsTravIdPrev( Acb_Ntk_t * p, int i ) { return Acb_ObjTravId(p, i) == p->nObjTravs-1; }
Acb_ObjIsTravIdDiff(Acb_Ntk_t * p,int i,int d)317 static inline int Acb_ObjIsTravIdDiff( Acb_Ntk_t * p, int i, int d ) { return Acb_ObjTravId(p, i) == p->nObjTravs-d; }
Acb_ObjSetTravIdCur(Acb_Ntk_t * p,int i)318 static inline int Acb_ObjSetTravIdCur( Acb_Ntk_t * p, int i ) { int r = Acb_ObjIsTravIdCur(p, i); Vec_IntWriteEntry(&p->vObjTrav, i, p->nObjTravs); return r; }
Acb_ObjSetTravIdPrev(Acb_Ntk_t * p,int i)319 static inline int Acb_ObjSetTravIdPrev( Acb_Ntk_t * p, int i ) { int r = Acb_ObjIsTravIdPrev(p, i); Vec_IntWriteEntry(&p->vObjTrav, i, p->nObjTravs-1); return r; }
Acb_ObjSetTravIdDiff(Acb_Ntk_t * p,int i,int d)320 static inline int Acb_ObjSetTravIdDiff( Acb_Ntk_t * p, int i, int d ) { int r = Acb_ObjTravIdDiff(p, i); Vec_IntWriteEntry(&p->vObjTrav, i, p->nObjTravs-d); return r; }
Acb_NtkTravId(Acb_Ntk_t * p)321 static inline int Acb_NtkTravId( Acb_Ntk_t * p ) { return p->nObjTravs; }
Acb_NtkIncTravId(Acb_Ntk_t * p)322 static inline void Acb_NtkIncTravId( Acb_Ntk_t * p ) { if ( !Acb_NtkHasObjTravs(p) ) Acb_NtkCleanObjTravs(p); p->nObjTravs++; }
323
324 ////////////////////////////////////////////////////////////////////////
325 /// ITERATORS ///
326 ////////////////////////////////////////////////////////////////////////
327
328 #define Acb_ManForEachNtk( p, pNtk, i ) \
329 for ( i = 1; (i <= Acb_ManNtkNum(p)) && (((pNtk) = Acb_ManNtk(p, i)), 1); i++ )
330
331 #define Acb_NtkForEachPi( p, iObj, i ) \
332 for ( i = 0; (i < Acb_NtkPiNum(p)) && (((iObj) = Acb_NtkCi(p, i)), 1); i++ )
333 #define Acb_NtkForEachPo( p, iObj, i ) \
334 for ( i = 0; (i < Acb_NtkPoNum(p)) && (((iObj) = Acb_NtkCo(p, i)), 1); i++ )
335
336 #define Acb_NtkForEachCi( p, iObj, i ) \
337 for ( i = 0; (i < Acb_NtkCiNum(p)) && (((iObj) = Acb_NtkCi(p, i)), 1); i++ )
338 #define Acb_NtkForEachCo( p, iObj, i ) \
339 for ( i = 0; (i < Acb_NtkCoNum(p)) && (((iObj) = Acb_NtkCo(p, i)), 1); i++ )
340 #define Acb_NtkForEachCoDriver( p, iObj, i ) \
341 for ( i = 0; (i < Acb_NtkCoNum(p)) && (((iObj) = Acb_ObjFanin(p, Acb_NtkCo(p, i), 0)), 1); i++ )
342 #define Acb_NtkForEachCoAndDriver( p, iObj, iDriver, i ) \
343 for ( i = 0; (i < Acb_NtkCoNum(p)) && (((iObj) = Acb_NtkCo(p, i)), 1) && (((iDriver) = Acb_ObjFanin(p, iObj, 0)), 1); i++ )
344
345 #define Acb_NtkForEachCiVec( vVec, p, iObj, i ) \
346 for ( i = 0; (i < Vec_IntSize(vVec)) && (((iObj) = Acb_NtkCi(p, Vec_IntEntry(vVec,i))), 1); i++ )
347 #define Acb_NtkForEachCoVec( vVec, p, iObj, i ) \
348 for ( i = 0; (i < Vec_IntSize(vVec)) && (((iObj) = Acb_NtkCo(p, Vec_IntEntry(vVec,i))), 1); i++ )
349 #define Acb_NtkForEachCoDriverVec( vVec, p, iObj, i ) \
350 for ( i = 0; (i < Vec_IntSize(vVec)) && (((iObj) = Acb_ObjFanin(p, Acb_NtkCo(p, Vec_IntEntry(vVec,i)), 0)), 1); i++ )
351
352 #define Acb_NtkForEachBoxSeq( p, iObj, i ) \
353 for ( i = 0; (i < Acb_NtkSeqNum(p)) && (((iObj) = Acb_NtkBoxSeq(p, i)), 1); i++ )
354 #define Acb_NtkForEachCioOrder( p, iObj, i ) \
355 for ( i = 0; (i < Acb_NtkCioOrderNum(p)) && (((iObj) = Acb_NtkCioOrder(p, i)), 1); i++ )
356
357
358 #define Acb_NtkForEachObj( p, i ) \
359 for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Acb_ObjType(p, i) ) {} else
360 #define Acb_NtkForEachObjReverse( p, i ) \
361 for ( i = Vec_StrSize(&p->vObjType)-1; i > 0; i-- ) if ( !Acb_ObjType(p, i) ) {} else
362 #define Acb_NtkForEachNode( p, i ) \
363 for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Acb_ObjType(p, i) || Acb_ObjIsCio(p, i) ) {} else
364 #define Acb_NtkForEachNodeSupp( p, i, nSuppSize ) \
365 for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Acb_ObjType(p, i) || Acb_ObjIsCio(p, i) || Acb_ObjFaninNum(p, i) != nSuppSize ) {} else
366 #define Acb_NtkForEachNodeReverse( p, i ) \
367 for ( i = Vec_StrSize(&p->vObjType)-1; i > 0; i-- ) if ( !Acb_ObjType(p, i) || Acb_ObjIsCio(p, i) ) {} else
368 #define Acb_NtkForEachObjType( p, Type, i ) \
369 for ( i = 1; i < Vec_StrSize(&p->vObjType) && (((Type) = Acb_ObjType(p, i)), 1); i++ ) if ( !Type ) {} else
370 #define Acb_NtkForEachBox( p, i ) \
371 for ( i = 1; i < Vec_StrSize(&p->vObjType); i++ ) if ( !Acb_ObjIsBox(p, i) ) {} else
372
373 #define Acb_ObjForEachFanin( p, iObj, iFanin, k ) \
374 for ( k = 0; k < Acb_ObjFaninNum(p, iObj) && ((iFanin = Acb_ObjFanin(p, iObj, k)), 1); k++ )
375 #define Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k ) \
376 for ( k = 0, pFanins = Acb_ObjFanins(p, iObj); k < pFanins[0] && ((iFanin = pFanins[k+1]), 1); k++ )
377
378 #define Acb_ObjForEachFanout( p, iObj, iFanout, k ) \
379 Vec_IntForEachEntry( Vec_WecEntry(&p->vFanouts, iObj), iFanout, k ) if ( !Acb_ObjType(p, iFanout) ) {} else
380
381 #define Acb_ObjForEachFon( p, iObj, iFon ) \
382 for ( assert(Acb_ObjIsBox(p, iObj)), iFon = iObj + 1; iFon < Acb_NtkObjNum(p) && Acb_ObjIsFon(p, iFon); iFon++ )
383
384 ////////////////////////////////////////////////////////////////////////
385 /// FUNCTION DECLARATIONS ///
386 ////////////////////////////////////////////////////////////////////////
387
388 /**Function*************************************************************
389
390 Synopsis [Object APIs.]
391
392 Description []
393
394 SideEffects []
395
396 SeeAlso []
397
398 ***********************************************************************/
Acb_ObjFonNum(Acb_Ntk_t * p,int iObj)399 static inline int Acb_ObjFonNum( Acb_Ntk_t * p, int iObj )
400 {
401 int i, Count = 0;
402 if ( !Acb_ObjIsBox(p, iObj) )
403 return 0;
404 Acb_ObjForEachFon( p, iObj, i )
405 Count++;
406 return Count;
407 }
Acb_ObjWhatFanin(Acb_Ntk_t * p,int iObj,int iFaninGiven)408 static inline int Acb_ObjWhatFanin( Acb_Ntk_t * p, int iObj, int iFaninGiven )
409 {
410 int k, iFanin, * pFanins;
411 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
412 if ( iFanin == iFaninGiven )
413 return k;
414 return -1;
415 }
Acb_ObjAddFanin(Acb_Ntk_t * p,int iObj,int iFanin)416 static inline void Acb_ObjAddFanin( Acb_Ntk_t * p, int iObj, int iFanin )
417 {
418 int * pFanins = Acb_ObjFanins( p, iObj );
419 assert( iFanin > 0 );
420 assert( pFanins[ 1 + pFanins[0] ] == -1 );
421 pFanins[ 1 + pFanins[0]++ ] = iFanin;
422 }
Acb_ObjDeleteFaninIndex(Acb_Ntk_t * p,int iObj,int iFaninIndex)423 static inline void Acb_ObjDeleteFaninIndex( Acb_Ntk_t * p, int iObj, int iFaninIndex )
424 {
425 int i, * pFanins = Acb_ObjFanins( p, iObj );
426 pFanins[0]--;
427 for ( i = iFaninIndex; i < pFanins[0]; i++ )
428 pFanins[ 1 + i ] = pFanins[ 2 + i ];
429 pFanins[ 1 + pFanins[0] ] = -1;
430 }
Acb_ObjDeleteFanin(Acb_Ntk_t * p,int iObj,int iFanin)431 static inline void Acb_ObjDeleteFanin( Acb_Ntk_t * p, int iObj, int iFanin )
432 {
433 int * pFanins = Acb_ObjFanins( p, iObj );
434 int iFaninIndex = Acb_ObjWhatFanin( p, iObj, iFanin );
435 assert( pFanins[ 1 + iFaninIndex ] == iFanin );
436 Acb_ObjDeleteFaninIndex( p, iObj, iFaninIndex );
437 }
Acb_ObjAddFanins(Acb_Ntk_t * p,int iObj,Vec_Int_t * vFanins)438 static inline void Acb_ObjAddFanins( Acb_Ntk_t * p, int iObj, Vec_Int_t * vFanins )
439 {
440 int i, iFanin;
441 if ( vFanins )
442 Vec_IntForEachEntry( vFanins, iFanin, i )
443 Acb_ObjAddFanin( p, iObj, iFanin );
444 }
Acb_ObjSetNtkId(Acb_Ntk_t * p,int iObj,int iNtk)445 static inline void Acb_ObjSetNtkId( Acb_Ntk_t * p, int iObj, int iNtk ) // should be called after fanins are added
446 {
447 int * pFanins = Acb_ObjFanins( p, iObj );
448 assert( pFanins[ 1 + pFanins[0] ] == -1 );
449 pFanins[ 1 + pFanins[0] ] = iNtk;
450 }
Acb_ObjRemoveFanins(Acb_Ntk_t * p,int iObj)451 static inline void Acb_ObjRemoveFanins( Acb_Ntk_t * p, int iObj )
452 {
453 int i, * pFanins = Acb_ObjFanins( p, iObj );
454 for ( i = 1; i <= pFanins[0]; i++ )
455 {
456 assert( pFanins[i] > 0 );
457 pFanins[i] = -1;
458 }
459 pFanins[0] = 0;
460 }
Acb_ObjAlloc(Acb_Ntk_t * p,Acb_ObjType_t Type,int nFans,int nFons)461 static inline int Acb_ObjAlloc( Acb_Ntk_t * p, Acb_ObjType_t Type, int nFans, int nFons )
462 {
463 int i, nFansReal, CioId = -1, iObj = Vec_StrSize(&p->vObjType);
464 Vec_StrPush( &p->vObjType, (char)Type );
465 if ( Type == ABC_OPER_CI )
466 {
467 assert( nFans == 0 );
468 CioId = Vec_IntSize( &p->vCis );
469 Vec_IntPush( &p->vCis, iObj );
470 nFansReal = 2;
471 }
472 else if ( Type == ABC_OPER_CO )
473 {
474 assert( nFans == 1 );
475 CioId = Vec_IntSize( &p->vCos );
476 Vec_IntPush( &p->vCos, iObj );
477 nFansReal = 2;
478 }
479 else
480 nFansReal = Abc_MaxInt( nFans + Acb_ObjIsBox(p, iObj), p->nFaninMax );
481 // add fins
482 Vec_IntPush( &p->vObjFans, Vec_IntSize(&p->vFanSto) );
483 Vec_IntPush( &p->vFanSto, 0 );
484 for ( i = 0; i < nFansReal; i++ )
485 Vec_IntPush( &p->vFanSto, (CioId >= 0 && i == 1) ? CioId : -1 );
486 // add fons
487 assert( !Acb_ObjIsBox(p, iObj) || nFons > 0 );
488 for ( i = 0; i < nFons; i++ )
489 Acb_ObjAddFanin( p, Acb_ObjAlloc(p, ABC_OPER_FON, 1, 0), iObj );
490 // extend storage
491 if ( Acb_NtkHasObjCopies(p) ) Vec_IntPush(&p->vObjCopy , -1);
492 if ( Acb_NtkHasObjFuncs(p) ) Vec_IntPush(&p->vObjFunc , -1);
493 if ( Acb_NtkHasObjWeights(p)) Vec_IntPush(&p->vObjWeight, 0);
494 if ( Acb_NtkHasObjTruths(p) ) Vec_WrdPush(&p->vObjTruth , 0);
495 if ( Acb_NtkHasObjNames(p) ) Vec_IntPush(&p->vObjName , 0);
496 if ( Acb_NtkHasObjRanges(p) ) Vec_IntPush(&p->vObjRange , 0);
497 if ( Acb_NtkHasObjTravs(p) ) Vec_IntPush(&p->vObjTrav , 0);
498 if ( Acb_NtkHasObjAttrs(p) ) Vec_IntPush(&p->vObjAttr , 0);
499 if ( Acb_NtkHasObjLevelD(p) ) Vec_IntPush(&p->vLevelD , 0);
500 if ( Acb_NtkHasObjLevelR(p) ) Vec_IntPush(&p->vLevelR , 0);
501 if ( Acb_NtkHasObjPathD(p) ) Vec_IntPush(&p->vPathD , 0);
502 if ( Acb_NtkHasObjPathR(p) ) Vec_IntPush(&p->vPathR , 0);
503 if ( Acb_NtkHasObjCounts(p) ) Vec_FltPush(&p->vCounts , 0);
504 if ( Acb_NtkHasObjFanout(p) ) Vec_WecPushLevel(&p->vFanouts);
505 if ( Acb_NtkHasObjCnfs(p) ) Vec_WecPushLevel(&p->vCnfs);
506 if ( p->vQue ) Vec_QueSetPriority( p->vQue, Vec_FltArrayP(&p->vCounts) );
507 return iObj;
508 }
Acb_ObjDup(Acb_Ntk_t * pNew,Acb_Ntk_t * p,int i)509 static inline int Acb_ObjDup( Acb_Ntk_t * pNew, Acb_Ntk_t * p, int i )
510 {
511 int iObj = Acb_ObjAlloc( pNew, Acb_ObjType(p, i), Acb_ObjFaninNum(p, i), Acb_ObjFonNum(p, i) );
512 Acb_ObjSetCopy( p, i, iObj );
513 return iObj;
514 }
Acb_ObjDelete(Acb_Ntk_t * p,int iObj)515 static inline void Acb_ObjDelete( Acb_Ntk_t * p, int iObj )
516 {
517 int i;
518 Acb_ObjCleanType( p, iObj );
519 if ( !Acb_ObjIsBox(p, iObj) )
520 return;
521 Acb_ObjForEachFon( p, iObj, i )
522 Acb_ObjCleanType( p, i );
523 }
Acb_ObjAddFaninFanoutOne(Acb_Ntk_t * p,int iObj,int iFanin)524 static inline void Acb_ObjAddFaninFanoutOne( Acb_Ntk_t * p, int iObj, int iFanin )
525 {
526 Vec_IntPush( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
527 Acb_ObjAddFanin( p, iObj, iFanin );
528 }
Acb_ObjAddFaninFanout(Acb_Ntk_t * p,int iObj)529 static inline void Acb_ObjAddFaninFanout( Acb_Ntk_t * p, int iObj )
530 {
531 int k, iFanin, * pFanins;
532 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
533 Vec_IntPush( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
534 }
Acb_ObjRemoveFaninFanoutOne(Acb_Ntk_t * p,int iObj,int iFanin)535 static inline void Acb_ObjRemoveFaninFanoutOne( Acb_Ntk_t * p, int iObj, int iFanin )
536 {
537 int RetValue = Vec_IntRemove( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
538 assert( RetValue );
539 Acb_ObjDeleteFanin( p, iObj, iFanin );
540 }
Acb_ObjRemoveFaninFanout(Acb_Ntk_t * p,int iObj)541 static inline void Acb_ObjRemoveFaninFanout( Acb_Ntk_t * p, int iObj )
542 {
543 int k, iFanin, * pFanins;
544 Acb_ObjForEachFaninFast( p, iObj, pFanins, iFanin, k )
545 {
546 int RetValue = Vec_IntRemove( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
547 assert( RetValue );
548 }
549 }
Acb_ObjPatchFanin(Acb_Ntk_t * p,int iObj,int iFanin,int iFaninNew)550 static inline void Acb_ObjPatchFanin( Acb_Ntk_t * p, int iObj, int iFanin, int iFaninNew )
551 {
552 int i, RetValue, * pFanins = Acb_ObjFanins( p, iObj );
553 assert( iFanin != iFaninNew );
554 for ( i = 0; i < pFanins[0]; i++ )
555 if ( pFanins[ 1 + i ] == iFanin )
556 pFanins[ 1 + i ] = iFaninNew;
557 if ( !Acb_NtkHasObjFanout(p) )
558 return;
559 RetValue = Vec_IntRemove( Vec_WecEntry(&p->vFanouts, iFanin), iObj );
560 assert( RetValue );
561 Vec_IntPush( Vec_WecEntry(&p->vFanouts, iFaninNew), iObj );
562 }
Acb_NtkCreateFanout(Acb_Ntk_t * p)563 static inline void Acb_NtkCreateFanout( Acb_Ntk_t * p )
564 {
565 int iObj;
566 Acb_NtkCleanObjFanout( p );
567 Acb_NtkForEachObj( p, iObj )
568 Acb_ObjAddFaninFanout( p, iObj );
569 }
570
571 /**Function*************************************************************
572
573 Synopsis [Network APIs.]
574
575 Description []
576
577 SideEffects []
578
579 SeeAlso []
580
581 ***********************************************************************/
Acb_NtkAlloc(Acb_Man_t * p,int NameId,int nCis,int nCos,int nObjs)582 static inline Acb_Ntk_t * Acb_NtkAlloc( Acb_Man_t * p, int NameId, int nCis, int nCos, int nObjs )
583 {
584 Acb_Ntk_t * pNew = ABC_CALLOC( Acb_Ntk_t, 1 );
585 assert( nCis >= 0 && nCos >= 0 && nObjs >= 0 );
586 pNew->Id = Vec_PtrSize(&p->vNtks); Vec_PtrPush( &p->vNtks, pNew );
587 pNew->NameId = NameId;
588 pNew->pDesign = p;
589 Vec_IntGrow( &pNew->vCis, nCis );
590 Vec_IntGrow( &pNew->vCos, nCos );
591 Vec_StrGrow( &pNew->vObjType, nObjs+1 ); Vec_StrPush( &pNew->vObjType, (char)ABC_OPER_NONE );
592 Vec_IntGrow( &pNew->vObjFans, nObjs+1 ); Vec_IntPush( &pNew->vObjFans, -1 );
593 Vec_IntGrow( &pNew->vFanSto, 3*nObjs );
594 return pNew;
595 }
Acb_NtkFree(Acb_Ntk_t * p)596 static inline void Acb_NtkFree( Acb_Ntk_t * p )
597 {
598 // interface
599 Vec_IntErase( &p->vCis );
600 Vec_IntErase( &p->vCos );
601 Vec_IntErase( &p->vOrder );
602 Vec_IntErase( &p->vSeq );
603 // stucture
604 Vec_StrErase( &p->vObjType );
605 Vec_IntErase( &p->vObjFans );
606 Vec_IntErase( &p->vFanSto );
607 // optional
608 Vec_IntErase( &p->vObjCopy );
609 Vec_IntErase( &p->vObjFunc );
610 Vec_IntErase( &p->vObjWeight );
611 Vec_WrdErase( &p->vObjTruth );
612 Vec_IntErase( &p->vObjName );
613 Vec_IntErase( &p->vObjRange );
614 Vec_IntErase( &p->vObjTrav );
615 Vec_IntErase( &p->vObjBits );
616 Vec_IntErase( &p->vObjAttr );
617 Vec_IntErase( &p->vAttrSto );
618 Vec_IntErase( &p->vNtkObjs );
619 Vec_IntErase( &p->vTargets );
620 Vec_IntErase( &p->vLevelD );
621 Vec_IntErase( &p->vLevelR );
622 Vec_IntErase( &p->vPathD );
623 Vec_IntErase( &p->vPathR );
624 Vec_FltErase( &p->vCounts );
625 Vec_WecErase( &p->vFanouts );
626 Vec_WecErase( &p->vCnfs );
627 Vec_StrErase( &p->vCnf );
628 Vec_IntErase( &p->vSuppOld );
629 // other
630 Vec_QueFreeP( &p->vQue );
631 Vec_IntErase( &p->vCover );
632 Vec_IntErase( &p->vArray0 );
633 Vec_IntErase( &p->vArray1 );
634 Vec_IntErase( &p->vArray2 );
635 ABC_FREE( p );
636 }
Acb_NtkNewStrId(Acb_Ntk_t * pNtk,const char * format,...)637 static inline int Acb_NtkNewStrId( Acb_Ntk_t * pNtk, const char * format, ... )
638 {
639 Abc_Nam_t * p = Acb_NtkNam( pNtk );
640 Vec_Str_t * vBuf = Abc_NamBuffer( p );
641 int nAdded, nSize = 1000;
642 va_list args; va_start( args, format );
643 Vec_StrGrow( vBuf, Vec_StrSize(vBuf) + nSize );
644 nAdded = vsnprintf( Vec_StrLimit(vBuf), nSize, format, args );
645 if ( nAdded > nSize )
646 {
647 Vec_StrGrow( vBuf, Vec_StrSize(vBuf) + nAdded + nSize );
648 nSize = vsnprintf( Vec_StrLimit(vBuf), nAdded, format, args );
649 assert( nSize == nAdded );
650 }
651 va_end( args );
652 return Abc_NamStrFindOrAddLim( p, Vec_StrLimit(vBuf), Vec_StrLimit(vBuf) + nAdded, NULL );
653 }
Acb_ManNewConstId(Acb_Ntk_t * p,Vec_Str_t * vBits)654 static inline int Acb_ManNewConstId( Acb_Ntk_t * p, Vec_Str_t * vBits )
655 {
656 Vec_Str_t * vOut = Abc_NamBuffer(Acb_NtkNam(p));
657 Vec_StrPrintF( vOut, "%d\'b%s", Vec_StrSize(vBits)-1, Vec_StrArray(vBits) );
658 return Abc_NamStrFindOrAdd(p->pDesign->pFuns, Vec_StrArray(vOut), NULL);
659 }
Acb_ManNewConstZero(Acb_Ntk_t * p,int nBits)660 static inline int Acb_ManNewConstZero( Acb_Ntk_t * p, int nBits )
661 {
662 Vec_Str_t * vOut = Abc_NamBuffer(Acb_NtkNam(p));
663 Vec_StrPrintF( vOut, "%d\'b%0s", nBits, "" );
664 return Abc_NamStrFindOrAdd(p->pDesign->pFuns, Vec_StrArray(vOut), NULL);
665 }
Acb_NtkAdd(Acb_Man_t * p,Acb_Ntk_t * pNtk)666 static inline void Acb_NtkAdd( Acb_Man_t * p, Acb_Ntk_t * pNtk )
667 {
668 int fFound, NtkId = Abc_NamStrFindOrAdd( p->pMods, Acb_NtkName(pNtk), &fFound );
669 if ( fFound )
670 printf( "Network with name \"%s\" already exists.\n", Acb_NtkName(pNtk) );
671 else
672 assert( NtkId == pNtk->Id );
673 }
Acb_NtkUpdate(Acb_Man_t * p,Acb_Ntk_t * pNtk)674 static inline void Acb_NtkUpdate( Acb_Man_t * p, Acb_Ntk_t * pNtk )
675 {
676 int fFound, NtkId = Abc_NamStrFindOrAdd( p->pMods, Acb_NtkName(pNtk), &fFound );
677 if ( !fFound )
678 printf( "Network with name \"%s\" does not exist.\n", Acb_NtkName(pNtk) );
679 else
680 {
681 Acb_NtkFree( Acb_ManNtk(p, NtkId) );
682 Vec_PtrWriteEntry( &p->vNtks, NtkId, pNtk );
683 }
684 }
Acb_NtkCollect(Acb_Ntk_t * p)685 static inline Vec_Int_t * Acb_NtkCollect( Acb_Ntk_t * p )
686 {
687 int iObj;
688 Vec_Int_t * vObjs = Vec_IntAlloc( Acb_NtkObjNum(p) );
689 Acb_NtkForEachObj( p, iObj )
690 Vec_IntPush( vObjs, iObj );
691 return vObjs;
692 }
Acb_NtkDup(Acb_Man_t * pMan,Acb_Ntk_t * p,Vec_Int_t * vObjs)693 static inline Acb_Ntk_t * Acb_NtkDup( Acb_Man_t * pMan, Acb_Ntk_t * p, Vec_Int_t * vObjs )
694 {
695 Acb_Ntk_t * pNew;
696 int i, k, iObj, iObjNew, iFanin;
697 pNew = Acb_NtkAlloc( pMan, Acb_NtkNameId(p), Acb_NtkCiNum(p), Acb_NtkCoNum(p), Vec_IntSize(vObjs) );
698 Acb_NtkCleanObjCopies( p );
699 Vec_IntForEachEntry( vObjs, iObj, i )
700 iObjNew = Acb_ObjDup( pNew, p, iObj );
701 Vec_IntForEachEntry( vObjs, iObj, i )
702 {
703 iObjNew = Acb_ObjCopy( p, iObj );
704 Acb_ObjForEachFanin( p, iObj, iFanin, k )
705 Acb_ObjAddFanin( pNew, iObjNew, Acb_ObjCopy(p, iFanin) );
706 }
707 //Acb_NtkFreeObjCopies( p );
708 assert( Acb_NtkObjNum(pNew) == Acb_NtkObjNumAlloc(pNew) );
709 Acb_NtkSetCopy( p, Acb_NtkId(pNew) );
710 Acb_NtkSetRegNum( pNew, Acb_NtkRegNum(p) );
711 return pNew;
712 }
Acb_NtkDupOrder(Acb_Man_t * pMan,Acb_Ntk_t * p,Vec_Int_t * (* pFuncOrder)(Acb_Ntk_t *))713 static inline Acb_Ntk_t * Acb_NtkDupOrder( Acb_Man_t * pMan, Acb_Ntk_t * p, Vec_Int_t*(* pFuncOrder)(Acb_Ntk_t*) )
714 {
715 Acb_Ntk_t * pNew;
716 Vec_Int_t * vObjs = pFuncOrder ? pFuncOrder(p) : Acb_NtkCollect(p);
717 if ( vObjs == NULL )
718 return NULL;
719 pNew = Acb_NtkDup( pMan, p, vObjs );
720 Vec_IntFree( vObjs );
721 //Acb_NtkPrepareSeq( pNew );
722 return pNew;
723 }
Acb_NtkDupAttrs(Acb_Ntk_t * pNew,Acb_Ntk_t * p)724 static inline void Acb_NtkDupAttrs( Acb_Ntk_t * pNew, Acb_Ntk_t * p )
725 {
726 int i, iObj;
727 assert( Vec_IntSize(&pNew->vOrder) == 0 );
728 Acb_NtkForEachCioOrder( p, iObj, i )
729 Vec_IntPush( &pNew->vOrder, Acb_ObjCopy(p, iObj) );
730 // Vec_IntRemapArray( &p->vObjCopy, &p->vOrder, &pNew->vOrder, Acb_NtkCioOrderNum(p) );
731 // Vec_IntRemapArray( &p->vObjCopy, &p->vSeq, &pNew->vSeq, Acb_NtkSeqNum(p) );
732 // transfer object attributes
733 Vec_IntRemapArray( &p->vObjCopy, &p->vObjFunc, &pNew->vObjFunc, Acb_NtkObjNum(pNew) + 1 );
734 Vec_IntRemapArray( &p->vObjCopy, &p->vObjWeight, &pNew->vObjWeight, Acb_NtkObjNum(pNew) + 1 );
735 // Vec_WrdRemapArray( &p->vObjCopy, &p->vObjTruth, &pNew->vObjTruth, Acb_NtkObjNum(pNew) + 1 );
736 Vec_IntRemapArray( &p->vObjCopy, &p->vObjName, &pNew->vObjName, Acb_NtkObjNum(pNew) + 1 );
737 Vec_IntRemapArray( &p->vObjCopy, &p->vObjRange, &pNew->vObjRange, Acb_NtkObjNum(pNew) + 1 );
738 Vec_IntRemapArray( &p->vObjCopy, &p->vObjAttr, &pNew->vObjAttr, Acb_NtkObjNum(pNew) + 1 );
739 // duplicate attributes
740 Vec_IntAppend( &pNew->vAttrSto, &p->vAttrSto );
741 }
Acb_NtkMemory(Acb_Ntk_t * p)742 static inline int Acb_NtkMemory( Acb_Ntk_t * p )
743 {
744 int nMem = sizeof(Acb_Ntk_t);
745 // interface
746 nMem += (int)Vec_IntMemory(&p->vCis);
747 nMem += (int)Vec_IntMemory(&p->vCos);
748 nMem += (int)Vec_IntMemory(&p->vOrder);
749 nMem += (int)Vec_IntMemory(&p->vSeq);
750 // stucture
751 nMem += (int)Vec_StrMemory(&p->vObjType);
752 nMem += (int)Vec_IntMemory(&p->vObjFans);
753 nMem += (int)Vec_IntMemory(&p->vFanSto);
754 nMem += (int)Vec_WecMemory(&p->vFanouts);
755 // optional
756 nMem += (int)Vec_IntMemory(&p->vObjCopy );
757 nMem += (int)Vec_IntMemory(&p->vObjFunc );
758 nMem += (int)Vec_IntMemory(&p->vObjWeight );
759 nMem += (int)Vec_WrdMemory(&p->vObjTruth );
760 nMem += (int)Vec_IntMemory(&p->vObjName );
761 nMem += (int)Vec_IntMemory(&p->vObjRange );
762 nMem += (int)Vec_IntMemory(&p->vObjTrav );
763 nMem += (int)Vec_IntMemory(&p->vObjBits );
764 nMem += (int)Vec_IntMemory(&p->vObjAttr );
765 nMem += (int)Vec_IntMemory(&p->vAttrSto );
766 nMem += (int)Vec_IntMemory(&p->vNtkObjs );
767 nMem += (int)Vec_IntMemory(&p->vTargets );
768 // other
769 nMem += (int)Vec_IntMemory(&p->vCover );
770 nMem += (int)Vec_IntMemory(&p->vArray0 );
771 nMem += (int)Vec_IntMemory(&p->vArray1 );
772 nMem += (int)Vec_IntMemory(&p->vArray2 );
773 return nMem;
774 }
Acb_NtkPrintStats(Acb_Ntk_t * p)775 static inline void Acb_NtkPrintStats( Acb_Ntk_t * p )
776 {
777 printf( "pi =%5d ", Acb_NtkPiNum(p) );
778 printf( "po =%5d ", Acb_NtkPoNum(p) );
779 printf( "ff =%5d ", Acb_NtkRegNum(p) );
780 printf( "node =%5d ", Acb_NtkNodeNum(p) );
781 printf( "box =%5d ", Acb_NtkBoxNum(p) );
782 //printf( "topo =%4s ", Acb_NtkIsTopoOrder(p) ? "yes" : "no" );
783 printf( " %s ", Acb_NtkName(p) );
784 if ( Vec_IntSize(&p->vNtkObjs) )
785 printf( "-> %s", Acb_NtkName(Acb_NtkNtk(p, Vec_IntEntry(&p->vNtkObjs, 0))) );
786 printf( "\n" );
787 // Vec_StrIntPrint( &p->vObjType );
788 }
Acb_NtkPrint(Acb_Ntk_t * p)789 static inline void Acb_NtkPrint( Acb_Ntk_t * p )
790 {
791 int i, Type;
792 printf( "Interface (%d):\n", Acb_NtkCioNum(p) );
793 printf( "Objects (%d):\n", Acb_NtkObjNum(p) );
794 Acb_NtkForEachObjType( p, Type, i )
795 {
796 printf( "%6d : ", i );
797 printf( "Type =%3d ", Type );
798 printf( "Fanins = %d ", Acb_ObjFaninNum(p, i) );
799 if ( Acb_NtkHasObjNames(p) && Acb_ObjName(p, i) )
800 printf( "%s", Acb_ObjNameStr(p, i) );
801 printf( "\n" );
802 }
803 }
804
805 /**Function*************************************************************
806
807 Synopsis [Manager APIs.]
808
809 Description []
810
811 SideEffects []
812
813 SeeAlso []
814
815 ***********************************************************************/
Acb_ManAlloc(char * pFileName,int nNtks,Abc_Nam_t * pStrs,Abc_Nam_t * pFuns,Abc_Nam_t * pMods,Hash_IntMan_t * vHash)816 static inline Acb_Man_t * Acb_ManAlloc( char * pFileName, int nNtks, Abc_Nam_t * pStrs, Abc_Nam_t * pFuns, Abc_Nam_t * pMods, Hash_IntMan_t * vHash )
817 {
818 Acb_Man_t * pNew = ABC_CALLOC( Acb_Man_t, 1 );
819 pNew->pName = Extra_FileDesignName( pFileName );
820 pNew->pSpec = Abc_UtilStrsav( pFileName );
821 pNew->pStrs = pStrs ? pStrs : Abc_NamStart( 1000, 24 );
822 pNew->pFuns = pFuns ? pFuns : Abc_NamStart( 100, 24 );
823 pNew->pMods = pMods ? pMods : Abc_NamStart( 100, 24 );
824 pNew->vHash = vHash ? vHash : Hash_IntManStart( 1000 );
825 if ( pFuns == NULL )
826 {
827 Abc_NamStrFindOrAdd(pNew->pFuns, "1\'b0", NULL);
828 Abc_NamStrFindOrAdd(pNew->pFuns, "1\'b1", NULL);
829 Abc_NamStrFindOrAdd(pNew->pFuns, "1\'bx", NULL);
830 Abc_NamStrFindOrAdd(pNew->pFuns, "1\'bz", NULL);
831 }
832 // if ( vHash == NULL )
833 // Hash_Int2ManInsert( pNew->vHash, 0, 0, 0 );
834 Vec_PtrGrow( &pNew->vNtks, nNtks+1 ); Vec_PtrPush( &pNew->vNtks, NULL );
835 // set default root module
836 pNew->iRoot = 1;
837 return pNew;
838 }
Acb_ManDupTypeNames(Acb_Man_t * pNew,Acb_Man_t * p)839 static inline void Acb_ManDupTypeNames( Acb_Man_t * pNew, Acb_Man_t * p )
840 {
841 memcpy( pNew->pTypeNames, p->pTypeNames, sizeof(void *) * ABC_OPER_LAST );
842 }
Acb_ManDup(Acb_Man_t * p,Vec_Int_t * (* pFuncOrder)(Acb_Ntk_t *))843 static inline Acb_Man_t * Acb_ManDup( Acb_Man_t * p, Vec_Int_t*(* pFuncOrder)(Acb_Ntk_t*) )
844 {
845 Acb_Ntk_t * pNtk, * pNtkNew; int i;
846 Acb_Man_t * pNew = Acb_ManAlloc( p->pSpec, Acb_ManNtkNum(p), Abc_NamRef(p->pStrs), Abc_NamRef(p->pFuns), Abc_NamStart(100, 24), Hash_IntManRef(p->vHash) );
847 Acb_ManDupTypeNames( pNew, p );
848 Acb_ManForEachNtk( p, pNtk, i )
849 {
850 pNtkNew = Acb_NtkDupOrder( pNew, pNtk, pFuncOrder );
851 Acb_NtkAdd( pNew, pNtkNew );
852 Acb_NtkDupAttrs( pNtkNew, pNtk );
853 }
854 // Acb_ManForEachNtk( p, pNtk, i )
855 // if ( (pHost = Acb_NtkHostNtk(pNtk)) )
856 // Acb_NtkSetHost( Acb_NtkCopyNtk(pNew, pNtk), Acb_NtkCopy(pHost), Acb_ObjCopy(pHost, Acb_NtkHostObj(pNtk)) );
857 pNew->iRoot = Acb_ManNtkNum(pNew);
858 return pNew;
859 }
Acb_ManFree(Acb_Man_t * p)860 static inline void Acb_ManFree( Acb_Man_t * p )
861 {
862 Acb_Ntk_t * pNtk; int i;
863 Acb_ManForEachNtk( p, pNtk, i )
864 Acb_NtkFree( pNtk );
865 ABC_FREE( p->vNtks.pArray );
866 Abc_NamDeref( p->pStrs );
867 Abc_NamDeref( p->pFuns );
868 Abc_NamDeref( p->pMods );
869 Hash_IntManDeref( p->vHash );
870 Vec_IntErase( &p->vNameMap );
871 Vec_IntErase( &p->vUsed );
872 Vec_IntErase( &p->vNameMap2 );
873 Vec_IntErase( &p->vUsed2 );
874 Vec_StrErase( &p->vOut );
875 Vec_StrErase( &p->vOut2 );
876 ABC_FREE( p->pName );
877 ABC_FREE( p->pSpec );
878 ABC_FREE( p );
879 }
Acb_ManGetMap(Acb_Man_t * p,int i)880 static inline int Acb_ManGetMap( Acb_Man_t * p, int i )
881 {
882 return Vec_IntGetEntry(&p->vNameMap, i);
883 }
Acb_ManSetMap(Acb_Man_t * p,int i,int x)884 static inline void Acb_ManSetMap( Acb_Man_t * p, int i, int x )
885 {
886 assert( Vec_IntGetEntry(&p->vNameMap, i) == 0 );
887 Vec_IntSetEntry( &p->vNameMap, i, x );
888 Vec_IntPush( &p->vUsed, i );
889 }
Acb_ManUnsetMap(Acb_Man_t * p,int i)890 static inline void Acb_ManUnsetMap( Acb_Man_t * p, int i )
891 {
892 Vec_IntSetEntry( &p->vNameMap, i, 0 );
893 }
Acb_ManCleanMap(Acb_Man_t * p)894 static inline void Acb_ManCleanMap( Acb_Man_t * p )
895 {
896 int i, Entry;
897 Vec_IntForEachEntry( &p->vUsed, Entry, i )
898 Vec_IntWriteEntry( &p->vNameMap, Entry, 0 );
899 Vec_IntClear( &p->vUsed );
900 }
Acb_NtkGetMap(Acb_Ntk_t * p,int i)901 static inline int Acb_NtkGetMap( Acb_Ntk_t * p, int i ) { return Acb_ManGetMap(p->pDesign, i); }
Acb_NtkSetMap(Acb_Ntk_t * p,int i,int x)902 static inline void Acb_NtkSetMap( Acb_Ntk_t * p, int i, int x ) { Acb_ManSetMap(p->pDesign, i, x); }
Acb_NtkUnsetMap(Acb_Ntk_t * p,int i)903 static inline void Acb_NtkUnsetMap( Acb_Ntk_t * p, int i ) { Acb_ManUnsetMap(p->pDesign, i); }
Acb_NtkCleanMap(Acb_Ntk_t * p)904 static inline void Acb_NtkCleanMap( Acb_Ntk_t * p ) { Acb_ManCleanMap(p->pDesign); }
905
Acb_ManGetMap2(Acb_Man_t * p,int i)906 static inline int Acb_ManGetMap2( Acb_Man_t * p, int i )
907 {
908 return Vec_IntGetEntry(&p->vNameMap2, i);
909 }
Acb_ManSetMap2(Acb_Man_t * p,int i,int x)910 static inline void Acb_ManSetMap2( Acb_Man_t * p, int i, int x )
911 {
912 assert( Vec_IntGetEntry(&p->vNameMap2, i) == 0 );
913 Vec_IntSetEntry( &p->vNameMap2, i, x );
914 Vec_IntPush( &p->vUsed2, i );
915 }
Acb_ManUnsetMap2(Acb_Man_t * p,int i)916 static inline void Acb_ManUnsetMap2( Acb_Man_t * p, int i )
917 {
918 Vec_IntSetEntry( &p->vNameMap2, i, 0 );
919 }
Acb_ManCleanMap2(Acb_Man_t * p)920 static inline void Acb_ManCleanMap2( Acb_Man_t * p )
921 {
922 int i, Entry;
923 Vec_IntForEachEntry( &p->vUsed2, Entry, i )
924 Vec_IntWriteEntry( &p->vNameMap2, Entry, 0 );
925 Vec_IntClear( &p->vUsed2 );
926 }
Acb_NtkGetMap2(Acb_Ntk_t * p,int i)927 static inline int Acb_NtkGetMap2( Acb_Ntk_t * p, int i ) { return Acb_ManGetMap2(p->pDesign, i); }
Acb_NtkSetMap2(Acb_Ntk_t * p,int i,int x)928 static inline void Acb_NtkSetMap2( Acb_Ntk_t * p, int i, int x ) { Acb_ManSetMap2(p->pDesign, i, x); }
Acb_NtkUnsetMap2(Acb_Ntk_t * p,int i)929 static inline void Acb_NtkUnsetMap2( Acb_Ntk_t * p, int i ) { Acb_ManUnsetMap2(p->pDesign, i); }
Acb_NtkCleanMap2(Acb_Ntk_t * p)930 static inline void Acb_NtkCleanMap2( Acb_Ntk_t * p ) { Acb_ManCleanMap2(p->pDesign); }
931
Acb_ManMemory(Acb_Man_t * p)932 static inline int Acb_ManMemory( Acb_Man_t * p )
933 {
934 Acb_Ntk_t * pNtk; int i;
935 int nMem = sizeof(Acb_Man_t);
936 nMem += p->pName ? (int)strlen(p->pName) : 0;
937 nMem += p->pSpec ? (int)strlen(p->pSpec) : 0;
938 nMem += Abc_NamMemUsed(p->pStrs);
939 nMem += Abc_NamMemUsed(p->pFuns);
940 nMem += Abc_NamMemUsed(p->pMods);
941 nMem += (int)Vec_IntMemory(&p->vNameMap );
942 nMem += (int)Vec_IntMemory(&p->vUsed );
943 nMem += (int)Vec_StrMemory(&p->vOut );
944 nMem += (int)Vec_StrMemory(&p->vOut2 );
945 nMem += (int)Vec_PtrMemory(&p->vNtks);
946 Acb_ManForEachNtk( p, pNtk, i )
947 nMem += Acb_NtkMemory( pNtk );
948 return nMem;
949 }
Acb_ManObjNum(Acb_Man_t * p)950 static inline int Acb_ManObjNum( Acb_Man_t * p )
951 {
952 Acb_Ntk_t * pNtk; int i, Count = 0;
953 Acb_ManForEachNtk( p, pNtk, i )
954 Count += Acb_NtkObjNum(pNtk);
955 return Count;
956 }
Acb_ManBoxNum(Acb_Man_t * p)957 static inline int Acb_ManBoxNum( Acb_Man_t * p )
958 {
959 Acb_Ntk_t * pNtk; int i, Count = 0;
960 Acb_ManForEachNtk( p, pNtk, i )
961 Count += Acb_NtkBoxNum( pNtk );
962 return Count;
963 }
Acb_ManBoxNumRec_rec(Acb_Ntk_t * p,int * pCountP,int * pCountU)964 static inline void Acb_ManBoxNumRec_rec( Acb_Ntk_t * p, int * pCountP, int * pCountU )
965 {
966 int iObj, Id = Acb_NtkId(p);
967 if ( pCountP[Id] >= 0 )
968 return;
969 pCountP[Id] = pCountU[Id] = 0;
970 Acb_NtkForEachObj( p, iObj )
971 {
972 if ( Acb_ObjIsBox(p, iObj) )
973 {
974 Acb_ManBoxNumRec_rec( Acb_ObjNtk(p, iObj), pCountP, pCountU );
975 pCountP[Id] += pCountP[Acb_ObjNtkId(p, iObj)];
976 pCountU[Id] += pCountU[Acb_ObjNtkId(p, iObj)] + 1;
977 }
978 else
979 pCountP[Id] += 1;
980 }
981 }
Acb_ManBoxNumRec(Acb_Man_t * p,int * pnPrims,int * pnUsers)982 static inline void Acb_ManBoxNumRec( Acb_Man_t * p, int * pnPrims, int * pnUsers )
983 {
984 Acb_Ntk_t * pNtk = Acb_ManRoot(p);
985 int * pCountP = ABC_FALLOC( int, Acb_ManNtkNum(p) + 1 );
986 int * pCountU = ABC_FALLOC( int, Acb_ManNtkNum(p) + 1 );
987 Acb_ManBoxNumRec_rec( pNtk, pCountP, pCountU );
988 *pnPrims = pCountP[Acb_NtkId(pNtk)];
989 *pnUsers = pCountU[Acb_NtkId(pNtk)];
990 ABC_FREE( pCountP );
991 ABC_FREE( pCountU );
992 }
Acb_ManPrintStats(Acb_Man_t * p,int nModules,int fVerbose)993 static inline void Acb_ManPrintStats( Acb_Man_t * p, int nModules, int fVerbose )
994 {
995 Acb_Ntk_t * pNtk; int i, nPrims, nUsers;
996 Acb_Ntk_t * pRoot = Acb_ManRoot( p );
997 Acb_ManBoxNumRec( p, &nPrims, &nUsers );
998 printf( "%-12s : ", Acb_ManName(p) );
999 printf( "pi =%5d ", Acb_NtkCiNum(pRoot) );
1000 printf( "po =%5d ", Acb_NtkCoNum(pRoot) );
1001 printf( "mod =%5d ", Acb_ManNtkNum(p) );
1002 printf( "box =%5d ", nPrims + nUsers );
1003 printf( "prim =%5d ", nPrims );
1004 printf( "user =%5d ", nUsers );
1005 printf( "mem =%6.3f MB", 1.0*Acb_ManMemory(p)/(1<<20) );
1006 printf( "\n" );
1007 Acb_ManForEachNtk( p, pNtk, i )
1008 {
1009 if ( i == nModules+1 )
1010 break;
1011 printf( "Module %5d : ", i );
1012 Acb_NtkPrintStats( pNtk );
1013 }
1014 }
1015
1016
1017
1018 /*=== acbUtil.c =============================================================*/
1019 extern Vec_Int_t * Acb_ObjCollectTfi( Acb_Ntk_t * p, int iObj, int fTerm );
1020 extern Vec_Int_t * Acb_ObjCollectTfo( Acb_Ntk_t * p, int iObj, int fTerm );
1021
1022 extern int Acb_ObjComputeLevelD( Acb_Ntk_t * p, int iObj );
1023 extern int Acb_NtkComputeLevelD( Acb_Ntk_t * p, Vec_Int_t * vTfo );
1024 extern void Acb_NtkUpdateLevelD( Acb_Ntk_t * p, int iObj );
1025 extern void Acb_NtkUpdateTiming( Acb_Ntk_t * p, int iObj );
1026
1027 extern void Acb_NtkPrintNode( Acb_Ntk_t * p, int iObj );
1028 extern int Acb_NtkCreateNode( Acb_Ntk_t * p, word uTruth, Vec_Int_t * vSupp );
1029 extern void Acb_NtkUpdateNode( Acb_Ntk_t * p, int Pivot, word uTruth, Vec_Int_t * vSupp );
1030
1031 ABC_NAMESPACE_HEADER_END
1032
1033
1034 #endif
1035
1036 ////////////////////////////////////////////////////////////////////////
1037 /// END OF FILE ///
1038 ////////////////////////////////////////////////////////////////////////
1039
1040