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