abc-master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
rwtDec.c
Go to the documentation of this file.
1 /**CFile****************************************************************
2 
3  FileName [rwtDec.c]
4 
5  SystemName [ABC: Logic synthesis and verification system.]
6 
7  PackageName [DAG-aware AIG rewriting package.]
8 
9  Synopsis [Evaluation and decomposition procedures.]
10 
11  Author [Alan Mishchenko]
12 
13  Affiliation [UC Berkeley]
14 
15  Date [Ver. 1.0. Started - June 20, 2005.]
16 
17  Revision [$Id: rwtDec.c,v 1.00 2005/06/20 00:00:00 alanmi Exp $]
18 
19 ***********************************************************************/
20 
21 #include "rwt.h"
22 #include "bool/deco/deco.h"
23 
25 
26 
27 ////////////////////////////////////////////////////////////////////////
28 /// DECLARATIONS ///
29 ////////////////////////////////////////////////////////////////////////
30 
31 static Dec_Graph_t * Rwt_NodePreprocess( Rwt_Man_t * p, Rwt_Node_t * pNode );
32 static Dec_Edge_t Rwt_TravCollect_rec( Rwt_Man_t * p, Rwt_Node_t * pNode, Dec_Graph_t * pGraph );
33 
34 ////////////////////////////////////////////////////////////////////////
35 /// FUNCTION DEFINITIONS ///
36 ////////////////////////////////////////////////////////////////////////
37 
38 /**Function*************************************************************
39 
40  Synopsis [Preprocesses computed library of subgraphs.]
41 
42  Description []
43 
44  SideEffects []
45 
46  SeeAlso []
47 
48 ***********************************************************************/
50 {
51  Dec_Graph_t * pGraph;
52  Rwt_Node_t * pNode;
53  int i, k;
54  // put the nodes into the structure
55  p->pMapInv = ABC_ALLOC( unsigned short, 222 );
56  memset( p->pMapInv, 0, sizeof(unsigned short) * 222 );
57  p->vClasses = Vec_VecStart( 222 );
58  for ( i = 0; i < p->nFuncs; i++ )
59  {
60  if ( p->pTable[i] == NULL )
61  continue;
62  // consider all implementations of this function
63  for ( pNode = p->pTable[i]; pNode; pNode = pNode->pNext )
64  {
65  assert( pNode->uTruth == p->pTable[i]->uTruth );
66  assert( p->pMap[pNode->uTruth] < 222 ); // Always >= 0 b/c unsigned.
67  Vec_VecPush( p->vClasses, p->pMap[pNode->uTruth], pNode );
68  p->pMapInv[ p->pMap[pNode->uTruth] ] = p->puCanons[pNode->uTruth];
69  }
70  }
71  // compute decomposition forms for each node and verify them
72  Vec_VecForEachEntry( Rwt_Node_t *, p->vClasses, pNode, i, k )
73  {
74  pGraph = Rwt_NodePreprocess( p, pNode );
75  pNode->pNext = (Rwt_Node_t *)pGraph;
76 // assert( pNode->uTruth == (Dec_GraphDeriveTruth(pGraph) & 0xFFFF) );
77  }
78 }
79 
80 /**Function*************************************************************
81 
82  Synopsis [Preprocesses subgraphs rooted at this node.]
83 
84  Description []
85 
86  SideEffects []
87 
88  SeeAlso []
89 
90 ***********************************************************************/
92 {
93  Dec_Graph_t * pGraph;
94  Dec_Edge_t eRoot;
95  assert( !Rwt_IsComplement(pNode) );
96  // consider constant
97  if ( pNode->uTruth == 0 )
98  return Dec_GraphCreateConst0();
99  // consider the case of elementary var
100  if ( pNode->uTruth == 0x00FF )
101  return Dec_GraphCreateLeaf( 3, 4, 1 );
102  // start the subgraphs
103  pGraph = Dec_GraphCreate( 4 );
104  // collect the nodes
105  Rwt_ManIncTravId( p );
106  eRoot = Rwt_TravCollect_rec( p, pNode, pGraph );
107  Dec_GraphSetRoot( pGraph, eRoot );
108  return pGraph;
109 }
110 
111 /**Function*************************************************************
112 
113  Synopsis [Adds one node.]
114 
115  Description []
116 
117  SideEffects []
118 
119  SeeAlso []
120 
121 ***********************************************************************/
123 {
124  Dec_Edge_t eNode0, eNode1, eNode;
125  // elementary variable
126  if ( pNode->fUsed )
127  return Dec_EdgeCreate( pNode->Id - 1, 0 );
128  // previously visited node
129  if ( pNode->TravId == p->nTravIds )
130  return Dec_IntToEdge( pNode->Volume );
131  pNode->TravId = p->nTravIds;
132  // solve for children
133  eNode0 = Rwt_TravCollect_rec( p, Rwt_Regular(pNode->p0), pGraph );
134  if ( Rwt_IsComplement(pNode->p0) )
135  eNode0.fCompl = !eNode0.fCompl;
136  eNode1 = Rwt_TravCollect_rec( p, Rwt_Regular(pNode->p1), pGraph );
137  if ( Rwt_IsComplement(pNode->p1) )
138  eNode1.fCompl = !eNode1.fCompl;
139  // create the decomposition node(s)
140  if ( pNode->fExor )
141  eNode = Dec_GraphAddNodeXor( pGraph, eNode0, eNode1, 0 );
142  else
143  eNode = Dec_GraphAddNodeAnd( pGraph, eNode0, eNode1 );
144  // save the result
145  pNode->Volume = Dec_EdgeToInt( eNode );
146  return eNode;
147 }
148 
149 ////////////////////////////////////////////////////////////////////////
150 /// END OF FILE ///
151 ////////////////////////////////////////////////////////////////////////
152 
153 
155 
char * memset()
void Rwt_ManIncTravId(Rwt_Man_t *p)
Definition: rwtUtil.c:547
int Id
Definition: rwt.h:109
static unsigned Dec_EdgeToInt(Dec_Edge_t eEdge)
Definition: dec.h:151
Rwt_Node_t * p1
Definition: rwt.h:117
static Dec_Edge_t Rwt_TravCollect_rec(Rwt_Man_t *p, Rwt_Node_t *pNode, Dec_Graph_t *pGraph)
Definition: rwtDec.c:122
void Rwt_ManPreprocess(Rwt_Man_t *p)
FUNCTION DEFINITIONS ///.
Definition: rwtDec.c:49
Rwt_Node_t * pNext
Definition: rwt.h:118
static void Vec_VecPush(Vec_Vec_t *p, int Level, void *Entry)
Definition: vecVec.h:456
static Llb_Mgr_t * p
Definition: llb3Image.c:950
unsigned short * pMapInv
Definition: rwt.h:66
#define Vec_VecForEachEntry(Type, vGlob, pEntry, i, k)
Definition: vecVec.h:87
static Dec_Edge_t Dec_EdgeCreate(int Node, int fCompl)
FUNCTION DEFINITIONS ///.
Definition: dec.h:134
#define ABC_ALLOC(type, num)
Definition: abc_global.h:229
typedefABC_NAMESPACE_HEADER_START struct Dec_Edge_t_ Dec_Edge_t
INCLUDES ///.
Definition: dec.h:42
unsigned uTruth
Definition: rwt.h:111
int nFuncs
Definition: rwt.h:61
Rwt_Node_t ** pTable
Definition: rwt.h:71
static Dec_Edge_t Dec_IntToEdge(unsigned Edge)
Definition: dec.h:167
static Dec_Edge_t Dec_GraphAddNodeAnd(Dec_Graph_t *pGraph, Dec_Edge_t eEdge0, Dec_Edge_t eEdge1)
Definition: dec.h:591
static int Rwt_IsComplement(Rwt_Node_t *p)
Definition: rwt.h:122
static ABC_NAMESPACE_IMPL_START Dec_Graph_t * Rwt_NodePreprocess(Rwt_Man_t *p, Rwt_Node_t *pNode)
DECLARATIONS ///.
Definition: rwtDec.c:91
unsigned Volume
Definition: rwt.h:112
int nTravIds
Definition: rwt.h:75
static Dec_Graph_t * Dec_GraphCreateConst0()
Definition: dec.h:245
#define ABC_NAMESPACE_IMPL_END
Definition: abc_global.h:108
static Dec_Edge_t Dec_GraphAddNodeXor(Dec_Graph_t *pGraph, Dec_Edge_t eEdge0, Dec_Edge_t eEdge1, int Type)
Definition: dec.h:643
static Vec_Vec_t * Vec_VecStart(int nSize)
Definition: vecVec.h:168
Vec_Vec_t * vClasses
Definition: rwt.h:72
Rwt_Node_t * p0
Definition: rwt.h:116
static void Dec_GraphSetRoot(Dec_Graph_t *pGraph, Dec_Edge_t eRoot)
Definition: dec.h:551
#define ABC_NAMESPACE_IMPL_START
Definition: abc_global.h:107
static Dec_Graph_t * Dec_GraphCreateLeaf(int iLeaf, int nLeaves, int fCompl)
Definition: dec.h:286
static Dec_Graph_t * Dec_GraphCreate(int nLeaves)
Definition: dec.h:221
unsigned fExor
Definition: rwt.h:115
Definition: rwt.h:58
unsigned fUsed
Definition: rwt.h:114
unsigned char * pMap
Definition: rwt.h:65
#define assert(ex)
Definition: util_old.h:213
int TravId
Definition: rwt.h:110
static Rwt_Node_t * Rwt_Regular(Rwt_Node_t *p)
Definition: rwt.h:123
unsigned short * puCanons
Definition: rwt.h:62