21#ifndef ABC__base__ndr__ndr_h
22#define ABC__base__ndr__ndr_h
41#define inline __inline
128static inline int Ndr_DataType(
Ndr_Data_t *
p,
int i ) {
assert(
p->pHead[i] );
return (
int)
p->pHead[i]; }
129static inline int Ndr_DataSize(
Ndr_Data_t *
p,
int i ) {
return Ndr_DataType(
p, i) >
NDR_OBJECT ? 1 :
p->pBody[i]; }
130static inline int Ndr_DataEntry(
Ndr_Data_t *
p,
int i ) {
return (
int)
p->pBody[i]; }
131static inline int * Ndr_DataEntryP(
Ndr_Data_t *
p,
int i ) {
return (
int *)
p->pBody + i; }
132static inline int Ndr_DataEnd(
Ndr_Data_t *
p,
int i ) {
return i +
p->pBody[i]; }
134static inline void Ndr_DataPush(
Ndr_Data_t *
p,
int Type,
int Entry ) {
p->pHead[
p->nSize] = Type;
p->pBody[
p->nSize++] = Entry; }
136#define NDR_ALLOC(type, num) ((type *) malloc(sizeof(type) * (size_t)(num)))
143#define Ndr_DesForEachMod( p, Mod ) \
144 for ( Mod = 1; Mod < Ndr_DataEntry(p, 0); Mod += Ndr_DataSize(p, Mod) ) if (Ndr_DataType(p, Mod) != NDR_MODULE) {} else
147#define Ndr_ModForEachObj( p, Mod, Obj ) \
148 for ( Obj = Mod + 1; Obj < Ndr_DataEnd(p, Mod); Obj += Ndr_DataSize(p, Obj) ) if (Ndr_DataType(p, Obj) != NDR_OBJECT) {} else
151#define Ndr_ObjForEachEntry( p, Obj, Ent ) \
152 for ( Ent = Obj + 1; Ent < Ndr_DataEnd(p, Obj); Ent += Ndr_DataSize(p, Ent) )
155#define Ndr_ModForEachPi( p, Mod, Obj ) \
156 Ndr_ModForEachObj( p, Mod, Obj ) if ( !Ndr_ObjIsType(p, Obj, ABC_OPER_CI) ) {} else
159#define Ndr_ModForEachPo( p, Mod, Obj ) \
160 Ndr_ModForEachObj( p, Mod, Obj ) if ( !Ndr_ObjIsType(p, Obj, ABC_OPER_CO) ) {} else
163#define Ndr_ModForEachNode( p, Mod, Obj ) \
164 Ndr_ModForEachObj( p, Mod, Obj ) if ( Ndr_ObjIsType(p, Obj, ABC_OPER_CI) || Ndr_ObjIsType(p, Obj, ABC_OPER_CO) ) {} else
167#define Ndr_ModForEachTarget( p, Mod, Obj ) \
168 for ( Obj = Mod + 1; Obj < Ndr_DataEnd(p, Mod); Obj += Ndr_DataSize(p, Obj) ) if (Ndr_DataType(p, Obj) != NDR_TARGET) {} else
175static inline void Ndr_DataResize(
Ndr_Data_t *
p,
int Add )
177 if (
p->nSize + Add <= p->nCap )
179 p->nCap = 2 *
p->nCap >
p->nSize + Add ? 2 *
p->nCap :
p->nSize + Add;
180 p->pHead = (
unsigned char*)
realloc(
p->pHead,
p->nCap );
181 p->pBody = (
unsigned int *)
realloc(
p->pBody, 4*
p->nCap );
183static inline void Ndr_DataPushRange(
Ndr_Data_t *
p,
int RangeLeft,
int RangeRight,
int fSignedness )
192 if ( !RangeLeft && !RangeRight )
194 if ( RangeLeft == RangeRight )
202static inline void Ndr_DataPushArray(
Ndr_Data_t *
p,
int Type,
int nArray,
int * pArray )
207 Ndr_DataResize(
p, nArray );
208 memset(
p->pHead +
p->nSize, Type, (
size_t)nArray );
209 memcpy(
p->pBody +
p->nSize, pArray, (
size_t)4*nArray );
212static inline void Ndr_DataPushString(
Ndr_Data_t *
p,
int ObjType,
int Type,
char * pFunc )
222 int nInts = (
strlen(pFunc) + 1 +
sizeof(int) - 1) /
sizeof(int);
223 Ndr_DataPushArray(
p, Type, nInts, (
int *)&pFunc );
227 nBuffInts = ((int)
strlen(pFunc) + 4) / 4;
228 pBuff = (
int *)
calloc( 1, 4*nBuffInts );
230 Ndr_DataPushArray(
p, Type, nBuffInts, pBuff );
239static inline int Ndr_ObjReadEntry(
Ndr_Data_t *
p,
int Obj,
int Type )
243 if ( Ndr_DataType(
p, Ent) == Type )
244 return Ndr_DataEntry(
p, Ent);
247static inline int Ndr_ObjReadArray(
Ndr_Data_t *
p,
int Obj,
int Type,
int ** ppStart )
249 int Ent, Counter = 0; *ppStart = NULL;
251 if ( Ndr_DataType(
p, Ent) == Type )
254 if ( *ppStart == NULL )
255 *ppStart = (
int *)
p->pBody + Ent;
261static inline int Ndr_ObjIsType(
Ndr_Data_t *
p,
int Obj,
int Type )
266 return (
int)(Ndr_DataEntry(
p, Ent) == Type);
269static inline int Ndr_ObjReadBody(
Ndr_Data_t *
p,
int Obj,
int Type )
273 if ( Ndr_DataType(
p, Ent) == Type )
274 return Ndr_DataEntry(
p, Ent);
277static inline int * Ndr_ObjReadBodyP(
Ndr_Data_t *
p,
int Obj,
int Type )
281 if ( Ndr_DataType(
p, Ent) == Type )
282 return Ndr_DataEntryP(
p, Ent);
285static inline void Ndr_ObjWriteRange(
Ndr_Data_t *
p,
int Obj, FILE * pFile,
int fSkipBin )
287 int * pArray, nArray = Ndr_ObjReadArray(
p, Obj,
NDR_RANGE, &pArray );
288 if ( (nArray == 0 || nArray == 1) && fSkipBin )
290 if ( nArray == 3 && fSkipBin )
291 fprintf( pFile,
"signed " );
292 else if ( nArray == 1 )
295 fprintf( pFile,
"[%d:%d]", pArray[0], pArray[0] );
297 fprintf( pFile,
"[%d]", pArray[0] );
299 else if ( nArray == 0 )
302 fprintf( pFile,
"[%d:%d]", 0, 0 );
304 fprintf( pFile,
"[%d]", 0 );
307 fprintf( pFile,
"[%d:%d]", pArray[0], pArray[1] );
309static inline char * Ndr_ObjReadOutName(
Ndr_Data_t *
p,
int Obj,
char ** pNames )
311 return pNames[Ndr_ObjReadBody(
p, Obj,
NDR_OUTPUT)];
313static inline char * Ndr_ObjReadInName(
Ndr_Data_t *
p,
int Obj,
char ** pNames )
315 return pNames[Ndr_ObjReadBody(
p, Obj,
NDR_INPUT)];
318static inline int Ndr_DataCiNum(
Ndr_Data_t *
p,
int Mod )
325static inline int Ndr_DataCoNum(
Ndr_Data_t *
p,
int Mod )
332static inline int Ndr_DataObjNum(
Ndr_Data_t *
p,
int Mod )
341static inline void Ndr_WriteVerilogModule( FILE * pFile,
void * pDesign,
int Mod,
char ** pNames,
int fSimple )
344 int * pOuts =
NDR_ALLOC(
int, Ndr_DataCoNum(
p, Mod) );
345 int i, k, Obj, nArray, * pArray, fFirst = 1;
347 fprintf( pFile,
"\nmodule %s (\n ", pNames[Ndr_ObjReadEntry(
p, Mod,
NDR_NAME)] );
350 fprintf( pFile,
"%s, ", Ndr_ObjReadOutName(
p, Obj, pNames) );
352 fprintf( pFile,
"\n " );
355 fprintf( pFile,
"%s%s", fFirst ?
"":
", ", Ndr_ObjReadInName(
p, Obj, pNames) ), fFirst = 0;
357 fprintf( pFile,
"\n);\n\n" );
361 fprintf( pFile,
" input " );
362 Ndr_ObjWriteRange(
p, Obj, pFile, 1 );
363 fprintf( pFile,
" %s;\n", Ndr_ObjReadOutName(
p, Obj, pNames) );
369 fprintf( pFile,
" output " );
370 Ndr_ObjWriteRange(
p, Obj, pFile, 1 );
371 fprintf( pFile,
" %s;\n", Ndr_ObjReadInName(
p, Obj, pNames) );
372 pOuts[i++] = Ndr_ObjReadBody(
p, Obj,
NDR_INPUT);
375 fprintf( pFile,
"\n" );
379 for ( k = 0; k < i; k++ )
380 if ( pOuts[k] == Ndr_ObjReadBody(
p, Obj,
NDR_OUTPUT) )
384 if ( Ndr_ObjReadOutName(
p, Obj, pNames)[0] ==
'1' )
386 fprintf( pFile,
" wire " );
387 Ndr_ObjWriteRange(
p, Obj, pFile, 1 );
388 fprintf( pFile,
" %s;\n", Ndr_ObjReadOutName(
p, Obj, pNames) );
392 fprintf( pFile,
"\n" );
399 fprintf( pFile,
" %s ", pNames[Ndr_ObjReadEntry(
p, Type-256,
NDR_NAME)] );
400 if ( Ndr_ObjReadBody(
p, Obj,
NDR_NAME) > 0 )
401 fprintf( pFile,
"%s ", pNames[Ndr_ObjReadBody(
p, Obj,
NDR_NAME)] );
402 fprintf( pFile,
"( " );
403 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
404 for ( i = 0; i < nArray; i++ )
405 fprintf( pFile,
"%s%s ", pNames[pArray[i]], i==nArray-1 ?
"":
"," );
406 fprintf( pFile,
");\n" );
411 fprintf( pFile,
" %s ",
"ABC_DFF" );
412 if ( Ndr_ObjReadBody(
p, Obj,
NDR_NAME) > 0 )
413 fprintf( pFile,
"%s ", pNames[Ndr_ObjReadBody(
p, Obj,
NDR_NAME)] );
414 fprintf( pFile,
"( " );
415 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
416 fprintf( pFile,
".q(%s), ", Ndr_ObjReadOutName(
p, Obj, pNames) );
417 fprintf( pFile,
".d(%s), ", pNames[pArray[0]] );
418 fprintf( pFile,
".init(%s) ", pNames[pArray[1]] );
419 fprintf( pFile,
");\n" );
424 fprintf( pFile,
" %s ",
"ABC_DFFRSE" );
425 if ( Ndr_ObjReadBody(
p, Obj,
NDR_NAME) > 0 )
426 fprintf( pFile,
"%s ", pNames[Ndr_ObjReadBody(
p, Obj,
NDR_NAME)] );
427 fprintf( pFile,
"( " );
428 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
429 fprintf( pFile,
".q(%s), ", Ndr_ObjReadOutName(
p, Obj, pNames) );
430 fprintf( pFile,
".d(%s), ", pNames[pArray[0]] );
431 fprintf( pFile,
".clk(%s), ", pNames[pArray[1]] );
432 fprintf( pFile,
".reset(%s), ", pNames[pArray[2]] );
433 fprintf( pFile,
".set(%s), ", pNames[pArray[3]] );
434 fprintf( pFile,
".enable(%s), ", pNames[pArray[4]] );
435 fprintf( pFile,
".async(%s), ", pNames[pArray[5]] );
436 fprintf( pFile,
".sre(%s), ", pNames[pArray[6]] );
437 fprintf( pFile,
".init(%s) ", pNames[pArray[7]] );
438 fprintf( pFile,
");\n" );
443 fprintf( pFile,
" %s ",
"ABC_READ" );
444 if ( Ndr_ObjReadBody(
p, Obj,
NDR_NAME) > 0 )
445 fprintf( pFile,
"%s ", pNames[Ndr_ObjReadBody(
p, Obj,
NDR_NAME)] );
446 fprintf( pFile,
"( " );
447 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
448 fprintf( pFile,
".data(%s), ", Ndr_ObjReadOutName(
p, Obj, pNames) );
449 fprintf( pFile,
".mem_in(%s), ", pNames[pArray[0]] );
450 fprintf( pFile,
".addr(%s) ", pNames[pArray[1]] );
451 fprintf( pFile,
");\n" );
456 fprintf( pFile,
" %s ",
"ABC_WRITE" );
457 if ( Ndr_ObjReadBody(
p, Obj,
NDR_NAME) > 0 )
458 fprintf( pFile,
"%s ", pNames[Ndr_ObjReadBody(
p, Obj,
NDR_NAME)] );
459 fprintf( pFile,
"( " );
460 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
461 fprintf( pFile,
".mem_out(%s), ", Ndr_ObjReadOutName(
p, Obj, pNames) );
462 fprintf( pFile,
".mem_in(%s), ", pNames[pArray[0]] );
463 fprintf( pFile,
".addr(%s), ", pNames[pArray[1]] );
464 fprintf( pFile,
".data(%s) ", pNames[pArray[2]] );
465 fprintf( pFile,
");\n" );
470 if ( Ndr_ObjReadOutName(
p, Obj, pNames)[0] ==
'1' )
472 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
473 fprintf( pFile,
" %s ( %s", Abc_OperNameSimple(Type), Ndr_ObjReadOutName(
p, Obj, pNames) );
475 fprintf( pFile,
", %s );\n", (
char *)Ndr_ObjReadBodyP(
p, Obj,
NDR_FUNCTION) );
477 fprintf( pFile,
", %s );\n", pNames[pArray[0]] );
480 for ( i = 0; i < nArray; i++ )
481 fprintf( pFile,
", %s", pNames[pArray[i]] );
482 fprintf( pFile,
" );\n" );
486 fprintf( pFile,
" assign %s = ", Ndr_ObjReadOutName(
p, Obj, pNames) );
487 nArray = Ndr_ObjReadArray(
p, Obj,
NDR_INPUT, &pArray );
489 fprintf( pFile,
"%s;\n", (
char *)Ndr_ObjReadBodyP(
p, Obj,
NDR_FUNCTION) );
491 fprintf( pFile,
"%s;\n", pNames[pArray[0]] );
493 fprintf( pFile,
"%s", pNames[pArray[0]] ),
494 Ndr_ObjWriteRange(
p, Obj, pFile, 0 ),
495 fprintf( pFile,
";\n" );
498 fprintf( pFile,
"{" );
499 for ( i = 0; i < nArray; i++ )
500 fprintf( pFile,
"%s%s", pNames[pArray[i]], i==nArray-1 ?
"":
", " );
501 fprintf( pFile,
"};\n" );
503 else if ( nArray == 1 )
504 fprintf( pFile,
"%s %s;\n", Abc_OperName(Ndr_ObjReadBody(
p, Obj,
NDR_OPERTYPE)), pNames[pArray[0]] );
505 else if ( nArray == 2 )
506 fprintf( pFile,
"%s %s %s;\n", pNames[pArray[0]], Abc_OperName(Ndr_ObjReadBody(
p, Obj,
NDR_OPERTYPE)), pNames[pArray[1]] );
508 fprintf( pFile,
"%s + %s + %s;\n", pNames[pArray[0]], pNames[pArray[1]], pNames[pArray[2]] );
510 fprintf( pFile,
"%s ? %s : %s;\n", pNames[pArray[0]], pNames[pArray[2]], pNames[pArray[1]] );
512 fprintf( pFile,
"<cannot write operation %s>;\n", Abc_OperName(Ndr_ObjReadBody(
p, Obj,
NDR_OPERTYPE)) );
515 fprintf( pFile,
"\nendmodule\n\n" );
519static inline void Ndr_WriteVerilog(
char * pFileName,
void * pDesign,
char ** pNames,
int fSimple )
523 FILE * pFile = pFileName ? fopen( pFileName,
"wb" ) : stdout;
524 if ( pFile == NULL ) { printf(
"Cannot open file \"%s\" for writing.\n", pFileName ? pFileName :
"stdout" );
return; }
527 Ndr_WriteVerilogModule( pFile,
p, Mod, pNames, fSimple );
529 if ( pFileName ) fclose( pFile );
538static inline void * Ndr_Create(
int Name )
547 Ndr_DataAddTo(
p, 0,
p->nSize );
555static inline int Ndr_AddModule(
void * pDesign,
int Name )
559 Ndr_DataResize(
p, 6 );
562 Ndr_DataAddTo(
p, Mod,
p->nSize - Mod );
563 Ndr_DataAddTo(
p, 0,
p->nSize - Mod );
564 assert( (
int)
p->pBody[0] ==
p->nSize );
571static inline void Ndr_AddObject(
void * pDesign,
int ModuleId,
572 int ObjType,
int InstName,
573 int RangeLeft,
int RangeRight,
int fSignedness,
574 int nInputs,
int * pInputs,
575 int nOutputs,
int * pOutputs,
579 int Mod = ModuleId - 256;
580 int Obj =
p->nSize;
assert( ObjType != 0 );
581 Ndr_DataResize(
p, 6 );
584 Ndr_DataPushRange(
p, RangeLeft, RangeRight, fSignedness );
587 Ndr_DataPushArray(
p,
NDR_INPUT, nInputs, pInputs );
588 Ndr_DataPushArray(
p,
NDR_OUTPUT, nOutputs, pOutputs );
590 Ndr_DataAddTo(
p, Obj,
p->nSize - Obj );
591 Ndr_DataAddTo(
p, Mod,
p->nSize - Obj );
592 Ndr_DataAddTo(
p, 0,
p->nSize - Obj );
593 assert( (
int)
p->pBody[0] ==
p->nSize );
597static inline void Ndr_Delete(
void * pDesign )
612static inline void * Ndr_Read(
char * pFileName )
615 FILE * pFile = fopen( pFileName,
"rb" );
616 if ( pFile == NULL ) { printf(
"Cannot open file \"%s\" for reading.\n", pFileName );
return NULL; }
619 nFileSize = ftell( pFile );
620 if ( nFileSize % 5 != 0 )
622 assert( nFileSize % 5 == 0 );
626 p->nSize =
p->nCap = nFileSize / 5;
629 RetValue = (int)fread(
p->pBody, 4,
p->nCap, pFile );
630 RetValue = (int)fread(
p->pHead, 1,
p->nCap, pFile );
631 assert(
p->nSize == (
int)
p->pBody[0] );
636static inline void Ndr_Write(
char * pFileName,
void * pDesign )
639 FILE * pFile = fopen( pFileName,
"wb" );
640 if ( pFile == NULL ) { printf(
"Cannot open file \"%s\" for writing.\n", pFileName ? pFileName :
"stdout" );
return; }
641 RetValue = (int)fwrite(
p->pBody, 4,
p->pBody[0], pFile );
642 RetValue = (int)fwrite(
p->pHead, 1,
p->pBody[0], pFile );
660static inline void Ndr_ModuleTest()
667 int Fanins[2] = { NameIdA, NameIdC };
672 void * pDesign = Ndr_Create( 1 );
674 int ModuleID = Ndr_AddModule( pDesign, 1 );
677 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 3, 0, 0, 0, NULL, 1, &NameIdA, NULL );
678 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CONST, 0, 3, 0, 0, 0, NULL, 1, &NameIdC, (
char*)
"4'b1010" );
679 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_ARI_ADD, 0, 3, 0, 0, 2, Fanins, 1, &NameIdS, NULL );
680 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 3, 0, 0, 1, &NameIdS, 0, NULL, NULL );
684 Ndr_Write( (
char*)
"add4.ndr", pDesign );
685 Ndr_Delete( pDesign );
711static inline void Ndr_ModuleTestAdder()
740 int Fanins1[2] = { FaninA0, FaninB0 };
741 int Fanins2[3] = { FaninA1, FaninB1, FaninRCO };
742 int Fanins3[4] = { FaninS1, FaninS0 };
745 void * pDesign = Ndr_Create( 14 );
747 int ModuleID = Ndr_AddModule( pDesign, 14 );
750 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 7, 0, 0, 0, NULL, 1, &FaninA, NULL );
751 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 7, 0, 0, 0, NULL, 1, &FaninB, NULL );
753 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 3, 0, 0, 1, &FaninA, 1, &FaninA0, NULL );
754 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 3, 0, 0, 1, &FaninB, 1, &FaninB0, NULL );
756 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 7, 4, 0, 1, &FaninA, 1, &FaninA1, NULL );
757 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 7, 4, 0, 1, &FaninB, 1, &FaninB1, NULL );
759 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_ARI_ADD, 0, 4, 0, 0, 2, Fanins1, 1, &FaninR0, NULL );
760 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 3, 0, 0, 1, &FaninR0, 1, &FaninS0, NULL );
761 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 4, 4, 0, 1, &FaninR0, 1, &FaninRCO, NULL );
763 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_ARI_ADD, 0, 4, 0, 0, 3, Fanins2, 1, &FaninR1, NULL );
764 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 3, 0, 0, 1, &FaninR1, 1, &FaninS1, NULL );
765 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SLICE, 0, 4, 4, 0, 1, &FaninR1, 1, &FaninCO, NULL );
767 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CONCAT, 0, 7, 0, 0, 2, Fanins3, 1, &FaninS, NULL );
769 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 7, 0, 0, 1, &FaninS, 0, NULL, NULL );
770 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 0, 0, 0, 1, &FaninCO, 0, NULL, NULL );
774 Ndr_Write( (
char*)
"add8.ndr", pDesign );
775 Ndr_Delete( pDesign );
799static inline void Ndr_ModuleTestHierarchy()
824 int Fanins1[3] = { FaninSel, FaninD1, FaninD0 };
825 int Fanins3[3][3] = { {FaninSel0, FaninD1, FaninD0 },
826 {FaninSel0, FaninD3, FaninD2 },
827 {FaninSel1, FaninT1, FaninT0 } };
830 void * pDesign = Ndr_Create( 2 );
832 int Module21, Module41;
834 Module21 = Ndr_AddModule( pDesign, 1 );
836 Ndr_AddObject( pDesign, Module21,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &FaninSel, NULL );
837 Ndr_AddObject( pDesign, Module21,
ABC_OPER_CI, 0, 3, 0, 0, 0, NULL, 1, &FaninD1, NULL );
838 Ndr_AddObject( pDesign, Module21,
ABC_OPER_CI, 0, 3, 0, 0, 0, NULL, 1, &FaninD0, NULL );
839 Ndr_AddObject( pDesign, Module21,
ABC_OPER_BIT_MUX, 0, 3, 0, 0, 3, Fanins1, 1, &FaninOut, NULL );
840 Ndr_AddObject( pDesign, Module21,
ABC_OPER_CO, 0, 3, 0, 0, 1, &FaninOut, 0, NULL, NULL );
842 Module41 = Ndr_AddModule( pDesign, 2 );
844 Ndr_AddObject( pDesign, Module41,
ABC_OPER_CI, 0, 1, 0, 0, 0, NULL, 1, &FaninSel, NULL );
845 Ndr_AddObject( pDesign, Module41,
ABC_OPER_CI, 0, 15,0, 0, 0, NULL, 1, &FaninD, NULL );
847 Ndr_AddObject( pDesign, Module41,
ABC_OPER_SLICE, 0, 3, 0, 0, 1, &FaninD, 1, &FaninD0, NULL );
848 Ndr_AddObject( pDesign, Module41,
ABC_OPER_SLICE, 0, 7, 4, 0, 1, &FaninD, 1, &FaninD1, NULL );
849 Ndr_AddObject( pDesign, Module41,
ABC_OPER_SLICE, 0, 11,8, 0, 1, &FaninD, 1, &FaninD2, NULL );
850 Ndr_AddObject( pDesign, Module41,
ABC_OPER_SLICE, 0, 15,12,0, 1, &FaninD, 1, &FaninD3, NULL );
852 Ndr_AddObject( pDesign, Module41,
ABC_OPER_SLICE, 0, 0, 0, 0, 1, &FaninSel, 1, &FaninSel0, NULL );
853 Ndr_AddObject( pDesign, Module41,
ABC_OPER_SLICE, 0, 1, 1, 0, 1, &FaninSel, 1, &FaninSel1, NULL );
855 Ndr_AddObject( pDesign, Module41, Module21, 14, 3, 0, 0, 3, Fanins3[0], 1, &FaninT0, NULL );
856 Ndr_AddObject( pDesign, Module41, Module21, 15, 3, 0, 0, 3, Fanins3[1], 1, &FaninT1, NULL );
857 Ndr_AddObject( pDesign, Module41, Module21, 16, 3, 0, 0, 3, Fanins3[2], 1, &FaninOut, NULL );
858 Ndr_AddObject( pDesign, Module41,
ABC_OPER_CO, 0, 3, 0, 0, 1, &FaninOut, 0, NULL, NULL );
862 Ndr_Write( (
char*)
"mux41w.ndr", pDesign );
863 Ndr_Delete( pDesign );
888static inline void Ndr_ModuleTestMemory()
906 int NameIdMemInit = 5;
910 int FaninsFF1[2] = { 11, 5 };
911 int FaninsFF2[2] = { 12, 5 };
913 int NameIdWrite1 = 11;
914 int NameIdWrite2 = 12;
915 int FaninsWrite1[3] = { 9, 3, 4 };
916 int FaninsWrite2[3] = { 10, 3, 4 };
920 int FaninsRead1[2] = { 11, 2 };
921 int FaninsRead2[2] = { 12, 2 };
924 int FaninsComp[2] = { 7, 8 };
927 void * pDesign = Ndr_Create( 19 );
929 int ModuleID = Ndr_AddModule( pDesign, 19 );
932 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdClk, NULL );
933 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 8, 0, 0, 0, NULL, 1, &NameIdRaddr, NULL );
934 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 8, 0, 0, 0, NULL, 1, &NameIdWaddr, NULL );
935 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 31, 0, 0, 0, NULL, 1, &NameIdData, NULL );
936 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 16383, 0, 0, 0, NULL, 1, &NameIdMemInit, NULL );
938 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 0, 0, 0, 1, &NameIdComp, 0, NULL, NULL );
940 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_DFF, 13, 16383, 0, 0, 2, FaninsFF1, 1, &NameIdFF1, NULL );
941 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_DFF, 14, 16383, 0, 0, 2, FaninsFF2, 1, &NameIdFF2, NULL );
943 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_RAMW, 17, 16383, 0, 0, 3, FaninsWrite1, 1, &NameIdWrite1, NULL );
944 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_RAMW, 18, 16383, 0, 0, 3, FaninsWrite2, 1, &NameIdWrite2, NULL );
946 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_RAMR, 15, 31, 0, 0, 2, FaninsRead1, 1, &NameIdRead1, NULL );
947 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_RAMR, 16, 31, 0, 0, 2, FaninsRead2, 1, &NameIdRead2, NULL );
949 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_COMP_NOTEQU, 0, 0, 0, 0, 2, FaninsComp, 1, &NameIdComp, NULL );
953 Ndr_Write( (
char*)
"memtest.ndr", pDesign );
954 Ndr_Delete( pDesign );
964static inline void Ndr_ModuleTestFlop()
973 int NameIdEnable = 6;
979 int Fanins[8] = { NameIdData, NameIdClk, NameIdReset, NameIdSet, NameIdEnable, NameIdAsync, NameIdSre, NameIdInit };
982 void * pDesign = Ndr_Create( 1 );
984 int ModuleID = Ndr_AddModule( pDesign, 1 );
987 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 3, 0, 0, 0, NULL, 1, &NameIdData, NULL );
988 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdClk, NULL );
989 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdReset, NULL );
990 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdSet, NULL );
991 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdEnable, NULL );
992 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdAsync, NULL );
993 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdSre, NULL );
994 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 3, 0, 0, 0, NULL, 1, &NameIdInit, NULL );
996 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_DFFRSE, 0, 3, 0, 0, 8, Fanins, 1, &NameIdQ, NULL );
998 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 3, 0, 0, 1, &NameIdQ, 0, NULL, NULL );
1002 Ndr_Write( (
char*)
"flop.ndr", pDesign );
1003 Ndr_Delete( pDesign );
1024static inline void Ndr_ModuleTestSelSel()
1036 int Fanins[8] = { NameIdC, NameIdD0, NameIdD1, NameIdD2, NameIdD3 };
1039 void * pDesign = Ndr_Create( 1 );
1041 int ModuleID = Ndr_AddModule( pDesign, 1 );
1044 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 3, 0, 0, 0, NULL, 1, &NameIdC, NULL );
1045 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 2, 0, 0, 0, NULL, 1, &NameIdD0, NULL );
1046 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 2, 0, 0, 0, NULL, 1, &NameIdD1, NULL );
1047 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 2, 0, 0, 0, NULL, 1, &NameIdD2, NULL );
1048 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 2, 0, 0, 0, NULL, 1, &NameIdD3, NULL );
1050 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SEL_SEL, 0, 2, 0, 0, 5, Fanins, 1, &NameIdOut, NULL );
1052 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 2, 0, 0, 1, &NameIdOut,0, NULL, NULL );
1056 Ndr_Write( (
char*)
"sel.ndr", pDesign );
1057 Ndr_Delete( pDesign );
1071static inline void Ndr_ModuleTestDec()
1080 void * pDesign = Ndr_Create( 1 );
1082 int ModuleID = Ndr_AddModule( pDesign, 1 );
1085 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 1, 0, 0, 0, NULL, 1, &NameIdIn, NULL );
1086 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_SEL_DEC, 0, 3, 0, 0, 1, &NameIdIn, 1, &NameIdOut, NULL );
1087 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 3, 0, 0, 1, &NameIdOut, 0, NULL, NULL );
1089 Ndr_Write( (
char*)
"dec.ndr", pDesign );
1090 Ndr_Delete( pDesign );
1100static inline void Ndr_ModuleTestAddSub()
1105 int NameIdInMode = 2;
1106 int NameIdInCin = 3;
1110 int Fanins[8] = { 2, 3, 4, 5 };
1113 void * pDesign = Ndr_Create( 1 );
1115 int ModuleID = Ndr_AddModule( pDesign, 1 );
1118 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdInMode, NULL );
1119 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 0, 0, 0, 0, NULL, 1, &NameIdInCin, NULL );
1120 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 2, 0, 0, 0, NULL, 1, &NameIdInA, NULL );
1121 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 2, 0, 0, 0, NULL, 1, &NameIdInB, NULL );
1122 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_ARI_ADDSUB, 0, 3, 0, 0, 4, Fanins, 1, &NameIdOut, NULL );
1123 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 3, 0, 0, 1, &NameIdOut, 0, NULL, NULL );
1125 Ndr_Write( (
char*)
"addsub.ndr", pDesign );
1126 Ndr_Delete( pDesign );
1136static inline void Ndr_ModuleTestLut()
1145 void * pDesign = Ndr_Create( 1 );
1147 int ModuleID = Ndr_AddModule( pDesign, 1 );
1149 unsigned pTruth[2] = { 0x88888888, 0x88888888 };
1152 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CI, 0, 1, 0, 0, 0, NULL, 1, &NameIdIn, NULL );
1153 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_LUT, 0, 0, 0, 0, 1, &NameIdIn, 1, &NameIdOut, (
char *)pTruth );
1154 Ndr_AddObject( pDesign, ModuleID,
ABC_OPER_CO, 0, 0, 0, 0, 1, &NameIdOut, 0, NULL, NULL );
1156 Ndr_Write( (
char*)
"lut_test.ndr", pDesign );
1157 Ndr_Delete( pDesign );
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
Ndr_RecordType_t
INCLUDES ///.
#define Ndr_ModForEachObj(p, Mod, Obj)
#define NDR_ALLOC(type, num)
struct Ndr_Data_t_ Ndr_Data_t
BASIC TYPES ///.
#define Ndr_DesForEachMod(p, Mod)
ITERATORS ///.
#define Ndr_ModForEachPo(p, Mod, Obj)
#define Ndr_ObjForEachEntry(p, Obj, Ent)
#define Ndr_ModForEachPi(p, Mod, Obj)
#define Ndr_ModForEachNode(p, Mod, Obj)