summaryrefslogtreecommitdiffstats
path: root/src/aig/miniaig
diff options
context:
space:
mode:
authorAlan Mishchenko <alanmi@berkeley.edu>2019-11-18 00:17:40 +0800
committerAlan Mishchenko <alanmi@berkeley.edu>2019-11-18 00:17:40 +0800
commitdd5a1f5d3001429bc3abb6fd3a7fc04ff28ee6c5 (patch)
treeae6dbbb0f84d1a24e2a3e9490e4f1858d21f260a /src/aig/miniaig
parent548fa9d45bb389fe388892ec7b2dd17727b06dc5 (diff)
downloadabc-dd5a1f5d3001429bc3abb6fd3a7fc04ff28ee6c5.tar.gz
abc-dd5a1f5d3001429bc3abb6fd3a7fc04ff28ee6c5.tar.bz2
abc-dd5a1f5d3001429bc3abb6fd3a7fc04ff28ee6c5.zip
Enable blasting LUTs in NDR.
Diffstat (limited to 'src/aig/miniaig')
-rw-r--r--src/aig/miniaig/ndr.h51
1 files changed, 44 insertions, 7 deletions
diff --git a/src/aig/miniaig/ndr.h b/src/aig/miniaig/ndr.h
index 05b7fef0..8d630159 100644
--- a/src/aig/miniaig/ndr.h
+++ b/src/aig/miniaig/ndr.h
@@ -207,17 +207,25 @@ static inline void Ndr_DataPushArray( Ndr_Data_t * p, int Type, int nArray, int
memcpy( p->pBody + p->nSize, pArray, (size_t)4*nArray );
p->nSize += nArray;
}
-static inline void Ndr_DataPushString( Ndr_Data_t * p, int Type, char * pFunc )
+static inline void Ndr_DataPushString( Ndr_Data_t * p, int ObjType, int Type, char * pFunc )
{
int nBuffInts;
int * pBuff;
if ( !pFunc )
return;
- nBuffInts = ((int)strlen(pFunc) + 4) / 4;
- pBuff = (int *)calloc( 1, 4*nBuffInts );
- memcpy( pBuff, pFunc, strlen(pFunc) );
- Ndr_DataPushArray( p, Type, nBuffInts, pBuff );
- free( pBuff );
+ if ( ObjType == ABC_OPER_LUT )
+ {
+ word Truth = (word)pFunc;
+ Ndr_DataPushArray( p, Type, 2, (int *)&Truth );
+ }
+ else
+ {
+ nBuffInts = ((int)strlen(pFunc) + 4) / 4;
+ pBuff = (int *)calloc( 1, 4*nBuffInts );
+ memcpy( pBuff, pFunc, strlen(pFunc) );
+ Ndr_DataPushArray( p, Type, nBuffInts, pBuff );
+ free( pBuff );
+ }
}
////////////////////////////////////////////////////////////////////////
@@ -554,7 +562,7 @@ static inline void Ndr_AddObject( void * pDesign, int ModuleId,
Ndr_DataPush( p, NDR_NAME, InstName );
Ndr_DataPushArray( p, NDR_INPUT, nInputs, pInputs );
Ndr_DataPushArray( p, NDR_OUTPUT, nOutputs, pOutputs );
- Ndr_DataPushString( p, NDR_FUNCTION, pFunction );
+ Ndr_DataPushString( p, ObjType, NDR_FUNCTION, pFunction );
Ndr_DataAddTo( p, Obj, p->nSize - Obj );
Ndr_DataAddTo( p, Mod, p->nSize - Obj );
Ndr_DataAddTo( p, 0, p->nSize - Obj );
@@ -1088,6 +1096,35 @@ static inline void Ndr_ModuleTestAddSub()
Ndr_Delete( pDesign );
}
+// This testing procedure creates and writes into a Verilog file
+// the following design composed of one lookup table with function of AND2
+
+// module lut_test ( input [1:0] in, output out );
+// assign out = LUT #(TT=4'h8) lut_inst { in[0], in[1], out } ;
+// endmodule
+
+static inline void Ndr_ModuleTestLut()
+{
+ // map name IDs into char strings
+ //char * ppNames[12] = { NULL, "lut_test", "in", "out" };
+ // name IDs
+ int NameIdIn = 2;
+ int NameIdOut = 3;
+
+ // create a new module
+ void * pDesign = Ndr_Create( 1 );
+
+ int ModuleID = Ndr_AddModule( pDesign, 1 );
+
+ // add objects to the modele
+ Ndr_AddObject( pDesign, ModuleID, ABC_OPER_CI, 0, 1, 0, 0, 0, NULL, 1, &NameIdIn, NULL );
+ Ndr_AddObject( pDesign, ModuleID, ABC_OPER_LUT, 0, 0, 0, 0, 1, &NameIdIn, 1, &NameIdOut, (char *)(ABC_CONST(0x8)) );
+ Ndr_AddObject( pDesign, ModuleID, ABC_OPER_CO, 0, 0, 0, 0, 1, &NameIdOut, 0, NULL, NULL );
+
+ Ndr_Write( "lut_test.ndr", pDesign );
+ Ndr_Delete( pDesign );
+}
+
ABC_NAMESPACE_HEADER_END
#endif