ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
mpmInt.h
Go to the documentation of this file.
1
20
21#ifndef ABC__map__mpm_Int_h
22#define ABC__map__mpm_Int_h
23
24
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <string.h>
32#include <assert.h>
33
34//#include "misc/tim/tim.h"
35#include "misc/mem/mem2.h"
36#include "misc/vec/vec.h"
37#include "misc/vec/vecMem.h"
38#include "misc/vec/vecHsh.h"
39#include "misc/vec/vecWec.h"
40#include "misc/util/utilTruth.h"
41#include "mpmMig.h"
42#include "mpm.h"
43
45
49
50#define MPM_CUT_MAX 32
51
52#define MPM_UNIT_TIME 1
53#define MPM_UNIT_AREA 20
54#define MPM_UNIT_EDGE 50
55#define MPM_UNIT_REFS 100
56
60
61typedef struct Mpm_Cut_t_ Mpm_Cut_t; // 8 bytes + NLeaves * 4 bytes
63{
64 int hNext; // next cut
65 unsigned iFunc : 25; // function
66 unsigned fCompl : 1;
67 unsigned fUseless : 1; // internal flag
68 unsigned nLeaves : 5; // leaves
69 int pLeaves[1]; // leaves
70};
71typedef struct Mpm_Uni_t_ Mpm_Uni_t; // 48 bytes
73{
74 int mTime; // arrival time
75 int mArea; // area (flow)
76 int mEdge; // edge (flow)
77 int mAveRefs; // area references
78 word uSign; // cut signature
79 int Cost; // user cost
80 Mpm_Cut_t pCut; // new cut
81 int Data[MPM_VAR_MAX-1]; // padding
82};
83
84typedef struct Mpm_Dsd_t_ Mpm_Dsd_t;
86{
87 int nVars; // support size
88 int nAnds; // the number of AND gates
89 int nClauses; // the number of CNF clauses
90 word uTruth; // truth table
91 char * pStr; // description
92};
93
94typedef struct Mpm_Man_t_ Mpm_Man_t;
96{
97 Mig_Man_t * pMig; // AIG manager
98 Mpm_Par_t * pPars; // mapping parameters
99 // mapping parameters
100 int nLutSize; // LUT size
101 int nNumCuts; // cut count
102 int nTruWords; // words in the truth table
103 Mpm_LibLut_t * pLibLut; // LUT library
104 // mapping attributes
105 int fMainRun; // after preprocessing is finished
106 int GloRequired; // global arrival time
107 word GloArea; // total area
108 word GloEdge; // total edge
109 // cut management
110 Mmr_Step_t * pManCuts; // cut memory
111 // temporary cut storage
112 int nCutStore; // number of cuts in storage
113 Mpm_Uni_t * pCutStore[MPM_CUT_MAX+1]; // storage for cuts
114 Mpm_Uni_t pCutUnits[MPM_CUT_MAX+1]; // cut info units
115 Vec_Ptr_t vFreeUnits; // free cut info units
116 Vec_Ptr_t * vTemp; // storage for cuts
117 // cut comparison
118 int (* pCutCmp) (Mpm_Uni_t *, Mpm_Uni_t *);// procedure to compare cuts
119 // fanin cuts/signatures
120 int nCuts[3]; // fanin cut counts
121 Mpm_Cut_t * pCuts[3][MPM_CUT_MAX+1]; // fanin cuts
122 word pSigns[3][MPM_CUT_MAX+1]; // fanin cut signatures
123 // truth tables
124 Vec_Mem_t * vTtMem; // truth table memory and hash table
125 int funcCst0; // constant 0
126 int funcVar0; // variable 0
127 word Truth0[(1 << ((MPM_VAR_MAX)-6))];
128 word Truth1[(1 << ((MPM_VAR_MAX)-6))];
129 word TruthC[(1 << ((MPM_VAR_MAX)-6))];
130 word Truth[(1 << ((MPM_VAR_MAX)-6))];
131 // DSD
132 Mpm_Dsd_t * pDsd6; // NPN class information
133 Hsh_IntMan_t * pHash; // maps DSD functions into NPN classes
134 Vec_Int_t * vConfgRes; // configurations
135 Vec_Wrd_t * vPerm6; // permutations of DSD classes
136 char Perm6[720][6]; // permutations
137 Vec_Int_t * vMap2Perm; // maps number into its permutation
138 unsigned uPermMask[3];
139 unsigned uComplMask[3];
141 // mapping attributes
142 Vec_Int_t vCutBests; // cut best
143 Vec_Int_t vCutLists; // cut list
144 Vec_Int_t vMigRefs; // original references
145 Vec_Int_t vMapRefs; // exact mapping references
146 Vec_Int_t vEstRefs; // estimated mapping references
147 Vec_Int_t vRequireds; // required time
148 Vec_Int_t vTimes; // arrival time
151 int nCountDsd[600];
154 // statistics
165};
166
170
171static inline int Mpm_ObjCutBest( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vCutBests, Mig_ObjId(pObj)); }
172static inline void Mpm_ObjSetCutBest( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vCutBests, Mig_ObjId(pObj), i); }
173
174static inline int Mpm_CutWordNum( int nLeaves ) { return ((sizeof(Mpm_Cut_t) + (nLeaves << 2)) >> 3); }
175static inline Mpm_Cut_t * Mpm_CutFetch( Mpm_Man_t * p, int h ) { Mpm_Cut_t * pCut = (Mpm_Cut_t *)Mmr_StepEntry( p->pManCuts, h ); assert( Mpm_CutWordNum(pCut->nLeaves) == (h & p->pManCuts->uMask) ); return pCut; }
176static inline Mpm_Cut_t * Mpm_ObjCutBestP( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Mpm_CutFetch( p, Mpm_ObjCutBest(p, pObj) ); }
177
178static inline int Mpm_ObjCutList( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vCutLists, Mig_ObjId(pObj)); }
179static inline int * Mpm_ObjCutListP( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntryP(&p->vCutLists, Mig_ObjId(pObj)); }
180static inline void Mpm_ObjSetCutList( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vCutLists, Mig_ObjId(pObj), i); }
181
182static inline int Mpm_CutLeafNum( Mpm_Cut_t * pCut ) { return pCut->nLeaves; }
183static inline word * Mpm_CutTruth( Mpm_Man_t * p, int iFunc ) { return Vec_MemReadEntry(p->vTtMem, iFunc); }
184
185static inline int Mig_ObjMigRefNum( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vMigRefs, Mig_ObjId(pObj)); }
186static inline int Mig_ObjMigRefDec( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntAddToEntry(&p->vMigRefs, Mig_ObjId(pObj), -1); }
187
188static inline void Mpm_ManCleanMapRefs( Mpm_Man_t * p ) { Vec_IntFill( &p->vMapRefs, Mig_ManObjNum(p->pMig), 0 ); }
189static inline int Mpm_ObjMapRef( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vMapRefs, Mig_ObjId(pObj)); }
190static inline void Mpm_ObjSetMapRef( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vMapRefs, Mig_ObjId(pObj), i); }
191
192static inline int Mpm_ObjEstRef( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vEstRefs, Mig_ObjId(pObj)); }
193static inline void Mpm_ObjSetEstRef( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vEstRefs, Mig_ObjId(pObj), i); }
194
195static inline void Mpm_ManCleanRequired( Mpm_Man_t * p ) { Vec_IntFill(&p->vRequireds,Mig_ManObjNum(p->pMig),ABC_INFINITY);}
196static inline int Mpm_ObjRequired( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vRequireds, Mig_ObjId(pObj)); }
197static inline void Mpm_ObjSetRequired( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vRequireds, Mig_ObjId(pObj), i); }
198
199static inline int Mpm_ObjTime( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vTimes, Mig_ObjId(pObj)); }
200static inline void Mpm_ObjSetTime( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vTimes, Mig_ObjId(pObj), i); }
201
202static inline int Mpm_ObjArea( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vAreas, Mig_ObjId(pObj)); }
203static inline void Mpm_ObjSetArea( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vAreas, Mig_ObjId(pObj), i); }
204
205static inline int Mpm_ObjEdge( Mpm_Man_t * p, Mig_Obj_t * pObj ) { return Vec_IntEntry(&p->vEdges, Mig_ObjId(pObj)); }
206static inline void Mpm_ObjSetEdge( Mpm_Man_t * p, Mig_Obj_t * pObj, int i ) { Vec_IntWriteEntry(&p->vEdges, Mig_ObjId(pObj), i); }
207
208static inline void Mpm_VarsClear( int * V2P, int * P2V, int nVars ) { int i; for ( i = 0; i < nVars; i++ ) V2P[i] = P2V[i] = i; }
209static inline void Mpm_VarsSwap( int * V2P, int * P2V, int iVar, int jVar ) { V2P[P2V[iVar]] = jVar; V2P[P2V[jVar]] = iVar; P2V[iVar] ^= P2V[jVar]; P2V[jVar] ^= P2V[iVar]; P2V[iVar] ^= P2V[jVar]; }
210
211// iterators over object cuts
212#define Mpm_ObjForEachCut( p, pObj, hCut, pCut ) \
213 for ( hCut = Mpm_ObjCutList(p, pObj); hCut && (pCut = Mpm_CutFetch(p, hCut)); hCut = pCut->hNext )
214#define Mpm_ObjForEachCutSafe( p, pObj, hCut, pCut, hNext ) \
215 for ( hCut = Mpm_ObjCutList(p, pObj); hCut && (pCut = Mpm_CutFetch(p, hCut)) && ((hNext = pCut->hNext), 1); hCut = hNext )
216
217// iterators over cut leaves
218#define Mpm_CutForEachLeafId( pCut, iLeafId, i ) \
219 for ( i = 0; i < (int)pCut->nLeaves && ((iLeafId = Abc_Lit2Var(pCut->pLeaves[i])), 1); i++ )
220#define Mpm_CutForEachLeafLit( pCut, iLeafLit, i ) \
221 for ( i = 0; i < (int)pCut->nLeaves && ((iLeafLit = pCut->pLeaves[i]), 1); i++ )
222#define Mpm_CutForEachLeaf( p, pCut, pLeaf, i ) \
223 for ( i = 0; i < (int)pCut->nLeaves && (pLeaf = Mig_ManObj(p, Abc_Lit2Var(pCut->pLeaves[i]))); i++ )
224
228
229/*=== mpmAbc.c ===========================================================*/
230extern Mig_Man_t * Mig_ManCreate( void * pGia );
231extern void * Mpm_ManFromIfLogic( Mpm_Man_t * pMan );
232/*=== mpmMan.c ===========================================================*/
233extern Mpm_Man_t * Mpm_ManStart( Mig_Man_t * pMig, Mpm_Par_t * pPars );
234extern void Mpm_ManStop( Mpm_Man_t * p );
235extern void Mpm_ManPrintStatsInit( Mpm_Man_t * p );
236extern void Mpm_ManPrintStats( Mpm_Man_t * p );
237/*=== mpmDsd.c ===========================================================*/
238extern void Mpm_ManPrintDsdStats( Mpm_Man_t * p );
239extern void Mpm_ManPrintPerm( unsigned s );
240extern void Mpm_ManPrecomputePerms( Mpm_Man_t * p );
241extern word Mpm_CutTruthFromDsd( Mpm_Man_t * pMan, Mpm_Cut_t * pCut, int iDsdLit );
242extern int Mpm_CutCheckDsd6( Mpm_Man_t * p, word t );
243extern int Mpm_CutComputeDsd6( Mpm_Man_t * p, Mpm_Cut_t * pCut, Mpm_Cut_t * pCut0, Mpm_Cut_t * pCut1, Mpm_Cut_t * pCutC, int fCompl0, int fCompl1, int fComplC, int Type );
244/*=== mpmGates.c ===========================================================*/
245extern Vec_Wec_t * Mpm_ManFindDsdMatches( Mpm_Man_t * p, void * pScl );
246/*=== mpmLib.c ===========================================================*/
247extern Mpm_LibLut_t * Mpm_LibLutSetSimple( int nLutSize );
248extern void Mpm_LibLutFree( Mpm_LibLut_t * pLib );
249/*=== mpmMap.c ===========================================================*/
250extern void Mpm_CutPrint( Mpm_Cut_t * pCut );
251extern void Mpm_ManPrepare( Mpm_Man_t * p );
252extern void Mpm_ManPerform( Mpm_Man_t * p );
253/*=== mpmTruth.c ===========================================================*/
254extern int Mpm_CutComputeTruth( Mpm_Man_t * p, Mpm_Cut_t * pCut, Mpm_Cut_t * pCut0, Mpm_Cut_t * pCut1, Mpm_Cut_t * pCutC, int fCompl0, int fCompl1, int fComplC, int Type );
255
256extern void Kit_DsdPrintFromTruth( unsigned * pTruth, int nVars );
257
259
260#endif
261
265
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_INFINITY
MACRO DEFINITIONS ///.
Definition abc_global.h:250
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
Cube * p
Definition exorList.c:222
unsigned __int64 word
DECLARATIONS ///.
Definition kitPerm.c:36
struct Mmr_Step_t_ Mmr_Step_t
Definition mem2.h:35
struct Mpm_Uni_t_ Mpm_Uni_t
Definition mpmInt.h:71
void Mpm_ManPrintStatsInit(Mpm_Man_t *p)
Definition mpmMan.c:166
int Mpm_CutComputeTruth(Mpm_Man_t *p, Mpm_Cut_t *pCut, Mpm_Cut_t *pCut0, Mpm_Cut_t *pCut1, Mpm_Cut_t *pCutC, int fCompl0, int fCompl1, int fComplC, int Type)
Definition mpmTruth.c:215
struct Mpm_Man_t_ Mpm_Man_t
Definition mpmInt.h:94
#define MPM_CUT_MAX
INCLUDES ///.
Definition mpmInt.h:50
struct Mpm_Dsd_t_ Mpm_Dsd_t
Definition mpmInt.h:84
Mpm_Man_t * Mpm_ManStart(Mig_Man_t *pMig, Mpm_Par_t *pPars)
DECLARATIONS ///.
Definition mpmMan.c:45
void Mpm_ManPrintStats(Mpm_Man_t *p)
Definition mpmMan.c:173
void Kit_DsdPrintFromTruth(unsigned *pTruth, int nVars)
Definition kitDsd.c:491
void Mpm_CutPrint(Mpm_Cut_t *pCut)
Definition mpmMap.c:103
int Mpm_CutCheckDsd6(Mpm_Man_t *p, word t)
Definition mpmDsd.c:905
void Mpm_ManPrintPerm(unsigned s)
Definition mpmDsd.c:736
void Mpm_LibLutFree(Mpm_LibLut_t *pLib)
Definition mpmLib.c:60
struct Mpm_Cut_t_ Mpm_Cut_t
BASIC TYPES ///.
Definition mpmInt.h:61
word Mpm_CutTruthFromDsd(Mpm_Man_t *pMan, Mpm_Cut_t *pCut, int iDsdLit)
Definition mpmDsd.c:883
Vec_Wec_t * Mpm_ManFindDsdMatches(Mpm_Man_t *p, void *pScl)
DECLARATIONS ///.
Definition mpmGates.c:49
void Mpm_ManPerform(Mpm_Man_t *p)
Definition mpmMap.c:833
int Mpm_CutComputeDsd6(Mpm_Man_t *p, Mpm_Cut_t *pCut, Mpm_Cut_t *pCut0, Mpm_Cut_t *pCut1, Mpm_Cut_t *pCutC, int fCompl0, int fCompl1, int fComplC, int Type)
Definition mpmDsd.c:930
void Mpm_ManPrepare(Mpm_Man_t *p)
Definition mpmMap.c:794
void Mpm_ManPrecomputePerms(Mpm_Man_t *p)
Definition mpmDsd.c:755
Mpm_LibLut_t * Mpm_LibLutSetSimple(int nLutSize)
DECLARATIONS ///.
Definition mpmLib.c:45
void Mpm_ManStop(Mpm_Man_t *p)
Definition mpmMan.c:111
void Mpm_ManPrintDsdStats(Mpm_Man_t *p)
Definition mpmDsd.c:665
void * Mpm_ManFromIfLogic(Mpm_Man_t *pMan)
Definition mpmAbc.c:213
Mig_Man_t * Mig_ManCreate(void *pGia)
FUNCTION DECLARATIONS ///.
Definition mpmAbc.c:83
struct Mig_Obj_t_ Mig_Obj_t
Definition mpmMig.h:54
struct Mig_Man_t_ Mig_Man_t
Definition mpmMig.h:60
#define MPM_VAR_MAX
INCLUDES ///.
Definition mpm.h:40
struct Mpm_Par_t_ Mpm_Par_t
Definition mpm.h:56
struct Mpm_LibLut_t_ Mpm_LibLut_t
BASIC TYPES ///.
Definition mpm.h:46
int hNext
Definition mpmInt.h:64
unsigned fCompl
Definition mpmInt.h:66
unsigned nLeaves
Definition mpmInt.h:68
unsigned fUseless
Definition mpmInt.h:67
int pLeaves[1]
Definition mpmInt.h:69
unsigned iFunc
Definition mpmInt.h:65
word uTruth
Definition mpmInt.h:90
int nClauses
Definition mpmInt.h:89
int nAnds
Definition mpmInt.h:88
int nVars
Definition mpmInt.h:87
char * pStr
Definition mpmInt.h:91
int nCutsMerged
Definition mpmInt.h:155
int nNonDsd
Definition mpmInt.h:152
Vec_Int_t * vMap2Perm
Definition mpmInt.h:137
abctime timeEval
Definition mpmInt.h:160
Mig_Man_t * pMig
Definition mpmInt.h:97
word Truth1[(1<<((MPM_VAR_MAX) -6))]
Definition mpmInt.h:128
int funcVar0
Definition mpmInt.h:126
Vec_Wrd_t * vPerm6
Definition mpmInt.h:135
Mpm_LibLut_t * pLibLut
Definition mpmInt.h:103
int funcCst0
Definition mpmInt.h:125
Hsh_IntMan_t * pHash
Definition mpmInt.h:133
int nCutStore
Definition mpmInt.h:112
int fMainRun
Definition mpmInt.h:105
Vec_Int_t vMapRefs
Definition mpmInt.h:145
char Perm6[720][6]
Definition mpmInt.h:136
abctime timeTotal
Definition mpmInt.h:164
int nLutSize
Definition mpmInt.h:100
word Truth0[(1<<((MPM_VAR_MAX) -6))]
Definition mpmInt.h:127
abctime timeOther
Definition mpmInt.h:163
Vec_Ptr_t vFreeUnits
Definition mpmInt.h:115
Vec_Int_t vCutBests
Definition mpmInt.h:142
word TruthC[(1<<((MPM_VAR_MAX) -6))]
Definition mpmInt.h:129
int GloRequired
Definition mpmInt.h:106
Vec_Wec_t * vNpnConfigs
Definition mpmInt.h:140
int nSmallSupp
Definition mpmInt.h:157
Mpm_Uni_t pCutUnits[MPM_CUT_MAX+1]
Definition mpmInt.h:114
Mpm_Uni_t * pCutStore[MPM_CUT_MAX+1]
Definition mpmInt.h:113
Vec_Ptr_t * vTemp
Definition mpmInt.h:116
int nCutsMergedAll
Definition mpmInt.h:156
Mpm_Dsd_t * pDsd6
Definition mpmInt.h:132
Vec_Mem_t * vTtMem
Definition mpmInt.h:124
Vec_Int_t vMigRefs
Definition mpmInt.h:144
Mmr_Step_t * pManCuts
Definition mpmInt.h:110
int nNoMatch
Definition mpmInt.h:153
abctime timeStore
Definition mpmInt.h:162
int nCountDsd[600]
Definition mpmInt.h:151
abctime timeDerive
Definition mpmInt.h:158
Vec_Int_t vTimes
Definition mpmInt.h:148
abctime timeCompare
Definition mpmInt.h:161
Vec_Int_t vRequireds
Definition mpmInt.h:147
abctime timeMerge
Definition mpmInt.h:159
Vec_Int_t * vConfgRes
Definition mpmInt.h:134
word Truth[(1<<((MPM_VAR_MAX) -6))]
Definition mpmInt.h:130
int(* pCutCmp)(Mpm_Uni_t *, Mpm_Uni_t *)
Definition mpmInt.h:118
Mpm_Cut_t * pCuts[3][MPM_CUT_MAX+1]
Definition mpmInt.h:121
int nCuts[3]
Definition mpmInt.h:120
Vec_Int_t vEstRefs
Definition mpmInt.h:146
word pSigns[3][MPM_CUT_MAX+1]
Definition mpmInt.h:122
Vec_Int_t vAreas
Definition mpmInt.h:149
int nTruWords
Definition mpmInt.h:102
int nNumCuts
Definition mpmInt.h:101
word GloArea
Definition mpmInt.h:107
unsigned uComplMask[3]
Definition mpmInt.h:139
word GloEdge
Definition mpmInt.h:108
Vec_Int_t vEdges
Definition mpmInt.h:150
Vec_Int_t vCutLists
Definition mpmInt.h:143
Mpm_Par_t * pPars
Definition mpmInt.h:98
unsigned uPermMask[3]
Definition mpmInt.h:138
word uSign
Definition mpmInt.h:78
int Data[MPM_VAR_MAX-1]
Definition mpmInt.h:81
Mpm_Cut_t pCut
Definition mpmInt.h:80
int mTime
Definition mpmInt.h:74
int mEdge
Definition mpmInt.h:76
int mArea
Definition mpmInt.h:75
int mAveRefs
Definition mpmInt.h:77
int Cost
Definition mpmInt.h:79
typedefABC_NAMESPACE_IMPL_START struct Vec_Mem_t_ Vec_Mem_t
DECLARATIONS ///.
Definition utilMem.c:35
#define assert(ex)
Definition util_old.h:213
struct Hsh_IntMan_t_ Hsh_IntMan_t
Definition vecHsh.h:66
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
typedefABC_NAMESPACE_HEADER_START struct Vec_Wec_t_ Vec_Wec_t
INCLUDES ///.
Definition vecWec.h:42
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.
Definition vecWrd.h:42