ABC: A System for Sequential Synthesis and Verification
 
Loading...
Searching...
No Matches
cbaReadVer.c
Go to the documentation of this file.
1
20
21#include "cba.h"
22#include "cbaPrs.h"
23
25
29
30static const char * s_VerTypes[PRS_VER_UNKNOWN+1] = {
31 NULL, // 0: unused
32 "input", // 1: input
33 "output", // 2: output
34 "inout", // 3: inout
35 "wire", // 4: wire
36 "reg", // 5: reg
37 "module", // 6: module
38 "assign", // 7: assign
39 "always", // 8: always
40 "function", // 9: function
41 "defparam", // 10: defparam
42 "begin", // 11: begin
43 "end", // 12: end
44 "case", // 13: case
45 "endcase", // 14: endcase
46 "signed", // 15: signed
47 "endmodule", // 16: endmodule
48 NULL // 17: unknown
49};
50
52{
53 int i;
54 for ( i = 1; s_VerTypes[i]; i++ )
55 Abc_NamStrFindOrAdd( p->pStrs, (char *)s_VerTypes[i], NULL );
56 assert( Abc_NamObjNumMax(p->pStrs) == i );
57}
58
59
60// character recognition
61static inline int Prs_CharIsSpace( char c ) { return (c == ' ' || c == '\t' || c == '\r' || c == '\n'); }
62static inline int Prs_CharIsDigit( char c ) { return (c >= '0' && c <= '9'); }
63static inline int Prs_CharIsDigitB( char c ) { return (c == '0' || c == '1' || c == 'x' || c == 'z'); }
64static inline int Prs_CharIsDigitH( char c ) { return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f'); }
65static inline int Prs_CharIsChar( char c ) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); }
66static inline int Prs_CharIsSymb1( char c ) { return Prs_CharIsChar(c) || c == '_'; }
67static inline int Prs_CharIsSymb2( char c ) { return Prs_CharIsSymb1(c) || Prs_CharIsDigit(c) || c == '$'; }
68
69static inline int Prs_ManIsChar( Prs_Man_t * p, char c ) { return p->pCur[0] == c; }
70static inline int Prs_ManIsChar1( Prs_Man_t * p, char c ) { return p->pCur[1] == c; }
71static inline int Prs_ManIsDigit( Prs_Man_t * p ) { return Prs_CharIsDigit(*p->pCur); }
72
76
88
89// predefined primitives
92{
93 int Type;
94 char * pName;
95};
96static const Prs_VerPrim_t s_VerilogPrims[16] =
97{
98 {CBA_BOX_BUF, "buf" },
99 {CBA_BOX_INV, "not" },
100 {CBA_BOX_AND, "and" },
101 {CBA_BOX_NAND, "nand" },
102 {CBA_BOX_OR, "or" },
103 {CBA_BOX_NOR, "nor" },
104 {CBA_BOX_XOR, "xor" },
105 {CBA_BOX_XNOR, "xnor" },
106 {CBA_BOX_TRI, "bufif1"},
107 {0}
108};
109
110// predefined operator names
111static const char * s_VerNames[100] =
112{
113 NULL,
114 "VERIFIC_",
115 "add_",
116 "mult_",
117 "div_",
118 "mod_",
119 "rem_",
120 "shift_left_",
121 "shift_right_",
122 "rotate_left_",
123 "rotate_right_",
124 "reduce_and_",
125 "reduce_or_",
126 "reduce_xor_",
127 "reduce_nand_",
128 "reduce_nor_",
129 "reduce_xnor_",
130 "LessThan_",
131 "Mux_",
132 "Select_",
133 "Decoder_",
134 "EnabledDecoder_",
135 "PrioSelect_",
136 "DualPortRam_",
137 "ReadPort_",
138 "WritePort_",
139 "ClockedWritePort_",
140 "lut",
141 "and_",
142 "or_",
143 "xor_",
144 "nand_",
145 "nor_",
146 "xnor_",
147 "buf_",
148 "inv_",
149 "tri_",
150 "sub_",
151 "unary_minus_",
152 "equal_",
153 "not_equal_",
154 "mux_",
155 "wide_mux_",
156 "wide_select_",
157 "wide_dff_",
158 "wide_dlatch_",
159 "wide_dffrs_",
160 "wide_dlatchrs_",
161 "wide_prio_select_",
162 "pow_",
163 "PrioEncoder_",
164 "abs_",
165 "CPL_NMACROFF",
166 "CPL_MACROFF",
167 "CPL_FF",
168 NULL
169};
170
173{
174 int Type;
176 char * pTypeName;
177 char * pSigNames[6];
178};
179static const Prs_VerInfo_t s_VerInfo[100] =
180{
181 {-1, 0, NULL, /* "PRIM_NONE" */ {NULL}},
182 {CBA_BOX_CT, 0, "VERIFIC_PWR", /* "PRIM_PWR" */ {"o"}},
183 {CBA_BOX_CF, 0, "VERIFIC_GND", /* "PRIM_GND" */ {"o"}},
184 {CBA_BOX_CX, 0, "VERIFIC_X", /* "PRIM_X" */ {"o"}},
185 {CBA_BOX_CZ, 0, "VERIFIC_Z", /* "PRIM_Z" */ {"o"}},
186 {CBA_BOX_INV, 1, "VERIFIC_INV", /* "PRIM_INV" */ {"i","o"}},
187 {CBA_BOX_BUF, 1, "VERIFIC_BUF", /* "PRIM_BUF" */ {"i","o"}},
188 {CBA_BOX_AND, 1, "VERIFIC_AND", /* "PRIM_AND" */ {"a0","a1","o"}},
189 {CBA_BOX_NAND, 2, "VERIFIC_NAND", /* "PRIM_NAND" */ {"a0","a1","o"}},
190 {CBA_BOX_OR, 2, "VERIFIC_OR", /* "PRIM_OR" */ {"a0","a1","o"}},
191 {CBA_BOX_NOR, 2, "VERIFIC_NOR", /* "PRIM_NOR" */ {"a0","a1","o"}},
192 {CBA_BOX_XOR, 2, "VERIFIC_XOR", /* "PRIM_XOR" */ {"a0","a1","o"}},
193 {CBA_BOX_XNOR, 2, "VERIFIC_XNOR", /* "PRIM_XNOR" */ {"a0","a1","o"}},
194 {CBA_BOX_MUX, 3, "VERIFIC_MUX", /* "PRIM_MUX" */ {"c","a1","a0","o"}}, // changed order
195 {-1, 0, "VERIFIC_PULLUP", /* "PRIM_PULLUP" */ {"o"}},
196 {-1, 0, "VERIFIC_PULLDOWN", /* "PRIM_PULLDOWN" */ {"o"}},
197 {CBA_BOX_TRI, 3, "VERIFIC_TRI", /* "PRIM_TRI" */ {"i","c","o"}},
198 {CBA_BOX_LATCHRS, 4, "VERIFIC_DLATCHRS", /* "PRIM_DLATCHRS" */ {"d","s","r","gate","q"}}, // changed order
199 {CBA_BOX_LATCH, 4, "VERIFIC_DLATCH", /* "PRIM_DLATCH" */ {"d","async_val","async_cond","gate","q"}}, // changed order
200 {CBA_BOX_DFFRS, 4, "VERIFIC_DFFRS", /* "PRIM_DFFRS" */ {"d","s","r","clk","q"}}, // changed order
201 {CBA_BOX_DFF, 4, "VERIFIC_DFF", /* "PRIM_DFF" */ {"d","async_val","async_cond","clk","q"}}, // changed order
202 {-1, 2, "VERIFIC_NMOS", /* "PRIM_NMOS" */ {"c","d","o"}},
203 {-1, 2, "VERIFIC_PMOS", /* "PRIM_PMOS" */ {"c","d","o"}},
204 {-1, 3, "VERIFIC_CMOS", /* "PRIM_CMOS" */ {"d","nc","pc","o"}},
205 {-1, 2, "VERIFIC_TRAN", /* "PRIM_TRAN" */ {"inout1","inout2","control"}},
206 {CBA_BOX_ADD, 3, "VERIFIC_FADD", /* "PRIM_FADD" */ {"cin","a","b","o","cout"}},
207 {-1, 3, "VERIFIC_RCMOS", /* "PRIM_RCMOS" */ {"d","nc","pc","o"}},
208 {-1, 2, "VERIFIC_RNMOS", /* "PRIM_RNMOS" */ {"c","d","o"}},
209 {-1, 2, "VERIFIC_RPMOS", /* "PRIM_RPMOS" */ {"c","d","o"}},
210 {-1, 2, "VERIFIC_RTRAN", /* "PRIM_RTRAN" */ {"inout1","inout2","control"}},
211 {-1, 0, "VERIFIC_HDL_ASSERTION", /* "PRIM_HDL_ASSERTION" */ {"condition"}},
212 {CBA_BOX_ADD, 3, "add_", /* "OPER_ADDER" */ {"cin","a","b","o","cout"}},
213 {CBA_BOX_MUL, 2, "mult_", /* "OPER_MULTIPLIER" */ {"a","b","o"}},
214 {CBA_BOX_DIV, 2, "div_", /* "OPER_DIVIDER" */ {"a","b","o"}},
215 {CBA_BOX_MOD, 2, "mod_", /* "OPER_MODULO" */ {"a","b","o"}},
216 {CBA_BOX_REM, 2, "rem_", /* "OPER_REMAINDER" */ {"a","b","o"}},
217 {CBA_BOX_SHIL, 3, "shift_left_", /* "OPER_SHIFT_LEFT" */ {"cin","a","amount","o"}},
218 {CBA_BOX_SHIR, 3, "shift_right_", /* "OPER_SHIFT_RIGHT" */ {"cin","a","amount","o"}},
219 {CBA_BOX_ROTL, 2, "rotate_left_", /* "OPER_ROTATE_LEFT" */ {"a","amount","o"}},
220 {CBA_BOX_ROTR, 2, "rotate_right_", /* "OPER_ROTATE_RIGHT" */ {"a","amount","o"}},
221 {CBA_BOX_RAND, 1, "reduce_and_", /* "OPER_REDUCE_AND" */ {"a","o"}},
222 {CBA_BOX_ROR, 1, "reduce_or_", /* "OPER_REDUCE_OR" */ {"a","o"}},
223 {CBA_BOX_RXOR, 1, "reduce_xor_", /* "OPER_REDUCE_XOR" */ {"a","o"}},
224 {CBA_BOX_RNAND, 1, "reduce_nand_", /* "OPER_REDUCE_NAND" */ {"a","o"}},
225 {CBA_BOX_RNOR, 1, "reduce_nor_", /* "OPER_REDUCE_NOR" */ {"a","o"}},
226 {CBA_BOX_RXNOR, 1, "reduce_xnor_", /* "OPER_REDUCE_XNOR" */ {"a","o"}},
227 {CBA_BOX_LTHAN, 3, "LessThan_", /* "OPER_LESSTHAN" */ {"cin","a","b","o"}},
228 {CBA_BOX_NMUX, 2, "Mux_", /* "OPER_NTO1MUX" */ {"sel","data","o"}},
229 {CBA_BOX_SEL, 2, "Select_", /* "OPER_SELECTOR" */ {"sel","data","o"}},
230 {CBA_BOX_DEC, 1, "Decoder_", /* "OPER_DECODER" */ {"a","o"}},
231 {CBA_BOX_EDEC, 2, "EnabledDecoder_", /* "OPER_ENABLED_DECODER" */ {"en","i","o"}},
232 {CBA_BOX_PSEL, 3, "PrioSelect_", /* "OPER_PRIO_SELECTOR" */ {"cin","sel","data","o"}},
233 {CBA_BOX_RAM, 4, "DualPortRam_", /* "OPER_DUAL_PORT_RAM" */ {"write_enable","write_address","write_data","read_address","read_data"}},
234 {CBA_BOX_RAMR, 3, "ReadPort_", /* "OPER_READ_PORT" */ {"read_enable", "read_address", "Ram", "read_data" }},
235 {CBA_BOX_RAMW, 3, "WritePort_", /* "OPER_WRITE_PORT" */ {"write_enable","write_address","write_data", "Ram"}},
236 {CBA_BOX_RAMWC, 4, "ClockedWritePort_", /* "OPER_CLOCKED_WRITE_PORT" */ {"clk","write_enable","write_address","write_data", "Ram"}},
237 {CBA_BOX_LUT, 1, "lut", /* "OPER_LUT" */ {"i","o"}},
238 {CBA_BOX_AND, 2, "and_", /* "OPER_WIDE_AND" */ {"a","b","o"}},
239 {CBA_BOX_OR, 2, "or_", /* "OPER_WIDE_OR" */ {"a","b","o"}},
240 {CBA_BOX_XOR, 2, "xor_", /* "OPER_WIDE_XOR" */ {"a","b","o"}},
241 {CBA_BOX_NAND, 2, "nand_", /* "OPER_WIDE_NAND" */ {"a","b","o"}},
242 {CBA_BOX_NOR, 2, "nor_", /* "OPER_WIDE_NOR" */ {"a","b","o"}},
243 {CBA_BOX_XNOR, 2, "xnor_", /* "OPER_WIDE_XNOR" */ {"a","b","o"}},
244 {CBA_BOX_BUF, 1, "buf_", /* "OPER_WIDE_BUF" */ {"i","o"}},
245 {CBA_BOX_INV, 1, "inv_", /* "OPER_WIDE_INV" */ {"i","o"}},
246 {CBA_BOX_TRI, 2, "tri_", /* "OPER_WIDE_TRI" */ {"i","c","o"}},
247 {CBA_BOX_SUB, 2, "sub_", /* "OPER_MINUS" */ {"a","b","o"}},
248 {CBA_BOX_MIN, 1, "unary_minus_", /* "OPER_UMINUS" */ {"i","o"}},
249 {CBA_BOX_EQU, 2, "equal_", /* "OPER_EQUAL" */ {"a","b","o"}},
250 {CBA_BOX_NEQU, 2, "not_equal_", /* "OPER_NEQUAL" */ {"a","b","o"}},
251 {CBA_BOX_MUX, 3, "mux_", /* "OPER_WIDE_MUX" */ {"cond","d1","d0","o"}}, // changed order
252 {CBA_BOX_NMUX, 2, "wide_mux_", /* "OPER_WIDE_NTO1MUX" */ {"sel","data","o"}},
253 {CBA_BOX_SEL, 2, "wide_select_", /* "OPER_WIDE_SELECTOR" */ {"sel","data","o"}},
254 {CBA_BOX_DFF, 4, "wide_dff_", /* "OPER_WIDE_DFF" */ {"d","async_val","async_cond","clock","q"}},
255 {CBA_BOX_DFFRS, 4, "wide_dffrs_", /* "OPER_WIDE_DFFRS" */ {"d","set","reset","clock","q"}},
256 {CBA_BOX_LATCHRS, 4, "wide_dlatchrs_", /* "OPER_WIDE_DLATCHRS" */ {"d","set","reset","clock","q"}},
257 {CBA_BOX_LATCH, 4, "wide_dlatch_", /* "OPER_WIDE_DLATCH" */ {"d","async_val","async_cond","clock","q"}},
258 {CBA_BOX_PSEL, 3, "wide_prio_select_", /* "OPER_WIDE_PRIO_SELECTOR" */ {"sel","data","carry_in","o"}},
259 {CBA_BOX_POW, 2, "pow_", /* "OPER_POW" */ {"a","b","o"}},
260 {CBA_BOX_PENC, 1, "PrioEncoder_", /* "OPER_PRIO_ENCODER" */ {"sel","o"}},
261 {CBA_BOX_ABS, 1, "abs_", /* "OPER_ABS" */ {"i","o"}},
262 {CBA_BOX_DFFCPL, 4, "CPL_FF", /* "OPER_WIDE_DFF - 2" */ {"d","arstval","arst","clk","q","qbar"}},
263 {-1, 0, NULL, /* "PRIM_END" */ {NULL}}
264};
265
266
267// check if it is a Verilog predefined module
268static inline int Prs_ManIsVerilogPrim( char * pName )
269{
270 int i;
271 for ( i = 0; s_VerilogPrims[i].pName; i++ )
272 if ( !strcmp(pName, s_VerilogPrims[i].pName) )
273 return s_VerilogPrims[i].Type;
274 return 0;
275}
276// check if it is a known module
277static inline int Prs_ManIsKnownModule( char * pName )
278{
279 int i, Length;
280 for ( i = 1; s_VerNames[i]; i++ )
281 {
282 Length = strlen(s_VerNames[i]);
283// if ( !strncmp(pName, s_VerNames[i], Length) && (i == 1 || (pName[Length] >= '0' && pName[Length] <= '9')) )
284 if ( !strncmp(pName, s_VerNames[i], Length) )
285 return i;
286 }
287 return 0;
288}
289// check if it is a known module
290static inline int Prs_ManFindType( char * pName, int * pInputs, int fOut, char *** ppNames )
291{
292 int i, Length;
293 *pInputs = -1;
294 for ( i = 1; s_VerInfo[i].pTypeName; i++ )
295 {
296 Length = strlen(s_VerInfo[i].pTypeName);
297 if ( !strncmp(pName, s_VerInfo[i].pTypeName, Length) )
298 {
299 *pInputs = s_VerInfo[i].nInputs;
300 *ppNames = (char **)s_VerInfo[i].pSigNames + (fOut ? s_VerInfo[i].nInputs : 0);
301 return s_VerInfo[i].Type;
302 }
303 }
304 return CBA_OBJ_BOX;
305}
306
318
319// skips Verilog comments (returns 1 if some comments were skipped)
320static inline int Prs_ManUtilSkipComments( Prs_Man_t * p )
321{
322 if ( !Prs_ManIsChar(p, '/') )
323 return 0;
324 if ( Prs_ManIsChar1(p, '/') )
325 {
326 for ( p->pCur += 2; p->pCur < p->pLimit; p->pCur++ )
327 if ( Prs_ManIsChar(p, '\n') )
328 { p->pCur++; return 1; }
329 }
330 else if ( Prs_ManIsChar1(p, '*') )
331 {
332 for ( p->pCur += 2; p->pCur < p->pLimit; p->pCur++ )
333 if ( Prs_ManIsChar(p, '*') && Prs_ManIsChar1(p, '/') )
334 { p->pCur++; p->pCur++; return 1; }
335 }
336 return 0;
337}
338static inline int Prs_ManUtilSkipName( Prs_Man_t * p )
339{
340 if ( !Prs_ManIsChar(p, '\\') )
341 return 0;
342 for ( p->pCur++; p->pCur < p->pLimit; p->pCur++ )
343 if ( Prs_ManIsChar(p, ' ') )
344 { p->pCur++; return 1; }
345 return 0;
346}
347
348// skip any number of spaces and comments
349static inline int Prs_ManUtilSkipSpaces( Prs_Man_t * p )
350{
351 while ( p->pCur < p->pLimit )
352 {
353 while ( Prs_CharIsSpace(*p->pCur) )
354 p->pCur++;
355 if ( !*p->pCur )
356 return Prs_ManErrorSet(p, "Unexpectedly reached end-of-file.", 1);
357 if ( !Prs_ManUtilSkipComments(p) )
358 return 0;
359 }
360 return Prs_ManErrorSet(p, "Unexpectedly reached end-of-file.", 1);
361}
362// skip everything including comments until the given char
363static inline int Prs_ManUtilSkipUntil( Prs_Man_t * p, char c )
364{
365 while ( p->pCur < p->pLimit )
366 {
367 if ( Prs_ManIsChar(p, c) )
368 return 1;
369 if ( Prs_ManUtilSkipComments(p) )
370 continue;
371 if ( Prs_ManUtilSkipName(p) )
372 continue;
373 p->pCur++;
374 }
375 return 0;
376}
377// skip everything including comments until the given word
378static inline int Prs_ManUtilSkipUntilWord( Prs_Man_t * p, char * pWord )
379{
380 char * pPlace = strstr( p->pCur, pWord );
381 if ( pPlace == NULL ) return 1;
382 p->pCur = pPlace + strlen(pWord);
383 return 0;
384}
385// detect two symbols on the same line
386static inline int Prs_ManUtilDetectTwo( Prs_Man_t * p, char Sym1, char Sym2 )
387{
388 char * pTemp;
389 for ( pTemp = p->pCur; *pTemp != ';'; pTemp++ )
390 if ( *pTemp == Sym1 && *pTemp == Sym2 )
391 return 1;
392 return 0;
393}
394// find closing paren
395static inline char * Prs_ManFindClosingParenthesis( Prs_Man_t * p, char Open, char Close )
396{
397 char * pTemp;
398 int Counter = 0;
399 int fNotName = 1;
400 assert( Prs_ManIsChar(p, Open) );
401 for ( pTemp = p->pCur; *pTemp; pTemp++ )
402 {
403 if ( fNotName )
404 {
405 if ( *pTemp == Open )
406 Counter++;
407 if ( *pTemp == Close )
408 Counter--;
409 if ( Counter == 0 )
410 return pTemp;
411 }
412 if ( *pTemp == '\\' )
413 fNotName = 0;
414 else if ( !fNotName && *pTemp == ' ' )
415 fNotName = 1;
416 }
417 return NULL;
418}
419
431static inline int Prs_ManReadName( Prs_Man_t * p )
432{
433 char * pStart = p->pCur;
434 if ( Prs_ManIsChar(p, '\\') ) // escaped name
435 {
436 pStart = ++p->pCur;
437 while ( !Prs_ManIsChar(p, ' ') )
438 p->pCur++;
439 }
440 else if ( Prs_CharIsSymb1(*p->pCur) ) // simple name
441 {
442 p->pCur++;
443 while ( Prs_CharIsSymb2(*p->pCur) )
444 p->pCur++;
445 }
446 else
447 return 0;
448 return Abc_NamStrFindOrAddLim( p->pStrs, pStart, p->pCur, NULL );
449}
450static inline int Prs_ManReadNameList( Prs_Man_t * p, Vec_Int_t * vTemp, char LastSymb )
451{
452 Vec_IntClear( vTemp );
453 while ( 1 )
454 {
455 int Item = Prs_ManReadName(p);
456 if ( Item == 0 ) return Prs_ManErrorSet(p, "Cannot read name in the list.", 0);
457 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 1.", 0);
458 if ( Item == PRS_VER_WIRE )
459 continue;
460 Vec_IntPush( vTemp, Item );
461 if ( Prs_ManIsChar(p, LastSymb) ) break;
462 if ( !Prs_ManIsChar(p, ',') ) return Prs_ManErrorSet(p, "Expecting comma in the list.", 0);
463 p->pCur++;
464 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 2.", 0);
465 }
466 return 1;
467}
468static inline int Prs_ManReadConstant( Prs_Man_t * p )
469{
470 char * pStart = p->pCur;
471 assert( Prs_ManIsDigit(p) );
472 while ( Prs_ManIsDigit(p) )
473 p->pCur++;
474 if ( !Prs_ManIsChar(p, '\'') )
475 return Abc_NamStrFindOrAddLim( p->pFuns, pStart, p->pCur, NULL );
476 p->pCur++;
477 if ( Prs_ManIsChar(p, 's') )
478 p->pCur++;
479 if ( Prs_ManIsChar(p, 'b') )
480 {
481 p->pCur++;
482 while ( Prs_CharIsDigitB(*p->pCur) )
483 {
484 if ( *p->pCur == '0' )
485 p->pNtk->fHasC0s = 1;
486 else if ( *p->pCur == '1' )
487 p->pNtk->fHasC1s = 1;
488 else if ( *p->pCur == 'x' )
489 p->pNtk->fHasCXs = 1;
490 else if ( *p->pCur == 'z' )
491 p->pNtk->fHasCZs = 1;
492 p->pCur++;
493 }
494 }
495 else if ( Prs_ManIsChar(p, 'h') )
496 {
497 p->pCur++;
498 p->pNtk->fHasC0s = 1;
499 while ( Prs_CharIsDigitH(*p->pCur) )
500 {
501 if ( *p->pCur != '0' )
502 p->pNtk->fHasC1s = 1;
503 p->pCur++;
504 }
505 }
506 else if ( Prs_ManIsChar(p, 'd') )
507 {
508 p->pCur++;
509 p->pNtk->fHasC0s = 1;
510 while ( Prs_ManIsDigit(p) )
511 {
512 if ( *p->pCur != '0' )
513 p->pNtk->fHasC1s = 1;
514 p->pCur++;
515 }
516 }
517 else return Prs_ManErrorSet(p, "Cannot read radix of constant.", 0);
518 return Abc_NamStrFindOrAddLim( p->pFuns, pStart, p->pCur, NULL );
519}
520static inline int Prs_ManReadRange( Prs_Man_t * p )
521{
522 int Left, Right;
523 assert( Prs_ManIsChar(p, '[') );
524 p->pCur++;
525 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 3.", 0);
526 if ( !Prs_ManIsDigit(p) ) return Prs_ManErrorSet(p, "Cannot read digit in range specification.", 0);
527 Left = Right = atoi(p->pCur);
528 while ( Prs_ManIsDigit(p) )
529 p->pCur++;
530 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 4.", 0);
531 if ( Prs_ManIsChar(p, ':') )
532 {
533 p->pCur++;
534 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 5.", 0);
535 if ( !Prs_ManIsDigit(p) ) return Prs_ManErrorSet(p, "Cannot read digit in range specification.", 0);
536 Right = atoi(p->pCur);
537 while ( Prs_ManIsDigit(p) )
538 p->pCur++;
539 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 6.", 0);
540 }
541 if ( !Prs_ManIsChar(p, ']') ) return Prs_ManErrorSet(p, "Cannot read closing brace in range specification.", 0);
542 p->pCur++;
543 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 6a.", 0);
544 return Hash_Int2ManInsert( p->vHash, Left, Right, 0 );
545}
546static inline int Prs_ManReadConcat( Prs_Man_t * p, Vec_Int_t * vTemp2 )
547{
548 extern int Prs_ManReadSignalList( Prs_Man_t * p, Vec_Int_t * vTemp, char LastSymb, int fAddForm );
549 assert( Prs_ManIsChar(p, '{') );
550 p->pCur++;
551 if ( !Prs_ManReadSignalList( p, vTemp2, '}', 0 ) ) return Prs_ManErrorSet(p, "Error number 7.", 0);
552 // check final
553 assert( Prs_ManIsChar(p, '}') );
554 p->pCur++;
555 // return special case
556 assert( Vec_IntSize(vTemp2) > 0 );
557 if ( Vec_IntSize(vTemp2) == 1 )
558 return Vec_IntEntry(vTemp2, 0);
559 return Abc_Var2Lit2( Prs_NtkAddConcat(p->pNtk, vTemp2), CBA_PRS_CONCAT );
560}
561static inline int Prs_ManReadSignal( Prs_Man_t * p )
562{
563 int Item;
564 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 8.", 0);
565 if ( Prs_ManIsDigit(p) )
566 {
567 Item = Prs_ManReadConstant(p);
568 if ( Item == 0 ) return 0;
569 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 10.", 0);
570 return Abc_Var2Lit2( Item, CBA_PRS_CONST );
571 }
572 if ( Prs_ManIsChar(p, '{') )
573 {
574 if ( Prs_CharIsDigit(p->pCur[1]) )
575 {
576 p->pCur++;
577 if ( Prs_ManIsDigit(p) )
578 {
579 int i, Num = atoi(p->pCur);
580 while ( Prs_ManIsDigit(p) )
581 p->pCur++;
582 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 10.", 0);
583 assert( Prs_ManIsChar(p, '{') );
584 p->pCur++;
585 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 10.", 0);
586 Item = Prs_ManReadSignal( p );
587 assert( Prs_ManIsChar(p, '}') );
588 p->pCur++;
589 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 10.", 0);
590 // add to concat all, expect the last one
591 assert( p->fUsingTemp2 );
592 for ( i = 0; i < Num-1; i++ )
593 Vec_IntPush( &p->vTemp2, Item );
594 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 10.", 0);
595 assert( Prs_ManIsChar(p, '}') );
596 p->pCur++;
597 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 10.", 0);
598 return Item;
599 }
600 }
601 if ( p->fUsingTemp2 ) return Prs_ManErrorSet(p, "Cannot read nested concatenations.", 0);
602 p->fUsingTemp2 = 1;
603 Item = Prs_ManReadConcat(p, &p->vTemp2);
604 p->fUsingTemp2 = 0;
605 if ( Item == 0 ) return 0;
606 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 12.", 0);
607 return Item;
608 }
609 else
610 {
611 Item = Prs_ManReadName( p );
612 if ( Item == 0 ) return 1; // no actual name
613 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 14.", 0);
614 if ( Prs_ManIsChar(p, '[') )
615 {
616 int Range = Prs_ManReadRange(p);
617 if ( Range == 0 ) return Prs_ManErrorSet(p, "Error number 15.", 0);
618 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 16.", 0);
619 return Abc_Var2Lit2( Prs_NtkAddSlice(p->pNtk, Item, Range), CBA_PRS_SLICE );
620 }
621 return Abc_Var2Lit2( Item, CBA_PRS_NAME );
622 }
623}
624int Prs_ManReadSignalList( Prs_Man_t * p, Vec_Int_t * vTemp, char LastSymb, int fAddForm )
625{
626 Vec_IntClear( vTemp );
627 while ( 1 )
628 {
629 int Item = Prs_ManReadSignal(p);
630 if ( Item == 0 ) return Prs_ManErrorSet(p, "Cannot read signal in the list.", 0);
631 if ( fAddForm )
632 Vec_IntPush( vTemp, 0 );
633 Vec_IntPush( vTemp, Item );
634 if ( Prs_ManIsChar(p, LastSymb) ) break;
635 if ( !Prs_ManIsChar(p, ',') ) return Prs_ManErrorSet(p, "Expecting comma in the list.", 0);
636 p->pCur++;
637 }
638 return 1;
639}
640static inline int Prs_ManReadSignalList2( Prs_Man_t * p, Vec_Int_t * vTemp )
641{
642 int FormId, ActItem;
643 Vec_IntClear( vTemp );
644 assert( Prs_ManIsChar(p, '.') );
645 while ( Prs_ManIsChar(p, '.') )
646 {
647 p->pCur++;
648 FormId = Prs_ManReadName( p );
649 if ( FormId == 0 ) return Prs_ManErrorSet(p, "Cannot read formal name of the instance.", 0);
650 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 17.", 0);
651 if ( !Prs_ManIsChar(p, '(') ) return Prs_ManErrorSet(p, "Cannot read \"(\" in the instance.", 0);
652 p->pCur++;
653 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 17.", 0);
654 ActItem = Prs_ManReadSignal( p );
655 if ( ActItem == 0 ) return Prs_ManErrorSet(p, "Cannot read actual name of an instance.", 0);
656 if ( !Prs_ManIsChar(p, ')') ) return Prs_ManErrorSet(p, "Cannot read \")\" in the instance.", 0);
657 p->pCur++;
658 if ( ActItem != 1 )
659 Vec_IntPushTwo( vTemp, FormId, ActItem );
660 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 18.", 0);
661 if ( Prs_ManIsChar(p, ')') ) break;
662 if ( !Prs_ManIsChar(p, ',') ) return Prs_ManErrorSet(p, "Expecting comma in the instance.", 0);
663 p->pCur++;
664 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 19.", 0);
665 }
666 assert( Vec_IntSize(vTemp) > 0 );
667 assert( Vec_IntSize(vTemp) % 2 == 0 );
668 return 1;
669}
670
682static inline int Prs_ManReadFunction( Prs_Man_t * p )
683{
684 // this is a hack to read functions produced by ABC Verilog writer
685 p->FuncNameId = p->FuncRangeId = 0;
686 if ( Prs_ManUtilSkipUntilWord( p, "_func_" ) ) return Prs_ManErrorSet(p, "Cannot find \"_func_\" keyword.", 0);
687 p->pCur -= 6;
688 p->FuncNameId = Prs_ManReadName( p );
689 if ( p->FuncNameId == 0 ) return Prs_ManErrorSet(p, "Error number 30a.", 0);
690 if ( Prs_ManUtilSkipUntilWord( p, "input" ) ) return Prs_ManErrorSet(p, "Cannot find \"input\" keyword.", 0);
691 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 30b.", 0);
692 if ( Prs_ManIsChar(p, '[') )
693 p->FuncRangeId = Prs_ManReadRange(p);
694 else if ( Prs_ManReadName(p) == PRS_VER_SIGNED )
695 {
696 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 30c.", 0);
697 if ( Prs_ManIsChar(p, '[') )
698 p->FuncRangeId = Prs_ManReadRange(p);
699 }
700 if ( Prs_ManUtilSkipUntilWord( p, "endfunction" ) ) return Prs_ManErrorSet(p, "Cannot find \"endfunction\" keyword.", 0);
701 return 1;
702}
703static inline int Prs_ManReadAlways( Prs_Man_t * p )
704{
705 // this is a hack to read always-statement representing case-statement
706 int iToken;
707 char * pClose;
708 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23.", 0);
709 if ( !Prs_ManIsChar(p, '@') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
710 p->pCur++;
711 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
712 if ( !Prs_ManIsChar(p, '(') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
713 pClose = Prs_ManFindClosingParenthesis( p, '(', ')' );
714 if ( pClose == NULL )
715 return Prs_ManErrorSet(p, "Expecting closing parenthesis 1.", 0);
716 p->pCur = pClose;
717 if ( !Prs_ManIsChar(p, ')') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
718 p->pCur++;
719 // read begin
720 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
721 iToken = Prs_ManReadName( p );
722 if ( iToken != PRS_VER_BEGIN ) return Prs_ManErrorSet(p, "Cannot read \"begin\" keyword.", 0);
723 // read case
724 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
725 iToken = Prs_ManReadName( p );
726 if ( iToken != PRS_VER_CASE ) return Prs_ManErrorSet(p, "Cannot read \"case\" keyword.", 0);
727 // read control
728 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
729 if ( !Prs_ManIsChar(p, '(') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
730 p->pCur++;
731 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
732 iToken = Prs_ManReadSignal( p );
733 if ( iToken == 0 ) return Prs_ManErrorSet(p, "Cannot read output in assign-statement.", 0);
734 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
735 if ( !Prs_ManIsChar(p, ')') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
736 p->pCur++;
737 // save control
738 Vec_IntClear( &p->vTemp3 );
739 Vec_IntPushTwo( &p->vTemp3, 0, 0 ); // output will go here
740 Vec_IntPushTwo( &p->vTemp3, 0, iToken );
741 // read conditions
742 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
743 if ( !Prs_ManIsDigit(p) ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
744 while ( Prs_ManIsDigit(p) )
745 {
746 while ( Prs_ManIsDigit(p) )
747 p->pCur++;
748 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
749 if ( !Prs_ManIsChar(p, ':') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
750 p->pCur++;
751 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
752 // read output
753 iToken = Prs_ManReadSignal( p );
754 if ( iToken == 0 ) return Prs_ManErrorSet(p, "Cannot read output in assign-statement.", 0);
755 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
756 if ( !Prs_ManIsChar(p, '=') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
757 p->pCur++;
758 // save output
759 Vec_IntWriteEntry( &p->vTemp3, 1, iToken );
760 // read input
761 iToken = Prs_ManReadSignal( p );
762 if ( iToken == 0 ) return Prs_ManErrorSet(p, "Cannot read output in assign-statement.", 0);
763 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
764 if ( !Prs_ManIsChar(p, ';') ) return Prs_ManErrorSet(p, "Cannot parse always statement.", 0);
765 p->pCur++;
766 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
767 // save input
768 Vec_IntPushTwo( &p->vTemp3, 0, iToken );
769 }
770 // read endcase
771 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
772 iToken = Prs_ManReadName( p );
773 if ( iToken != PRS_VER_ENDCASE ) return Prs_ManErrorSet(p, "Cannot read \"endcase\" keyword.", 0);
774 // read end
775 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
776 iToken = Prs_ManReadName( p );
777 if ( iToken != PRS_VER_END ) return Prs_ManErrorSet(p, "Cannot read \"end\" keyword.", 0);
778 // save binary operator
779 Prs_NtkAddBox( p->pNtk, CBA_BOX_NMUX, 0, &p->vTemp3 );
780 return 1;
781}
782/*
783static inline int Prs_ManReadExpression( Prs_Man_t * p, int OutItem )
784{
785 int InItem, fCompl = 0, fCompl2 = 0, Oper = 0;
786 // read output name
787 if ( Prs_ManIsChar(p, '~') )
788 {
789 fCompl = 1;
790 p->pCur++;
791 }
792 // write output name
793 Vec_IntClear( &p->vTemp );
794 Vec_IntPush( &p->vTemp, 0 );
795 Vec_IntPush( &p->vTemp, OutItem );
796 // read first name
797 InItem = Prs_ManReadSignal( p );
798 if ( InItem == 0 ) return Prs_ManErrorSet(p, "Cannot read first input name in the assign-statement.", 0);
799 Vec_IntPush( &p->vTemp, 0 );
800 Vec_IntPush( &p->vTemp, InItem );
801 // check unary operator
802 if ( Prs_ManIsChar(p, ';') )
803 {
804 Oper = fCompl ? CBA_BOX_INV : CBA_BOX_BUF;
805 Prs_NtkAddBox( p->pNtk, Oper, 0, &p->vTemp );
806 return 1;
807 }
808 if ( Prs_ManIsChar(p, '&') )
809 Oper = CBA_BOX_AND;
810 else if ( Prs_ManIsChar(p, '|') )
811 Oper = CBA_BOX_OR;
812 else if ( Prs_ManIsChar(p, '^') )
813 Oper = CBA_BOX_XOR;
814 else if ( Prs_ManIsChar(p, '?') )
815 Oper = CBA_BOX_MUX;
816 else return Prs_ManErrorSet(p, "Unrecognized operator in the assign-statement.", 0);
817 p->pCur++;
818 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
819 if ( Prs_ManIsChar(p, '~') )
820 {
821 fCompl2 = 1;
822 p->pCur++;
823 }
824 // read second name
825 InItem = Prs_ManReadSignal( p );
826 if ( InItem == 0 ) return Prs_ManErrorSet(p, "Cannot read second input name in the assign-statement.", 0);
827 Vec_IntPush( &p->vTemp, 0 );
828 Vec_IntPush( &p->vTemp, InItem );
829 // read third argument
830 if ( Oper == CBA_BOX_MUX )
831 {
832 assert( fCompl == 0 );
833 if ( !Prs_ManIsChar(p, ':') ) return Prs_ManErrorSet(p, "Expected colon in the MUX assignment.", 0);
834 p->pCur++;
835 // read third name
836 InItem = Prs_ManReadSignal( p );
837 if ( InItem == 0 ) return Prs_ManErrorSet(p, "Cannot read third input name in the assign-statement.", 0);
838 Vec_IntPush( &p->vTemp, 0 );
839 Vec_IntPush( &p->vTemp, InItem );
840 if ( !Prs_ManIsChar(p, ';') ) return Prs_ManErrorSet(p, "Expected semicolon at the end of the assign-statement.", 0);
841 }
842 else
843 {
844 // figure out operator
845 if ( Oper == CBA_BOX_AND )
846 {
847 if ( fCompl && !fCompl2 )
848 Oper = CBA_BOX_SHARPL;
849 else if ( !fCompl && fCompl2 )
850 Oper = CBA_BOX_SHARP;
851 else if ( fCompl && fCompl2 )
852 Oper = CBA_BOX_NOR;
853 }
854 else if ( Oper == CBA_BOX_OR )
855 {
856 if ( fCompl && fCompl2 )
857 Oper = CBA_BOX_NAND;
858 else assert( !fCompl && !fCompl2 );
859 }
860 else if ( Oper == CBA_BOX_XOR )
861 {
862 if ( fCompl && !fCompl2 )
863 Oper = CBA_BOX_XNOR;
864 else assert( !fCompl && !fCompl2 );
865 }
866 }
867 // save binary operator
868 Prs_NtkAddBox( p->pNtk, Oper, 0, &p->vTemp );
869 return 1;
870}
871*/
872static inline int Prs_ManReadExpression( Prs_Man_t * p, int OutItem )
873{
874 char * pClose;
875 int Item, Type = CBA_OBJ_NONE;
876 int fRotating = 0;
877
878 // write output name
879 Vec_IntClear( &p->vTemp );
880 Vec_IntPush( &p->vTemp, 0 );
881 Vec_IntPush( &p->vTemp, OutItem );
882 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
883 if ( Prs_ManIsChar(p, '(') )
884 {
885 // THIS IS A HACK TO DETECT rotating shifters: try to find both << and >> on the same line
886 if ( Prs_ManUtilDetectTwo(p, '>', '>') && Prs_ManUtilDetectTwo(p, '<', '<') )
887 fRotating = 1;
888 pClose = Prs_ManFindClosingParenthesis( p, '(', ')' );
889 if ( pClose == NULL )
890 return Prs_ManErrorSet(p, "Expecting closing parenthesis 1.", 0);
891 *p->pCur = *pClose = ' ';
892 }
893 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
894 // read constant or concatenation
895 if ( Prs_ManIsDigit(p) || Prs_ManIsChar(p, '{') )
896 {
897 Item = Prs_ManReadSignal( p );
898 // write constant
899 Vec_IntPush( &p->vTemp, 0 );
900 Vec_IntPush( &p->vTemp, Item );
901 Type = CBA_BOX_BUF;
902 }
903 else if ( Prs_ManIsChar(p, '!') || Prs_ManIsChar(p, '~') || Prs_ManIsChar(p, '@') ||
904 Prs_ManIsChar(p, '&') || Prs_ManIsChar(p, '|') || Prs_ManIsChar(p, '^') || Prs_ManIsChar(p, '-') )
905 {
906 if ( Prs_ManIsChar(p, '!') )
907 Type = CBA_BOX_LNOT;
908 else if ( Prs_ManIsChar(p, '~') )
909 Type = CBA_BOX_INV;
910 else if ( Prs_ManIsChar(p, '@') )
911 Type = CBA_BOX_SQRT;
912 else if ( Prs_ManIsChar(p, '&') )
913 Type = CBA_BOX_RAND;
914 else if ( Prs_ManIsChar(p, '|') )
915 Type = CBA_BOX_ROR;
916 else if ( Prs_ManIsChar(p, '^') )
917 Type = CBA_BOX_RXOR;
918 else if ( Prs_ManIsChar(p, '-') )
919 Type = CBA_BOX_MIN;
920 else assert( 0 );
921 p->pCur++;
922 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
923 // skip parentheses
924 if ( Prs_ManIsChar(p, '(') )
925 {
926 pClose = Prs_ManFindClosingParenthesis( p, '(', ')' );
927 if ( pClose == NULL )
928 return Prs_ManErrorSet(p, "Expecting closing parenthesis 2.", 0);
929 *p->pCur = *pClose = ' ';
930 }
931 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
932 // read first name
933 Item = Prs_ManReadSignal( p );
934 if ( Item == 0 ) return Prs_ManErrorSet(p, "Cannot read name after a unary operator.", 0);
935 Vec_IntPush( &p->vTemp, 0 );
936 Vec_IntPush( &p->vTemp, Item );
937 }
938 else
939 {
940 // read first name
941 Item = Prs_ManReadSignal( p );
942 if ( Item == 0 ) return Prs_ManErrorSet(p, "Cannot read name after a binary operator.", 0);
943 // check if this is a recent function
944 if ( Abc_Lit2Var2(Item) == p->FuncNameId )
945 {
946 int Status, nInputs, RangeSize;
947 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
948 if ( !Prs_ManIsChar(p, '(') ) return Prs_ManErrorSet(p, "Error number 24.", 0);
949 p->pCur++;
950 Status = Prs_ManReadSignalList( p, &p->vTemp, ')', 1 );
951 nInputs = Vec_IntSize(&p->vTemp)/2;
952 RangeSize = p->FuncRangeId ? Ptr_NtkRangeSize(p->pNtk, p->FuncRangeId) : 1;
953 p->FuncNameId = p->FuncRangeId = 0;
954 if ( Status == 0 ) return 0;
955 if ( nInputs == 1 )
956 Type = CBA_BOX_DEC;
957 else if ( nInputs == RangeSize + 1 )
958 Type = CBA_BOX_SEL;
959 else if ( nInputs == (1 << RangeSize) + 1 )
960 Type = CBA_BOX_NMUX;
961 else return Prs_ManErrorSet(p, "Cannot determine word-level operator.", 0);
962 p->pCur++;
963 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
964 // save word-level operator
965 Vec_IntInsert( &p->vTemp, 0, 0 );
966 Vec_IntInsert( &p->vTemp, 1, OutItem );
967 Prs_NtkAddBox( p->pNtk, Type, 0, &p->vTemp );
968 return 1;
969 }
970 Vec_IntPush( &p->vTemp, 0 );
971 Vec_IntPush( &p->vTemp, Item );
972 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
973 assert( !Prs_ManIsChar(p, '[') );
974
975 // get the next symbol
976 if ( Prs_ManIsChar(p, ',') || Prs_ManIsChar(p, ';') )
977 Type = CBA_BOX_BUF;
978 else if ( Prs_ManIsChar(p, '?') )
979 {
980 p->pCur++;
981 Item = Prs_ManReadSignal( p );
982 if ( Item == 0 ) return 0;
983 Vec_IntPush( &p->vTemp, 0 );
984 Vec_IntPush( &p->vTemp, Item );
985 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
986 if ( !Prs_ManIsChar(p, ':') ) return Prs_ManErrorSet(p, "MUX lacks the colon symbol (:).", 0);
987
988 p->pCur++;
989 Item = Prs_ManReadSignal( p );
990 if ( Item == 0 ) return 0;
991 Vec_IntPush( &p->vTemp, 0 );
992 Vec_IntPush( &p->vTemp, Item );
993 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
994 assert( Vec_IntSize(&p->vTemp) == 8 );
995 //ABC_SWAP( int, Vec_IntArray(&p->vTemp)[3], Vec_IntArray(&p->vTemp)[5] );
996 Type = CBA_BOX_MUX;
997 }
998 else
999 {
1000 if ( p->pCur[0] == '>' && p->pCur[1] == '>' && p->pCur[2] != '>' ) p->pCur += 2, Type = fRotating ? CBA_BOX_ROTR : CBA_BOX_SHIR;
1001 else if ( p->pCur[0] == '>' && p->pCur[1] == '>' && p->pCur[2] == '>' ) p->pCur += 3, Type = CBA_BOX_SHIRA;
1002 else if ( p->pCur[0] == '<' && p->pCur[1] == '<' && p->pCur[2] != '<' ) p->pCur += 2, Type = fRotating ? CBA_BOX_ROTL : CBA_BOX_SHIL;
1003 else if ( p->pCur[0] == '<' && p->pCur[1] == '<' && p->pCur[2] == '<' ) p->pCur += 3, Type = CBA_BOX_SHILA;
1004 else if ( p->pCur[0] == '&' && p->pCur[1] != '&' ) p->pCur += 1, Type = CBA_BOX_AND;
1005 else if ( p->pCur[0] == '|' && p->pCur[1] != '|' ) p->pCur += 1, Type = CBA_BOX_OR;
1006 else if ( p->pCur[0] == '^' && p->pCur[1] != '^' ) p->pCur += 1, Type = CBA_BOX_XOR;
1007 else if ( p->pCur[0] == '&' && p->pCur[1] == '&' ) p->pCur += 2, Type = CBA_BOX_LAND;
1008 else if ( p->pCur[0] == '|' && p->pCur[1] == '|' ) p->pCur += 2, Type = CBA_BOX_LOR;
1009 else if ( p->pCur[0] == '=' && p->pCur[1] == '=' ) p->pCur += 2, Type = CBA_BOX_EQU;
1010 else if ( p->pCur[0] == '!' && p->pCur[1] == '=' ) p->pCur += 2, Type = CBA_BOX_NEQU;
1011 else if ( p->pCur[0] == '<' && p->pCur[1] != '=' ) p->pCur += 1, Type = CBA_BOX_LTHAN;
1012 else if ( p->pCur[0] == '>' && p->pCur[1] != '=' ) p->pCur += 1, Type = CBA_BOX_MTHAN;
1013 else if ( p->pCur[0] == '<' && p->pCur[1] == '=' ) p->pCur += 2, Type = CBA_BOX_LETHAN;
1014 else if ( p->pCur[0] == '>' && p->pCur[1] == '=' ) p->pCur += 2, Type = CBA_BOX_METHAN;
1015 else if ( p->pCur[0] == '+' ) p->pCur += 1, Type = CBA_BOX_ADD;
1016 else if ( p->pCur[0] == '-' ) p->pCur += 1, Type = CBA_BOX_SUB;
1017 else if ( p->pCur[0] == '*' && p->pCur[1] != '*' ) p->pCur += 1, Type = CBA_BOX_MUL;
1018 else if ( p->pCur[0] == '/' ) p->pCur += 1, Type = CBA_BOX_DIV;
1019 else if ( p->pCur[0] == '%' ) p->pCur += 1, Type = CBA_BOX_MOD;
1020 else if ( p->pCur[0] == '*' && p->pCur[1] == '*' ) p->pCur += 2, Type = CBA_BOX_POW;
1021 else return Prs_ManErrorSet(p, "Unsupported operation.", 0);
1022
1023 Item = Prs_ManReadSignal( p );
1024 if ( Item == 0 ) return 0;
1025 Vec_IntPush( &p->vTemp, 0 );
1026 Vec_IntPush( &p->vTemp, Item );
1027 // for adder insert carry-in
1028 if ( Type == CBA_BOX_ADD )
1029 Vec_IntInsert( &p->vTemp, 2, 0 );
1030 if ( Type == CBA_BOX_ADD )
1031 Vec_IntInsert( &p->vTemp, 3, 0 );
1032 }
1033 }
1034 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 24.", 0);
1035 // make sure there is nothing left there
1036 if ( fRotating )
1037 {
1038 Prs_ManUtilSkipUntilWord(p, ";");
1039 p->pCur--;
1040 }
1041 else if ( !Prs_ManIsChar(p, ',') && !Prs_ManIsChar(p, ';') ) return Prs_ManErrorSet(p, "Trailing symbols on this line.", 0);
1042 // save binary operator
1043 Prs_NtkAddBox( p->pNtk, Type, 0, &p->vTemp );
1044 return 1;
1045}
1046static inline int Prs_ManReadDeclaration( Prs_Man_t * p, int Type )
1047{
1048 int i, Item = 0, NameId, RangeId = 0, fSigned = 0;
1049 Vec_Int_t * vNames[4] = { &p->pNtk->vInputs, &p->pNtk->vOutputs, &p->pNtk->vInouts, &p->pNtk->vWires };
1050 Vec_Int_t * vNamesR[4] = { &p->pNtk->vInputsR, &p->pNtk->vOutputsR, &p->pNtk->vInoutsR, &p->pNtk->vWiresR };
1051 assert( Type >= PRS_VER_INPUT && Type <= PRS_VER_WIRE );
1052 // read first word
1053 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 20.", 0);
1054 if ( Prs_ManIsChar(p, '[') && !(RangeId = Prs_ManReadRange(p)) ) return Prs_ManErrorSet(p, "Error number 21.", 0);
1055 Item = Prs_ManReadName(p);
1056 if ( Item == PRS_VER_SIGNED )
1057 {
1058 fSigned = 1;
1059 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 20.", 0);
1060 if ( Prs_ManIsChar(p, '[') && !(RangeId = Prs_ManReadRange(p)) ) return Prs_ManErrorSet(p, "Error number 21.", 0);
1061 Item = Prs_ManReadName(p);
1062 }
1063 if ( Item == PRS_VER_WIRE )
1064 {
1065 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 20.", 0);
1066 if ( Prs_ManIsChar(p, '[') && !(RangeId = Prs_ManReadRange(p)) ) return Prs_ManErrorSet(p, "Error number 21.", 0);
1067 Item = Prs_ManReadName(p);
1068 }
1069 // read variable names
1070 Vec_IntClear( &p->vTemp3 );
1071 while ( 1 )
1072 {
1073 if ( Item == 0 ) return Prs_ManErrorSet(p, "Cannot read name in the list.", 0);
1074 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 22a", 0);
1075 if ( Item == PRS_VER_WIRE )
1076 continue;
1077 Vec_IntPush( &p->vTemp3, Item );
1078 if ( Prs_ManIsChar(p, '=') )
1079 {
1080 if ( Type == PRS_VER_INPUT ) return Prs_ManErrorSet(p, "Input cannot be defined", 0);
1081 p->pCur++;
1082 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23.", 0);
1083 if ( !Prs_ManReadExpression(p, Abc_Var2Lit2(Item, CBA_PRS_NAME)) )
1084 return 0;
1085 }
1086 if ( Prs_ManIsChar(p, ';') )
1087 break;
1088 if ( !Prs_ManIsChar(p, ',') ) return Prs_ManErrorSet(p, "Expecting comma in the list.", 0);
1089 p->pCur++;
1090 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 22b.", 0);
1091 Item = Prs_ManReadName(p);
1092 }
1093 Vec_IntForEachEntry( &p->vTemp3, NameId, i )
1094 {
1095 Vec_IntPush( vNames[Type - PRS_VER_INPUT], NameId );
1096 Vec_IntPush( vNamesR[Type - PRS_VER_INPUT], Abc_Var2Lit(RangeId, fSigned) );
1097 if ( Type < PRS_VER_WIRE )
1098 Vec_IntPush( &p->pNtk->vOrder, Abc_Var2Lit2(NameId, Type) );
1099 }
1100 return 1;
1101}
1102static inline int Prs_ManReadInstance( Prs_Man_t * p, int Func )
1103{
1104 int InstId, Status;
1105 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 25.", 0);
1106 if ( Prs_ManIsChar(p, '#') )
1107 {
1108 p->pCur++;
1109 while ( Prs_ManIsDigit(p) )
1110 p->pCur++;
1111 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 25.", 0);
1112 }
1113 if ( (InstId = Prs_ManReadName(p)) )
1114 if (Prs_ManUtilSkipSpaces(p)) return Prs_ManErrorSet(p, "Error number 26.", 0);
1115 if ( !Prs_ManIsChar(p, '(') ) return Prs_ManErrorSet(p, "Expecting \"(\" in module instantiation.", 0);
1116 p->pCur++;
1117 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 27.", 0);
1118 if ( Prs_ManIsChar(p, '.') ) // box
1119 Status = Prs_ManReadSignalList2(p, &p->vTemp);
1120 else // node
1121 {
1122 //char * s = Abc_NamStr(p->pStrs, Func);
1123 // translate elementary gate
1124 int iFuncNew = Prs_ManIsVerilogPrim(Abc_NamStr(p->pStrs, Func));
1125 if ( iFuncNew == 0 ) return Prs_ManErrorSet(p, "Cannot find elementary gate.", 0);
1126 Func = iFuncNew;
1127 Status = Prs_ManReadSignalList( p, &p->vTemp, ')', 1 );
1128 }
1129 if ( Status == 0 ) return Prs_ManErrorSet(p, "Error number 28.", 0);
1130 assert( Prs_ManIsChar(p, ')') );
1131 p->pCur++;
1132 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 29.", 0);
1133 if ( !Prs_ManIsChar(p, ';') ) return Prs_ManErrorSet(p, "Expecting semicolon in the instance.", 0);
1134 // add box
1135 Prs_NtkAddBox( p->pNtk, Func, InstId, &p->vTemp );
1136 return 1;
1137}
1138static inline int Prs_ManReadArguments( Prs_Man_t * p )
1139{
1140 int iRange = 0, iType = -1;
1141 Vec_Int_t * vSigs[3] = { &p->pNtk->vInputs, &p->pNtk->vOutputs, &p->pNtk->vInouts };
1142 Vec_Int_t * vSigsR[3] = { &p->pNtk->vInputsR, &p->pNtk->vOutputsR, &p->pNtk->vInoutsR };
1143 assert( Prs_ManIsChar(p, '(') );
1144 p->pCur++;
1145 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 30.", 0);
1146 if ( Prs_ManIsChar(p, ')') )
1147 return 1;
1148 while ( 1 )
1149 {
1150 int fEscape = Prs_ManIsChar(p, '\\');
1151 int iName = Prs_ManReadName( p );
1152 int fSigned = 0;
1153 if ( iName == 0 ) return Prs_ManErrorSet(p, "Error number 31.", 0);
1154 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 32.", 0);
1155 if ( iName >= PRS_VER_INPUT && iName <= PRS_VER_INOUT && !fEscape ) // declaration
1156 {
1157 iType = iName;
1158 if ( Prs_ManIsChar(p, '[') )
1159 {
1160 iRange = Prs_ManReadRange(p);
1161 if ( iRange == 0 ) return Prs_ManErrorSet(p, "Error number 33.", 0);
1162 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 34.", 0);
1163 }
1164 iName = Prs_ManReadName( p );
1165 if ( iName == 0 ) return Prs_ManErrorSet(p, "Error number 35.", 0);
1166 if ( iName == PRS_VER_SIGNED )
1167 {
1168 fSigned = 1;
1169 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 32.", 0);
1170 if ( Prs_ManIsChar(p, '[') )
1171 {
1172 iRange = Prs_ManReadRange(p);
1173 if ( iRange == 0 ) return Prs_ManErrorSet(p, "Error number 33.", 0);
1174 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 34.", 0);
1175 }
1176 iName = Prs_ManReadName( p );
1177 if ( iName == 0 ) return Prs_ManErrorSet(p, "Error number 35.", 0);
1178 }
1179 }
1180 if ( iType > 0 )
1181 {
1182 Vec_IntPush( vSigs[iType - PRS_VER_INPUT], iName );
1183 Vec_IntPush( vSigsR[iType - PRS_VER_INPUT], Abc_Var2Lit(iRange, fSigned) );
1184 Vec_IntPush( &p->pNtk->vOrder, Abc_Var2Lit2(iName, iType) );
1185 }
1186 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 36.", 0);
1187 if ( Prs_ManIsChar(p, ')') )
1188 break;
1189 if ( !Prs_ManIsChar(p, ',') ) return Prs_ManErrorSet(p, "Expecting comma in the instance.", 0);
1190 p->pCur++;
1191 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 36.", 0);
1192 }
1193 // check final
1194 assert( Prs_ManIsChar(p, ')') );
1195 return 1;
1196}
1197// this procedure can return:
1198// 0 = reached end-of-file; 1 = successfully parsed; 2 = recognized as primitive; 3 = failed and skipped; 4 = error (failed and could not skip)
1199static inline int Prs_ManReadModule( Prs_Man_t * p )
1200{
1201 int iToken, Status = -1, fAlways = 0;
1202 if ( p->pNtk != NULL ) return Prs_ManErrorSet(p, "Parsing previous module is unfinished.", 4);
1203 if ( Prs_ManUtilSkipSpaces(p) )
1204 {
1205 Prs_ManErrorClear( p );
1206 return 0;
1207 }
1208 // read keyword
1209 while ( Prs_ManIsChar(p, '`') )
1210 {
1211 Prs_ManUtilSkipUntilWord(p, "\n");
1212 if ( Prs_ManUtilSkipSpaces(p) )
1213 {
1214 Prs_ManErrorClear( p );
1215 return 0;
1216 }
1217 }
1218 iToken = Prs_ManReadName( p );
1219 if ( iToken != PRS_VER_MODULE ) return Prs_ManErrorSet(p, "Cannot read \"module\" keyword.", 4);
1220 if ( Prs_ManUtilSkipSpaces(p) ) return 4;
1221 // read module name
1222 iToken = Prs_ManReadName( p );
1223 if ( iToken == 0 ) return Prs_ManErrorSet(p, "Cannot read module name.", 4);
1224 if ( Prs_ManIsKnownModule(Abc_NamStr(p->pStrs, iToken)) )
1225 {
1226 if ( Prs_ManUtilSkipUntilWord( p, "endmodule" ) ) return Prs_ManErrorSet(p, "Cannot find \"endmodule\" keyword.", 4);
1227 //printf( "Warning! Skipped known module \"%s\".\n", Abc_NamStr(p->pStrs, iToken) );
1228 Vec_IntPush( &p->vKnown, iToken );
1229 return 2;
1230 }
1231 Prs_ManInitializeNtk( p, iToken, 1 );
1232 // skip arguments
1233 if ( Prs_ManUtilSkipSpaces(p) ) return 4;
1234 if ( !Prs_ManIsChar(p, '(') ) return Prs_ManErrorSet(p, "Cannot find \"(\" in the argument declaration.", 4);
1235 if ( !Prs_ManReadArguments(p) ) return 4;
1236 assert( *p->pCur == ')' );
1237 p->pCur++;
1238 if ( Prs_ManUtilSkipSpaces(p) ) return 4;
1239 // read declarations and instances
1240 while ( Prs_ManIsChar(p, ';') || fAlways )
1241 {
1242 if ( !fAlways ) p->pCur++;
1243 fAlways = 0;
1244 if ( Prs_ManUtilSkipSpaces(p) ) return 4;
1245 iToken = Prs_ManReadName( p );
1246 if ( iToken == PRS_VER_ENDMODULE )
1247 {
1248 Vec_IntPush( &p->vSucceeded, p->pNtk->iModuleName );
1249 Prs_ManFinalizeNtk( p );
1250 return 1;
1251 }
1252 if ( iToken >= PRS_VER_INPUT && iToken <= PRS_VER_REG ) // declaration
1253 Status = Prs_ManReadDeclaration( p, iToken == PRS_VER_REG ? PRS_VER_WIRE : iToken );
1254 else if ( iToken == PRS_VER_REG || iToken == PRS_VER_DEFPARAM ) // unsupported keywords
1255 Status = Prs_ManUtilSkipUntil( p, ';' );
1256 else // read instance
1257 {
1258 if ( iToken == PRS_VER_ASSIGN )
1259 {
1260 // read output name
1261 int OutItem = Prs_ManReadSignal( p );
1262 if ( OutItem == 0 ) return Prs_ManErrorSet(p, "Cannot read output in assign-statement.", 0);
1263 if ( !Prs_ManIsChar(p, '=') ) return Prs_ManErrorSet(p, "Expecting \"=\" in assign-statement.", 0);
1264 p->pCur++;
1265 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23.", 0);
1266 // read expression
1267 while ( 1 )
1268 {
1269 if ( !Prs_ManReadExpression(p, OutItem) ) return 0;
1270 if ( Prs_ManIsChar(p, ';') )
1271 break;
1272 assert( Prs_ManIsChar(p, ',') );
1273 p->pCur++;
1274 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23a.", 0);
1275 // read output name
1276 OutItem = Prs_ManReadSignal( p );
1277 if ( OutItem == 0 ) return Prs_ManErrorSet(p, "Cannot read output in assign-statement.", 0);
1278 if ( !Prs_ManIsChar(p, '=') ) return Prs_ManErrorSet(p, "Expecting \"=\" in assign-statement.", 0);
1279 p->pCur++;
1280 if ( Prs_ManUtilSkipSpaces(p) ) return Prs_ManErrorSet(p, "Error number 23.", 0);
1281 }
1282 }
1283 else if ( iToken == PRS_VER_ALWAYS )
1284 Status = Prs_ManReadAlways(p), fAlways = 1;
1285 else if ( iToken == PRS_VER_FUNCTION )
1286 Status = Prs_ManReadFunction(p), fAlways = 1;
1287 else
1288 Status = Prs_ManReadInstance( p, iToken );
1289 if ( Status == 0 )
1290 {
1291 return 4;
1292
1293 if ( Prs_ManUtilSkipUntilWord( p, "endmodule" ) ) return Prs_ManErrorSet(p, "Cannot find \"endmodule\" keyword.", 4);
1294 //printf( "Warning! Failed to parse \"%s\". Adding module \"%s\" as blackbox.\n",
1295 // Abc_NamStr(p->pStrs, iToken), Abc_NamStr(p->pStrs, p->pNtk->iModuleName) );
1296 Vec_IntPush( &p->vFailed, p->pNtk->iModuleName );
1297 // cleanup
1298 Vec_IntErase( &p->pNtk->vWires );
1299 Vec_IntErase( &p->pNtk->vWiresR );
1300 Vec_IntErase( &p->pNtk->vSlices );
1301 Vec_IntErase( &p->pNtk->vConcats );
1302 Vec_IntErase( &p->pNtk->vBoxes );
1303 Vec_IntErase( &p->pNtk->vObjs );
1304 p->fUsingTemp2 = 0;
1305 // add
1306 Prs_ManFinalizeNtk( p );
1307 Prs_ManErrorClear( p );
1308 return 3;
1309 }
1310 }
1311 if ( !Status ) return 4;
1312 if ( Prs_ManUtilSkipSpaces(p) ) return 4;
1313 }
1314 return Prs_ManErrorSet(p, "Cannot find \";\" in the module definition.", 4);
1315}
1316static inline int Prs_ManReadDesign( Prs_Man_t * p )
1317{
1318 while ( 1 )
1319 {
1320 int RetValue = Prs_ManReadModule( p );
1321 if ( RetValue == 0 ) // end of file
1322 break;
1323 if ( RetValue == 1 ) // successfully parsed
1324 continue;
1325 if ( RetValue == 2 ) // recognized as primitive
1326 continue;
1327 if ( RetValue == 3 ) // failed and skipped
1328 continue;
1329 if ( RetValue == 4 ) // error
1330 return 0;
1331 assert( 0 );
1332 }
1333 return 1;
1334}
1335
1348{
1349 char * pName; int i;
1350 printf( "Succeeded parsing %d models:\n", Vec_IntSize(&p->vSucceeded) );
1351 Prs_ManForEachNameVec( &p->vSucceeded, p, pName, i )
1352 printf( " %s", pName );
1353 printf( "\n" );
1354 printf( "Skipped %d known models:\n", Vec_IntSize(&p->vKnown) );
1355 Prs_ManForEachNameVec( &p->vKnown, p, pName, i )
1356 printf( " %s", pName );
1357 printf( "\n" );
1358 printf( "Skipped %d failed models:\n", Vec_IntSize(&p->vFailed) );
1359 Prs_ManForEachNameVec( &p->vFailed, p, pName, i )
1360 printf( " %s", pName );
1361 printf( "\n" );
1362}
1363
1375Vec_Ptr_t * Prs_ManReadVerilog( char * pFileName )
1376{
1377 Vec_Ptr_t * vPrs = NULL;
1378 Prs_Man_t * p = Prs_ManAlloc( pFileName );
1379 if ( p == NULL )
1380 return NULL;
1381 Abc_NamStrFindOrAdd( p->pFuns, "1\'b0", NULL );
1382 Abc_NamStrFindOrAdd( p->pFuns, "1\'b1", NULL );
1383 Abc_NamStrFindOrAdd( p->pFuns, "1\'bx", NULL );
1384 Abc_NamStrFindOrAdd( p->pFuns, "1\'bz", NULL );
1386 Prs_ManReadDesign( p );
1388 if ( Prs_ManErrorPrint(p) )
1389 ABC_SWAP( Vec_Ptr_t *, vPrs, p->vNtks );
1390 Prs_ManFree( p );
1391 return vPrs;
1392}
1393
1394void Prs_ManReadVerilogTest( char * pFileName )
1395{
1396 abctime clk = Abc_Clock();
1397 Vec_Ptr_t * vPrs = Prs_ManReadVerilog( pFileName );
1398 if ( !vPrs ) return;
1399 printf( "Finished reading %d networks. ", Vec_PtrSize(vPrs) );
1400 printf( "NameIDs = %d. ", Abc_NamObjNumMax(Prs_ManNameMan(vPrs)) );
1401 printf( "Memory = %.2f MB. ", 1.0*Prs_ManMemory(vPrs)/(1<<20) );
1402 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
1403 Prs_ManWriteVerilog( Extra_FileNameGenericAppend(pFileName, "_out.v"), vPrs );
1404// Abc_NamPrint( Prs_ManNameMan(vPrs) );
1405 Prs_ManVecFree( vPrs );
1406}
1407
1420{
1421 int iFon = Cba_NtkGetMap( p, NameId );
1422 if ( iFon )
1423 return iFon;
1424 printf( "Network \"%s\": Signal \"%s\" is not driven.\n", Cba_NtkName(p), Cba_NtkStr(p, NameId) );
1425 return 0;
1426}
1427int Prs_CreateSlice( Cba_Ntk_t * p, int iFon, Prs_Ntk_t * pNtk, int Range )
1428{
1429 int iObj, iFonNew, NameId;
1430 assert( Cba_FonIsReal(iFon) );
1431 // check existing slice
1432 NameId = Cba_NtkNewStrId( p, Cba_ManGetSliceName(p, iFon, Range) );
1433 iFonNew = Cba_NtkGetMap( p, NameId );
1434 if ( iFonNew )
1435 return iFonNew;
1436 // create slice
1437 iObj = Cba_ObjAlloc( p, CBA_BOX_SLICE, 1, 1 );
1438 Cba_ObjSetName( p, iObj, NameId );
1439 Cba_ObjSetFinFon( p, iObj, 0, iFon );
1440 iFonNew = Cba_ObjFon0(p, iObj);
1441 Cba_FonSetRange( p, iFonNew, Range );
1442 Cba_FonSetName( p, iFonNew, NameId );
1443 Cba_NtkSetMap( p, NameId, iFonNew );
1444 return iFonNew;
1445}
1446int Prs_CreateCatIn( Cba_Ntk_t * p, Prs_Ntk_t * pNtk, int Con )
1447{
1448 extern int Prs_CreateSignalIn( Cba_Ntk_t * p, Prs_Ntk_t * pNtk, int Sig );
1449 int i, Sig, iObj, iFon, NameId, nBits = 0;
1450 Vec_Int_t * vSigs = Prs_CatSignals(pNtk, Con);
1451 // create input concatenation
1452 iObj = Cba_ObjAlloc( p, CBA_BOX_CONCAT, Vec_IntSize(vSigs), 1 );
1453 iFon = Cba_ObjFon0(p, iObj);
1454 //sprintf( Buffer, "_icc%d_", iObj );
1455 //NameId = Cba_NtkNewStrId( p, Buffer );
1456 NameId = Cba_NtkNewStrId( p, "_icc%d_", iObj );
1457 Cba_FonSetName( p, iFon, NameId );
1458 Cba_NtkSetMap( p, NameId, iFon );
1459 // set inputs
1460 Vec_IntForEachEntry( vSigs, Sig, i )
1461 {
1462 iFon = Prs_CreateSignalIn( p, pNtk, Sig );
1463 if ( iFon )
1464 Cba_ObjSetFinFon( p, iObj, i, iFon );
1465 if ( iFon )
1466 nBits += Cba_FonRangeSize( p, iFon );
1467 }
1468 iFon = Cba_ObjFon0(p, iObj);
1469 Cba_FonSetRange( p, iFon, Cba_NtkHashRange(p, nBits-1, 0) );
1470 return Cba_ObjFon0(p, iObj);
1471}
1472int Prs_CreateSignalIn( Cba_Ntk_t * p, Prs_Ntk_t * pNtk, int Sig )
1473{
1474 int iFon, Value = Abc_Lit2Var2( Sig );
1475 Prs_ManType_t Type = (Prs_ManType_t)Abc_Lit2Att2( Sig );
1476 if ( !Sig ) return 0;
1477 if ( Type == CBA_PRS_NAME )
1478 return Prs_CreateVerilogFindFon( p, Cba_NtkNewStrId(p, Prs_NtkStr(pNtk, Value)) );
1479 if ( Type == CBA_PRS_CONST )
1480 return Cba_FonFromConst( Value );
1481 if ( Type == CBA_PRS_SLICE )
1482 {
1483 iFon = Prs_CreateVerilogFindFon( p, Cba_NtkNewStrId(p, Prs_NtkStr(pNtk, Prs_SliceName(pNtk, Value))) );
1484 if ( !iFon )
1485 return 0;
1486 return Prs_CreateSlice( p, iFon, pNtk, Prs_SliceRange(pNtk, Value) );
1487 }
1488 assert( Type == CBA_PRS_CONCAT );
1489 return Prs_CreateCatIn( p, pNtk, Value );
1490}
1491int Prs_CreateRange( Cba_Ntk_t * p, int iFon, int NameId )
1492{
1493 int RangeId = -Cba_NtkGetMap(p, NameId);
1494 if ( RangeId < 0 ) // this variable is already created
1495 return Cba_FonRangeSize( p, -RangeId );
1496 Cba_NtkUnsetMap( p, NameId );
1497 Cba_NtkSetMap( p, NameId, iFon );
1498 if ( RangeId == 0 )
1499 return 1;
1500 assert( RangeId > 0 );
1501 Cba_FonSetRangeSign( p, iFon, RangeId );
1502 return Cba_FonRangeSize( p, iFon );
1503}
1504void Prs_CreateSignalOut( Cba_Ntk_t * p, int iFon, Prs_Ntk_t * pNtk, int Sig )
1505{
1506 int i, iFonNew, NameOut, RangeOut, NameId, RangeId, RangeSize, nBits = 0;
1507 Prs_ManType_t SigType = (Prs_ManType_t)Abc_Lit2Att2( Sig );
1508 int SigValue = Abc_Lit2Var2( Sig );
1509 if ( !Sig ) return;
1510 if ( SigType == CBA_PRS_NAME )
1511 {
1512 NameId = SigValue;
1513 if ( !strncmp(Cba_NtkStr(p, NameId), "Open_", 5) )
1514 return;
1515 Cba_FonSetName( p, iFon, NameId );
1516 Prs_CreateRange( p, iFon, NameId );
1517 return;
1518 }
1519 // create name for this fan
1520 NameOut = Cba_NtkNewStrId( p, "_occ%d_", iFon );
1521 Cba_FonSetName( p, iFon, NameOut );
1522 Cba_NtkSetMap( p, NameOut, iFon );
1523 // consider special cases
1524 if ( SigType == CBA_PRS_SLICE )
1525 {
1526 NameId = Prs_SliceName(pNtk, SigValue);
1527 RangeId = Prs_SliceRange(pNtk, SigValue);
1528 nBits = Cba_NtkRangeSize(p, RangeId);
1529 // save this slice
1530 Vec_IntPushThree( &p->vArray0, NameId, RangeId, iFon );
1531 }
1532 else if ( SigType == CBA_PRS_CONCAT )
1533 {
1534 Vec_Int_t * vSigs = Prs_CatSignals(pNtk, SigValue);
1535 Vec_IntReverseOrder( vSigs );
1536 Vec_IntForEachEntry( vSigs, Sig, i )
1537 {
1538 SigType = (Prs_ManType_t)Abc_Lit2Att2( Sig );
1539 SigValue = Abc_Lit2Var2( Sig );
1540 if ( SigType == CBA_PRS_NAME )
1541 {
1542 int iObjBuf, iFonBuf;
1543 // create buffer
1544 NameId = SigValue;
1545 if ( !strncmp(Cba_NtkStr(p, NameId), "Open_", 5) )
1546 {
1547 nBits++;
1548 continue;
1549 }
1550 iObjBuf = Cba_ObjAlloc( p, CBA_BOX_BUF, 1, 1 );
1551 iFonBuf = Cba_ObjFon0(p, iObjBuf);
1552 Cba_FonSetName( p, iFonBuf, NameId );
1553 RangeSize = Prs_CreateRange( p, iFonBuf, NameId );
1554 RangeOut = Cba_NtkHashRange(p, nBits+RangeSize-1, nBits);
1555 // create slice
1556 iFonNew = Prs_CreateSlice( p, iFon, pNtk, RangeOut );
1557 Cba_ObjSetFinFon( p, iObjBuf, 0, iFonNew );
1558 }
1559 else if ( SigType == CBA_PRS_SLICE )
1560 {
1561 NameId = Prs_SliceName(pNtk, SigValue);
1562 RangeId = Prs_SliceRange(pNtk, SigValue);
1563 RangeSize = Cba_NtkRangeSize(p, RangeId);
1564 RangeOut = Cba_NtkHashRange(p, nBits+RangeSize-1, nBits);
1565 // create slice
1566 iFonNew = Prs_CreateSlice( p, iFon, pNtk, RangeOut );
1567 // save this slice
1568 Vec_IntPushThree( &p->vArray0, NameId, RangeId, iFonNew );
1569 }
1570 else assert( 0 );
1571 // increment complete range
1572 nBits += RangeSize;
1573 }
1574 Vec_IntReverseOrder( vSigs );
1575 }
1576 else assert( 0 );
1577 // set the range for the output
1578 Cba_FonHashRange( p, iFon, nBits-1, 0 );
1579}
1580
1581void Prs_CreateOutConcat( Cba_Ntk_t * p, int * pSlices, int nSlices )
1582{
1583 Vec_Int_t * vBits = &p->vArray1;
1584 int NameId = pSlices[0];
1585 int RangeId = -Cba_NtkGetMap(p, NameId);
1586 int LeftId = Cba_NtkRangeLeft( p, RangeId );
1587 int RightId = Cba_NtkRangeRight( p, RangeId );
1588 int BotId = Abc_MinInt( LeftId, RightId );
1589 int TopId = Abc_MaxInt( LeftId, RightId );
1590 int i, k, iObj, iFon, nParts, Prev, nBits;
1591 assert( RangeId > 0 );
1592 Vec_IntFill( vBits, Abc_MaxInt(LeftId, RightId) + 1, 0 );
1593 // fill up with slices
1594 for ( i = 0; i < nSlices; i++ )
1595 {
1596 int Range = pSlices[3*i+1];
1597 int iFon = pSlices[3*i+2];
1598 int Left = Cba_NtkRangeLeft( p, Range );
1599 int Right = Cba_NtkRangeRight( p, Range );
1600 int Bot = Abc_MinInt( Left, Right );
1601 int Top = Abc_MaxInt( Left, Right );
1602 assert( NameId == pSlices[3*i+0] && iFon > 0 );
1603 assert( BotId <= Bot && Top <= TopId );
1604 for ( k = Bot; k <= Top; k++ )
1605 {
1606 assert( Vec_IntEntry(vBits, k) == 0 );
1607 Vec_IntWriteEntry( vBits, k, iFon );
1608 }
1609 }
1610 // check how many parts we have
1611 Prev = -1; nParts = 0;
1612 Vec_IntForEachEntryStartStop( vBits, iFon, i, BotId, TopId+1 )
1613 {
1614 if ( Prev != iFon )
1615 nParts++;
1616 Prev = iFon;
1617 }
1618 // create new concatenation
1619 iObj = Cba_ObjAlloc( p, CBA_BOX_CONCAT, nParts, 1 );
1620 iFon = Cba_ObjFon0(p, iObj);
1621 Cba_FonSetName( p, iFon, NameId );
1622 Prs_CreateRange( p, iFon, NameId );
1623 // set inputs
1624 k = 0; Prev = -1; nBits = 0;
1625 Vec_IntForEachEntryStartStop( vBits, iFon, i, BotId, TopId+1 )
1626 {
1627 if ( Prev == -1 || Prev == iFon )
1628 nBits++;
1629 else
1630 {
1631 if ( Prev == 0 ) // create constant
1632 Prev = Cba_ManNewConstZero( p, nBits );
1633 assert( nBits == Cba_FonRangeSize(p, Prev) );
1634 Cba_ObjSetFinFon( p, iObj, nParts-1-k++, Prev );
1635 nBits = 1;
1636 }
1637 Prev = iFon;
1638 }
1639 assert( nBits == Cba_FonRangeSize(p, Prev) );
1640 Cba_ObjSetFinFon( p, iObj, nParts-1-k++, Prev );
1641 assert( k == nParts );
1642}
1643
1644// looks at multi-bit signal; if one bit is repeated, returns this bit; otherwise, returns -1
1645int Prs_CreateBitSignal( Prs_Ntk_t * pNtk, int Sig )
1646{
1647 Vec_Int_t * vSigs;
1648 int i, SigTemp, SigOne = -1, Value = Abc_Lit2Var2( Sig );
1649 Prs_ManType_t Type = (Prs_ManType_t)Abc_Lit2Att2( Sig );
1650 if ( Type == CBA_PRS_NAME || Type == CBA_PRS_SLICE )
1651 return -1;
1652 if ( Type == CBA_PRS_CONST )
1653 {
1654 int fOnly0 = 1, fOnly1 = 1;
1655 char * pConst = Prs_NtkConst(pNtk, Value);
1656 pConst = strchr( pConst, '\'' ) + 1;
1657 assert( *pConst == 'b' );
1658 while ( *++pConst )
1659 if ( *pConst == '0' )
1660 fOnly1 = 0;
1661 else if ( *pConst == '1' )
1662 fOnly0 = 0;
1663 if ( fOnly0 )
1664 return Abc_Var2Lit2( 1, CBA_PRS_CONST ); // const0
1665 if ( fOnly1 )
1666 return Abc_Var2Lit2( 2, CBA_PRS_CONST ); // const1
1667 return -1;
1668 }
1669 assert( Type == CBA_PRS_CONCAT );
1670 vSigs = Prs_CatSignals( pNtk, Value );
1671 Vec_IntForEachEntry( vSigs, SigTemp, i )
1672 {
1673 Value = Abc_Lit2Var2( SigTemp );
1674 Type = (Prs_ManType_t)Abc_Lit2Att2( SigTemp );
1675 if ( Type != CBA_PRS_NAME )
1676 return -1;
1677 if ( SigOne == -1 )
1678 SigOne = Value;
1679 else if ( SigOne != Value )
1680 return -1;
1681 }
1682 assert( SigOne >= 0 );
1683 return Abc_Var2Lit2( SigOne, CBA_PRS_NAME );
1684}
1685
1686int Prs_CreateFlopSetReset( Cba_Ntk_t * p, Prs_Ntk_t * pNtk, Vec_Int_t * vBox, int * pIndexSet, int * pIndexRst, int * pBitSet, int * pBitRst )
1687{
1688 int iSigSet = -1, iSigRst = -1;
1689 int IndexSet = -1, IndexRst = -1;
1690 int FormId, ActId, k;
1691 // mark set and reset
1692 Cba_NtkCleanMap2( p );
1693 Cba_NtkSetMap2( p, Cba_NtkStrId(p, "set"), 1 );
1694 Cba_NtkSetMap2( p, Cba_NtkStrId(p, "reset"), 2 );
1695 // check the inputs
1696 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
1697 if ( Cba_NtkGetMap2(p, FormId) == 1 ) // set
1698 iSigSet = ActId, IndexSet = k+1;
1699 else if ( Cba_NtkGetMap2(p, FormId) == 2 ) // reset
1700 iSigRst = ActId, IndexRst = k+1;
1701 assert( iSigSet >= 0 && iSigRst >= 0 );
1702 if ( pIndexSet ) *pBitSet = 0;
1703 if ( pIndexRst ) *pBitRst = 0;
1704 if ( pBitSet ) *pBitSet = 0;
1705 if ( pBitRst ) *pBitRst = 0;
1706 if ( iSigSet == -1 || iSigRst == -1 )
1707 return 0;
1708 iSigSet = Prs_CreateBitSignal(pNtk, iSigSet);
1709 iSigRst = Prs_CreateBitSignal(pNtk, iSigRst);
1710 if ( iSigSet == -1 || iSigRst == -1 )
1711 return 0;
1712 if ( pIndexSet ) *pIndexSet = IndexSet;
1713 if ( pIndexRst ) *pIndexRst = IndexRst;
1714 if ( pBitSet ) *pBitSet = iSigSet;
1715 if ( pBitRst ) *pBitRst = iSigRst;
1716 return 1;
1717}
1718char * Prs_CreateDetectRamPort( Prs_Ntk_t * pNtk, Vec_Int_t * vBox, int NameRamId )
1719{
1720 int i, FormId, ActId;
1721 Vec_IntForEachEntryDouble( vBox, FormId, ActId, i )
1722 if ( FormId == NameRamId )
1723 return Abc_NamStr(pNtk->pStrs, Abc_Lit2Var2(ActId));
1724 return NULL;
1725}
1726int Prs_CreateGetMemSize( char * pName )
1727{
1728 char * pPtr1 = strchr( pName, '_' );
1729 char * pPtr2 = strchr( pPtr1+1, '_' );
1730 int Num1 = atoi( pPtr1 + 1 );
1731 int Num2 = atoi( pPtr2 + 1 );
1732 assert( Num1 + Abc_Base2Log(Num2) < 32 );
1733 return (1 << Num1) * Num2;
1734}
1736{
1737 Vec_Ptr_t * vAllRams = NULL, * vRam;
1738 Vec_Int_t * vBox, * vBoxCopy;
1739 char * pNtkName, * pRamName;
1740 int NameRamId = Abc_NamStrFind( pNtk->pStrs, "Ram" );
1741 int i, k, fWrite;
1742 Prs_NtkForEachBox( pNtk, vBox, i )
1743 {
1744 if ( Prs_BoxIsNode(pNtk, i) ) // node
1745 continue;
1746 pNtkName = Prs_NtkStr(pNtk, Prs_BoxNtk(pNtk, i));
1747 fWrite = !strncmp(pNtkName, "ClockedWritePort_", strlen("ClockedWritePort_"));
1748 if ( fWrite || !strncmp(pNtkName, "ReadPort_", strlen("ReadPort_")) )
1749 {
1750 pRamName = Prs_CreateDetectRamPort( pNtk, vBox, NameRamId ); assert( pRamName );
1751 if ( vAllRams == NULL )
1752 vAllRams = Vec_PtrAlloc( 4 );
1753 Vec_PtrForEachEntry( Vec_Ptr_t *, vAllRams, vRam, k )
1754 if ( pRamName == (char *)Vec_PtrEntry(vRam, 0) )
1755 {
1756 if ( fWrite )
1757 {
1758 vBoxCopy = Vec_IntDup(vBox);
1759 Vec_IntPush( vBoxCopy, i );
1760 Vec_PtrPush( vRam, vBoxCopy );
1761 }
1762 break;
1763 }
1764 if ( k < Vec_PtrSize(vAllRams) )
1765 continue;
1766 vRam = Vec_PtrAlloc( 4 );
1767 Vec_PtrPush( vRam, pRamName );
1768 Vec_PtrPush( vRam, Abc_Int2Ptr(Prs_CreateGetMemSize(pNtkName)) );
1769 if ( fWrite )
1770 {
1771 vBoxCopy = Vec_IntDup(vBox);
1772 Vec_IntPush( vBoxCopy, i );
1773 Vec_PtrPush( vRam, vBoxCopy );
1774 }
1775 Vec_PtrPush( vAllRams, vRam );
1776 }
1777 }
1778 return vAllRams;
1779}
1781{
1782 int i, NameId, RangeId, iObj, iFon;
1783 Cba_NtkCleanObjFuncs( p );
1784 Cba_NtkCleanObjNames( p );
1785 Cba_NtkCleanFonNames( p );
1786 Cba_NtkCleanFonRanges( p );
1787 // create inputs
1788 Cba_NtkCleanMap( p );
1789 assert( Vec_IntSize(&pNtk->vInouts) == 0 );
1790 Vec_IntForEachEntryTwo( &pNtk->vInputs, &pNtk->vInputsR, NameId, RangeId, i )
1791 {
1792 iObj = Cba_ObjAlloc( p, CBA_OBJ_PI, 0, 1 );
1793 Cba_ObjSetName( p, iObj, NameId ); // direct name
1794 iFon = Cba_ObjFon0(p, iObj);
1795 Cba_FonSetRangeSign( p, iFon, RangeId );
1796 Cba_FonSetName( p, iFon, NameId );
1797 Cba_NtkSetMap( p, NameId, iObj );
1798 }
1799 // create outputs
1800 Vec_IntForEachEntryTwo( &pNtk->vOutputs, &pNtk->vOutputsR, NameId, RangeId, i )
1801 {
1802 iObj = Cba_ObjAlloc( p, CBA_OBJ_PO, 1, 0 );
1803 Cba_ObjSetName( p, iObj, NameId ); // direct name
1804 Cba_NtkSetMap( p, NameId, iObj );
1805 }
1806 // create order
1807 Vec_IntForEachEntry( &pNtk->vOrder, NameId, i )
1808 {
1809 iObj = Prs_CreateVerilogFindFon( p, Abc_Lit2Var2(NameId) ); // labeled name
1810 if ( iObj )
1811 Vec_IntPush( &p->vOrder, iObj );
1812 }
1813}
1815{
1816 Vec_Int_t * vBox2Obj = Vec_IntStart( Prs_NtkBoxNum(pNtk) );
1817 Vec_Int_t * vBox; Vec_Ptr_t * vAllRams, * vRam;
1818 int i, k, iObj, iTerm, iFon, FormId, ActId, RangeId, NameId, Type;
1819 // map inputs
1820 Cba_NtkCleanMap( p );
1821 Cba_NtkForEachPi( p, iObj, i )
1822 Cba_NtkSetMap( p, Cba_ObjName(p, iObj), Cba_ObjFon0(p, iObj) );
1823
1824 // map wire names into their rangeID
1825 Vec_IntForEachEntryTwo( &pNtk->vWires, &pNtk->vWiresR, NameId, RangeId, i )
1826 Cba_NtkSetMap( p, NameId, -RangeId );
1827 Vec_IntForEachEntryTwo( &pNtk->vOutputs, &pNtk->vOutputsR, NameId, RangeId, i )
1828 Cba_NtkSetMap( p, NameId, -RangeId );
1829
1830 // collect RAMs and create boxes
1831 vAllRams = Prs_CreateDetectRams( pNtk );
1832 if ( vAllRams )
1833 Vec_PtrForEachEntry( Vec_Ptr_t *, vAllRams, vRam, i )
1834 {
1835 char * pRamName = (char *)Vec_PtrEntry( vRam, 0 );
1836 int MemSize = Abc_Ptr2Int( (char *)Vec_PtrEntry( vRam, 1 ) );
1837 //char Buffer[1000]; sprintf( Buffer, "%s_box", pRamName );
1838 //NameId = Cba_NtkNewStrId( p, Buffer );
1839 NameId = Cba_NtkNewStrId( p, "%s_box", pRamName );
1840 // create RAM object
1841 iObj = Cba_ObjAlloc( p, CBA_BOX_RAMBOX, Vec_PtrSize(vRam)-2, 1 );
1842 Cba_ObjSetName( p, iObj, NameId );
1843 iFon = Cba_ObjFon0(p, iObj);
1844 NameId = Cba_NtkNewStrId( p, pRamName );
1845 Cba_FonSetName( p, iFon, NameId );
1846 Prs_CreateRange( p, iFon, NameId );
1847 assert( Cba_FonLeft(p, iFon) <= MemSize-1 );
1848 assert( Cba_FonRight(p, iFon) == 0 );
1849 //Cba_VerificSaveLineFile( p, iObj, pNet->Linefile() );
1850 // create write ports feeding into this object
1851 Vec_PtrForEachEntryStart( Vec_Int_t *, vRam, vBox, k, 2 )
1852 {
1853 int iObjNew = Cba_ObjAlloc( p, CBA_BOX_RAMWC, 4, 1 );
1854 int Line = Vec_IntPop( vBox );
1855 Vec_IntWriteEntry( vBox2Obj, Line, iObjNew );
1856 if ( Prs_BoxName(pNtk, Line) )
1857 Cba_ObjSetName( p, iObjNew, Prs_BoxName(pNtk, Line) );
1858 //Cba_VerificSaveLineFile( p, iObjNew, pInst->Linefile() );
1859 // connect output
1860 iFon = Cba_ObjFon0(p, iObjNew);
1861 Cba_FonSetRange( p, iFon, Cba_NtkHashRange(p, MemSize-1, 0) );
1862 //sprintf( Buffer, "%s_wp%d", pRamName, k-2 );
1863 //NameId = Cba_NtkNewStrId( p, Buffer );
1864 NameId = Cba_NtkNewStrId( p, "%s_wp%d", pRamName, k-2 );
1865 Cba_FonSetName( p, iFon, NameId );
1866 Cba_NtkSetMap( p, NameId, iFon );
1867 // connet to RAM object
1868 Cba_ObjSetFinFon( p, iObj, (k++)-2, iFon );
1869 Vec_IntFree( vBox );
1870 }
1871 Vec_PtrFree( vRam );
1872 }
1873 Vec_PtrFreeP( &vAllRams );
1874
1875 // create objects
1876 Vec_IntClear( &p->vArray0 );
1877 Prs_NtkForEachBox( pNtk, vBox, i )
1878 {
1879 if ( Prs_BoxIsNode(pNtk, i) ) // node
1880 {
1881 Type = Prs_BoxNtk(pNtk, i);
1882 iObj = Cba_ObjAlloc( p, (Cba_ObjType_t)Type, Prs_BoxIONum(pNtk, i)-1, Type == CBA_BOX_ADD ? 2 : 1 );
1883 Prs_CreateSignalOut( p, Cba_ObjFon0(p, iObj), pNtk, Vec_IntEntry(vBox, 1) ); // node output
1884 }
1885 else // box
1886 {
1887 Cba_Ntk_t * pBox = NULL; int nInputs, nOutputs = 1;
1888 char ** pOutNames = NULL, * pNtkName = Prs_NtkStr(pNtk, Prs_BoxNtk(pNtk, i));
1889 Type = Prs_ManFindType( pNtkName, &nInputs, 1, &pOutNames );
1890 if ( Type == CBA_BOX_RAMWC )
1891 continue;
1892 if ( Type == CBA_OBJ_BOX )
1893 {
1894 pBox = Cba_ManNtkFind( p->pDesign, pNtkName );
1895 if ( pBox == NULL )
1896 {
1897 printf( "Fatal error: Cannot find module \"%s\".\n", pNtkName );
1898 continue;
1899 }
1900 nInputs = Cba_NtkPiNum(pBox);
1901 nOutputs = Cba_NtkPoNum(pBox);
1902 }
1903 else if ( Type == CBA_BOX_ADD || Type == CBA_BOX_DFFCPL )
1904 nOutputs = 2;
1905 else if ( Type == CBA_BOX_NMUX )
1906 {
1907 if ( !strncmp(pNtkName, "wide_mux_", strlen("wide_mux_")) )
1908 nInputs = 1 + (1 << atoi(pNtkName+strlen("wide_mux_")));
1909 else if ( !strncmp(pNtkName, "Mux_", strlen("Mux_")) )
1910 nInputs = 1 + (1 << atoi(pNtkName+strlen("Mux_")));
1911 else assert( 0 );
1912 }
1913 else if ( Type == CBA_BOX_SEL )
1914 {
1915 if ( !strncmp(pNtkName, "wide_select_", strlen("wide_select_")) )
1916 nInputs = 1 + atoi(pNtkName+strlen("wide_select_"));
1917 else if ( !strncmp(pNtkName, "Select_", strlen("Select_")) )
1918 nInputs = 1 + atoi(pNtkName+strlen("Select_"));
1919 else assert( 0 );
1920 }
1921 else if ( (Type == CBA_BOX_DFFRS || Type == CBA_BOX_LATCHRS) && !strncmp(pNtkName, "wide_", strlen("wide_")) && !Prs_CreateFlopSetReset(p, pNtk, vBox, NULL, NULL, NULL, NULL) )
1922 nInputs = atoi(pNtkName+strlen(Type == CBA_BOX_DFFRS ? "wide_dffrs_" : "wide_latchrs_")), nOutputs = 1, Type = CBA_BOX_CONCAT;
1923 // create object
1924 iObj = Cba_ObjAlloc( p, (Cba_ObjType_t)Type, nInputs, nOutputs );
1925 if ( pBox ) Cba_ObjSetFunc( p, iObj, Cba_NtkId(pBox) );
1926 // mark PO objects
1927 Cba_NtkCleanMap2( p );
1928 if ( pBox )
1929 Cba_NtkForEachPo( pBox, iTerm, k )
1930 Cba_NtkSetMap2( p, Cba_ObjName(pBox, iTerm), k+1 );
1931 else
1932 for ( k = 0; k < nOutputs; k++ )
1933 Cba_NtkSetMap2( p, Cba_NtkStrId(p, pOutNames[k]), k+1 );
1934 // map box fons
1935 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
1936 if ( Cba_NtkGetMap2(p, FormId) )
1937 {
1938 iFon = Cba_ObjFon(p, iObj, Cba_NtkGetMap2(p, FormId)-1);
1939 Prs_CreateSignalOut( p, iFon, pNtk, ActId );
1940 }
1941 }
1942 Vec_IntWriteEntry( vBox2Obj, i, iObj );
1943 if ( Prs_BoxName(pNtk, i) )
1944 Cba_ObjSetName( p, iObj, Prs_BoxName(pNtk, i) );
1945 //Cba_VerificSaveLineFile( p, iObj, pInst->Linefile() );
1946 }
1947
1948 // create concatenations for split signals
1949 if ( Vec_IntSize(&p->vArray0) )
1950 {
1951 int Prev = -1, Index = 0;
1952 Vec_IntSortMulti( &p->vArray0, 3, 0 );
1953 Vec_IntForEachEntryTriple( &p->vArray0, NameId, RangeId, iFon, i )
1954 {
1955 if ( Prev != -1 && Prev != NameId )
1956 Prs_CreateOutConcat( p, Vec_IntArray(&p->vArray0) + Index, (i - Index)/3 ), Index = i;
1957 Prev = NameId;
1958 }
1959 Prs_CreateOutConcat( p, Vec_IntArray(&p->vArray0) + Index, (i - Index)/3 ), Index = i;
1960 //Cba_VerificSaveLineFile( p, iObj, pInst->Linefile() );
1961 }
1962
1963 // connect objects
1964 Prs_NtkForEachBox( pNtk, vBox, i )
1965 {
1966 iObj = Vec_IntEntry( vBox2Obj, i );
1967 if ( Prs_BoxIsNode(pNtk, i) ) // node
1968 {
1969 Type = Prs_BoxNtk(pNtk, i);
1970 Vec_IntForEachEntryDoubleStart( vBox, FormId, ActId, k, 2 )
1971 {
1972 iFon = Prs_CreateSignalIn( p, pNtk, ActId );
1973 if ( iFon )
1974 Cba_ObjSetFinFon( p, iObj, k/2-1, iFon );
1975 }
1976 }
1977 else // box
1978 {
1979 int nInputs = -1;
1980 char ** pInNames = NULL, * pNtkName = Prs_NtkStr(pNtk, Prs_BoxNtk(pNtk, i));
1981 Type = Prs_ManFindType( pNtkName, &nInputs, 0, &pInNames );
1982 if ( (Type == CBA_BOX_DFFRS || Type == CBA_BOX_LATCHRS) && !strncmp(pNtkName, "wide_", strlen("wide_")) )
1983 {
1984 int IndexSet = -1, IndexRst = -1, iBitSet = -1, iBitRst = -1;
1985 int Status = Prs_CreateFlopSetReset( p, pNtk, vBox, &IndexSet, &IndexRst, &iBitSet, &iBitRst );
1986 if ( Status )
1987 {
1988 Vec_IntWriteEntry( vBox, IndexSet, iBitSet );
1989 Vec_IntWriteEntry( vBox, IndexRst, iBitRst );
1990 // updated box should be fine
1991 }
1992 else
1993 {
1994 int w, Width = atoi( pNtkName + strlen(Type == CBA_BOX_DFFRS ? "wide_dffrs_" : "wide_latchrs_") );
1995 assert( Cba_ObjType(p, iObj) == CBA_BOX_CONCAT );
1996 // prepare inputs
1997 assert( nInputs >= 0 );
1998 Cba_NtkCleanMap2( p );
1999 for ( k = 0; k < nInputs; k++ )
2000 Cba_NtkSetMap2( p, Cba_NtkStrId(p, pInNames[k]), k+1 );
2001 // create bit-level objects
2002 for ( w = 0; w < Width; w++ )
2003 {
2004 // create bit-level flop
2005 int iObjNew = Cba_ObjAlloc( p, (Cba_ObjType_t)Type, 4, 1 );
2006 if ( Prs_BoxName(pNtk, i) )
2007 {
2008 NameId = Cba_NtkNewStrId( p, "%s[%d]", Prs_NtkStr(pNtk, Prs_BoxName(pNtk, i)), w );
2009 Cba_ObjSetName( p, iObjNew, NameId );
2010 }
2011 //Cba_VerificSaveLineFile( p, iObjNew, pInst->Linefile() );
2012 // set output fon
2013 iFon = Cba_ObjFon0(p, iObjNew);
2014 {
2015 NameId = Cba_NtkNewStrId( p, "%s[%d]", Cba_FonNameStr(p, Cba_ObjFon0(p, iObj)), w );
2016 Cba_FonSetName( p, iFon, NameId );
2017 }
2018 // no need to map this name because it may be produced elsewhere
2019 //Cba_NtkSetMap( p, NameId, iFon );
2020 // add the flop
2021 Cba_ObjSetFinFon( p, iObj, Width-1-w, iFon );
2022 // create bit-level flops
2023 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
2024 if ( Cba_NtkGetMap2(p, FormId) )
2025 {
2026 int Index = Cba_NtkGetMap2(p, FormId)-1;
2027 iFon = Prs_CreateSignalIn( p, pNtk, ActId ); assert( iFon );
2028 // create bit-select node for data/set/reset (but not for clock)
2029 if ( Index < 3 ) // not clock
2030 iFon = Prs_CreateSlice( p, iFon, pNtk, 0 );
2031 Cba_ObjSetFinFon( p, iObjNew, Index, iFon );
2032 }
2033 }
2034 continue;
2035 }
2036 }
2037 assert( Type == Cba_ObjType(p, iObj) );
2038 //assert( nInputs == -1 || nInputs == Cba_ObjFinNum(p, iObj) );
2039 // mark PI objects
2040 Cba_NtkCleanMap2( p );
2041 if ( Type == CBA_OBJ_BOX )
2042 {
2043 Cba_Ntk_t * pBox = Cba_ObjNtk(p, iObj);
2044 assert( Cba_NtkPiNum(pBox) == Cba_ObjFinNum(p, iObj) );
2045 assert( Cba_NtkPoNum(pBox) == Cba_ObjFonNum(p, iObj) );
2046 Cba_NtkForEachPi( pBox, iTerm, k )
2047 Cba_NtkSetMap2( p, Cba_ObjName(pBox, iTerm), k+1 );
2048 }
2049 else
2050 {
2051 assert( nInputs >= 0 );
2052 for ( k = 0; k < nInputs; k++ )
2053 Cba_NtkSetMap2( p, Cba_NtkStrId(p, pInNames[k]), k+1 );
2054 }
2055 // connect box fins
2056 Vec_IntForEachEntryDouble( vBox, FormId, ActId, k )
2057 if ( Cba_NtkGetMap2(p, FormId) )
2058 {
2059 int Index = Cba_NtkGetMap2(p, FormId)-1;
2060 int nBits = Cba_ObjFinNum(p, iObj);
2061 assert( Index < nBits );
2062 iFon = Prs_CreateSignalIn( p, pNtk, ActId );
2063 if ( iFon )
2064 Cba_ObjSetFinFon( p, iObj, Index, iFon );
2065 }
2066 // special cases
2067 if ( Type == CBA_BOX_NMUX || Type == CBA_BOX_SEL )
2068 {
2069 int FonCat = Cba_ObjFinFon( p, iObj, 1 );
2070 int nBits = Cba_FonRangeSize( p, FonCat );
2071 int nParts = Cba_ObjFinNum(p, iObj) - 1;
2072 int Slice = nBits / nParts;
2073 int nFins = Cba_ObjFinNum(p, iObj);
2074 assert( Cba_ObjFinNum(p, iObj) >= 2 );
2075 assert( Slice * nParts == nBits );
2076 assert( nFins == 1 + nParts );
2077 Cba_ObjCleanFinFon( p, iObj, 1 );
2078 // create buffer for the constant
2079 if ( FonCat < 0 )
2080 {
2081 int iObjNew = Cba_ObjAlloc( p, CBA_BOX_BUF, 1, 1 );
2082 Cba_ObjSetFinFon( p, iObjNew, 0, FonCat );
2083 FonCat = Cba_ObjFon0( p, iObjNew );
2084 NameId = Cba_NtkNewStrId( p, "_buf_const_%d", iObjNew );
2085 Cba_FonSetName( p, FonCat, NameId );
2086 Cba_FonSetRange( p, FonCat, Cba_NtkHashRange(p, nBits-1, 0) );
2087 }
2088 for ( k = 0; k < nParts; k++ )
2089 {
2090// iFon = Prs_CreateSlice( p, FonCat, pNtk, Cba_NtkHashRange(p, (nParts-1-k)*Slice+Slice-1, (nParts-1-k)*Slice) );
2091 iFon = Prs_CreateSlice( p, FonCat, pNtk, Cba_NtkHashRange(p, k*Slice+Slice-1, k*Slice) );
2092 Cba_ObjSetFinFon( p, iObj, k+1, iFon );
2093 }
2094 }
2095 }
2096 // if carry-in is not supplied, use constant 0
2097 if ( Type == CBA_BOX_ADD && Cba_ObjFinFon(p, iObj, 0) == 0 )
2098 Cba_ObjSetFinFon( p, iObj, 0, Cba_FonFromConst(1) );
2099 // if set or reset are not supplied, use constant 0
2100 if ( Type == CBA_BOX_DFFRS && Cba_ObjFinFon(p, iObj, 1) == 0 )
2101 Cba_ObjSetFinFon( p, iObj, 1, Cba_FonFromConst(1) );
2102 if ( Type == CBA_BOX_DFFRS && Cba_ObjFinFon(p, iObj, 2) == 0 )
2103 Cba_ObjSetFinFon( p, iObj, 2, Cba_FonFromConst(1) );
2104 }
2105 Vec_IntFree( vBox2Obj );
2106 // connect outputs
2107 Vec_IntForEachEntryTwo( &pNtk->vOutputs, &pNtk->vOutputsR, NameId, RangeId, i )
2108 {
2109 iObj = Cba_NtkPo( p, i );
2110 assert( NameId == Cba_ObjName(p, iObj) ); // direct name
2111 iFon = Prs_CreateVerilogFindFon( p, NameId );
2112 if ( !iFon )
2113 continue;
2114 Cba_ObjSetFinFon( p, iObj, 0, iFon );
2115 if ( RangeId )
2116 {
2117 assert( Cba_NtkRangeLeft(p, Abc_Lit2Var(RangeId)) == Cba_FonLeft(p, iFon) );
2118 assert( Cba_NtkRangeRight(p, Abc_Lit2Var(RangeId)) == Cba_FonRight(p, iFon) );
2119 }
2120 }
2121 return 0;
2122}
2123Cba_Man_t * Prs_ManBuildCbaVerilog( char * pFileName, Vec_Ptr_t * vDes )
2124{
2125 Prs_Ntk_t * pPrsNtk; int i, fError = 0;
2126 Prs_Ntk_t * pPrsRoot = Prs_ManRoot(vDes);
2127 // start the manager
2128 Abc_Nam_t * pStrs = Abc_NamRef(pPrsRoot->pStrs);
2129 Abc_Nam_t * pFuns = Abc_NamRef(pPrsRoot->pFuns);
2130 Abc_Nam_t * pMods = Abc_NamStart( 100, 24 );
2131 Cba_Man_t * p = Cba_ManAlloc( pFileName, Vec_PtrSize(vDes), pStrs, pFuns, pMods, Hash_IntManRef(pPrsRoot->vHash) );
2132 // initialize networks
2133 Vec_PtrForEachEntry( Prs_Ntk_t *, vDes, pPrsNtk, i )
2134 {
2135 Cba_Ntk_t * pNtk = Cba_NtkAlloc( p, Prs_NtkId(pPrsNtk), Prs_NtkPiNum(pPrsNtk), Prs_NtkPoNum(pPrsNtk), Prs_NtkObjNum(pPrsNtk), 100, 100 );
2136 Prs_CreateVerilogPio( pNtk, pPrsNtk );
2137 Cba_NtkAdd( p, pNtk );
2138 }
2139 // create networks
2140 Vec_PtrForEachEntry( Prs_Ntk_t *, vDes, pPrsNtk, i )
2141 {
2142 printf( "Building module \"%s\"...\n", Prs_NtkName(pPrsNtk) );
2143 fError = Prs_CreateVerilogNtk( Cba_ManNtk(p, i+1), pPrsNtk );
2144 if ( fError )
2145 break;
2146 }
2147 if ( fError )
2148 printf( "Quitting because of errors.\n" );
2149 else
2150 Cba_ManPrepareSeq( p );
2151 return p;
2152}
2153
2165Cba_Man_t * Cba_ManReadVerilog( char * pFileName )
2166{
2167 Cba_Man_t * p = NULL;
2168 Vec_Ptr_t * vDes = Prs_ManReadVerilog( pFileName );
2169 if ( vDes && Vec_PtrSize(vDes) )
2170 p = Prs_ManBuildCbaVerilog( pFileName, vDes );
2171 if ( vDes )
2172 Prs_ManVecFree( vDes );
2173 return p;
2174}
2175
2179
2180
2182
#define ABC_SWAP(Type, a, b)
Definition abc_global.h:253
ABC_INT64_T abctime
Definition abc_global.h:332
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
@ PRS_VER_INPUT
Definition bacReadVer.c:33
@ PRS_VER_ENDMODULE
Definition bacReadVer.c:44
@ PRS_VER_UNKNOWN
Definition bacReadVer.c:45
@ PRS_VER_END
Definition bacReadVer.c:43
@ PRS_VER_ASSIGN
Definition bacReadVer.c:38
@ PRS_VER_DEFPARAM
Definition bacReadVer.c:41
@ PRS_VER_INOUT
Definition bacReadVer.c:35
@ PRS_VER_REG
Definition bacReadVer.c:39
@ PRS_VER_BEGIN
Definition bacReadVer.c:42
@ PRS_VER_WIRE
Definition bacReadVer.c:36
@ PRS_VER_MODULE
Definition bacReadVer.c:37
@ PRS_VER_ALWAYS
Definition bacReadVer.c:40
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
Definition bblif.c:37
@ PRS_VER_ENDCASE
Definition cbaPrs.h:54
@ PRS_VER_CASE
Definition cbaPrs.h:53
@ PRS_VER_FUNCTION
Definition cbaPrs.h:49
@ PRS_VER_SIGNED
Definition cbaPrs.h:55
#define Prs_ManForEachNameVec(vVec, p, pName, i)
Definition cbaPrs.h:173
struct Prs_Man_t_ Prs_Man_t
Definition cbaPrs.h:107
Prs_ManType_t
Definition cbaPrs.h:61
@ CBA_PRS_SLICE
Definition cbaPrs.h:63
@ CBA_PRS_CONST
Definition cbaPrs.h:64
@ CBA_PRS_CONCAT
Definition cbaPrs.h:65
@ CBA_PRS_NAME
Definition cbaPrs.h:62
struct Prs_Ntk_t_ Prs_Ntk_t
BASIC TYPES ///.
Definition cbaPrs.h:73
#define Prs_NtkForEachBox(p, vVec, i)
Definition cbaPrs.h:182
void Prs_ManReadVerilogTest(char *pFileName)
struct Prs_VerInfo_t_ Prs_VerInfo_t
Definition cbaReadVer.c:171
char * Prs_CreateDetectRamPort(Prs_Ntk_t *pNtk, Vec_Int_t *vBox, int NameRamId)
int Prs_CreateRange(Cba_Ntk_t *p, int iFon, int NameId)
int Prs_CreateSignalIn(Cba_Ntk_t *p, Prs_Ntk_t *pNtk, int Sig)
int Prs_CreateFlopSetReset(Cba_Ntk_t *p, Prs_Ntk_t *pNtk, Vec_Int_t *vBox, int *pIndexSet, int *pIndexRst, int *pBitSet, int *pBitRst)
int Prs_ManReadSignalList(Prs_Man_t *p, Vec_Int_t *vTemp, char LastSymb, int fAddForm)
Definition cbaReadVer.c:624
struct Prs_VerPrim_t_ Prs_VerPrim_t
FUNCTION DEFINITIONS ///.
Definition cbaReadVer.c:90
int Prs_CreateSlice(Cba_Ntk_t *p, int iFon, Prs_Ntk_t *pNtk, int Range)
Vec_Ptr_t * Prs_CreateDetectRams(Prs_Ntk_t *pNtk)
int Prs_CreateGetMemSize(char *pName)
void Prs_ManPrintModules(Prs_Man_t *p)
int Prs_CreateBitSignal(Prs_Ntk_t *pNtk, int Sig)
int Prs_CreateCatIn(Cba_Ntk_t *p, Prs_Ntk_t *pNtk, int Con)
Cba_Man_t * Cba_ManReadVerilog(char *pFileName)
int Prs_CreateVerilogFindFon(Cba_Ntk_t *p, int NameId)
void Prs_CreateOutConcat(Cba_Ntk_t *p, int *pSlices, int nSlices)
Vec_Ptr_t * Prs_ManReadVerilog(char *pFileName)
void Prs_CreateSignalOut(Cba_Ntk_t *p, int iFon, Prs_Ntk_t *pNtk, int Sig)
void Prs_CreateVerilogPio(Cba_Ntk_t *p, Prs_Ntk_t *pNtk)
int Prs_CreateVerilogNtk(Cba_Ntk_t *p, Prs_Ntk_t *pNtk)
void Prs_NtkAddVerilogDirectives(Prs_Man_t *p)
ITERATORS ///.
Definition cbaReadVer.c:51
Cba_Man_t * Prs_ManBuildCbaVerilog(char *pFileName, Vec_Ptr_t *vDes)
Cba_ObjType_t
INCLUDES ///.
Definition cbaTypes.h:39
@ CBA_BOX_RNAND
Definition cbaTypes.h:72
@ CBA_BOX_RAMW
Definition cbaTypes.h:129
@ CBA_BOX_SHIRA
Definition cbaTypes.h:117
@ CBA_BOX_NEQU
Definition cbaTypes.h:112
@ CBA_BOX_INV
Definition cbaTypes.h:51
@ CBA_BOX_LTHAN
Definition cbaTypes.h:107
@ CBA_BOX_MUL
Definition cbaTypes.h:96
@ CBA_BOX_NOR
Definition cbaTypes.h:55
@ CBA_BOX_MOD
Definition cbaTypes.h:99
@ CBA_BOX_DIV
Definition cbaTypes.h:98
@ CBA_BOX_XNOR
Definition cbaTypes.h:57
@ CBA_BOX_LOR
Definition cbaTypes.h:81
@ CBA_OBJ_BOX
Definition cbaTypes.h:43
@ CBA_BOX_PENC
Definition cbaTypes.h:90
@ CBA_BOX_RAM
Definition cbaTypes.h:127
@ CBA_BOX_LUT
Definition cbaTypes.h:122
@ CBA_BOX_LNOT
Definition cbaTypes.h:78
@ CBA_BOX_RXOR
Definition cbaTypes.h:75
@ CBA_BOX_BUF
Definition cbaTypes.h:50
@ CBA_BOX_CX
Definition cbaTypes.h:47
@ CBA_BOX_SHIL
Definition cbaTypes.h:114
@ CBA_BOX_RAMBOX
Definition cbaTypes.h:133
@ CBA_BOX_METHAN
Definition cbaTypes.h:109
@ CBA_BOX_SHILA
Definition cbaTypes.h:116
@ CBA_BOX_RAMR
Definition cbaTypes.h:128
@ CBA_BOX_SHIR
Definition cbaTypes.h:115
@ CBA_BOX_NMUX
Definition cbaTypes.h:86
@ CBA_BOX_CZ
Definition cbaTypes.h:48
@ CBA_BOX_MIN
Definition cbaTypes.h:102
@ CBA_BOX_REM
Definition cbaTypes.h:100
@ CBA_BOX_LATCHRS
Definition cbaTypes.h:136
@ CBA_BOX_NAND
Definition cbaTypes.h:53
@ CBA_BOX_RNOR
Definition cbaTypes.h:74
@ CBA_BOX_MUX
Definition cbaTypes.h:60
@ CBA_BOX_RXNOR
Definition cbaTypes.h:76
@ CBA_BOX_ROTR
Definition cbaTypes.h:119
@ CBA_BOX_PSEL
Definition cbaTypes.h:88
@ CBA_BOX_SEL
Definition cbaTypes.h:87
@ CBA_BOX_ROTL
Definition cbaTypes.h:118
@ CBA_BOX_ABS
Definition cbaTypes.h:104
@ CBA_BOX_RAMWC
Definition cbaTypes.h:130
@ CBA_BOX_POW
Definition cbaTypes.h:101
@ CBA_BOX_TRI
Definition cbaTypes.h:126
@ CBA_BOX_ROR
Definition cbaTypes.h:73
@ CBA_OBJ_PI
Definition cbaTypes.h:41
@ CBA_BOX_SQRT
Definition cbaTypes.h:103
@ CBA_BOX_EQU
Definition cbaTypes.h:111
@ CBA_BOX_LETHAN
Definition cbaTypes.h:108
@ CBA_BOX_RAND
Definition cbaTypes.h:71
@ CBA_BOX_AND
Definition cbaTypes.h:52
@ CBA_BOX_SLICE
Definition cbaTypes.h:141
@ CBA_BOX_CF
Definition cbaTypes.h:45
@ CBA_BOX_EDEC
Definition cbaTypes.h:92
@ CBA_BOX_LAND
Definition cbaTypes.h:79
@ CBA_BOX_LATCH
Definition cbaTypes.h:135
@ CBA_OBJ_NONE
Definition cbaTypes.h:40
@ CBA_OBJ_PO
Definition cbaTypes.h:42
@ CBA_BOX_ADD
Definition cbaTypes.h:94
@ CBA_BOX_DFFCPL
Definition cbaTypes.h:138
@ CBA_BOX_OR
Definition cbaTypes.h:54
@ CBA_BOX_DFFRS
Definition cbaTypes.h:139
@ CBA_BOX_CT
Definition cbaTypes.h:46
@ CBA_BOX_DFF
Definition cbaTypes.h:137
@ CBA_BOX_MTHAN
Definition cbaTypes.h:110
@ CBA_BOX_CONCAT
Definition cbaTypes.h:142
@ CBA_BOX_DEC
Definition cbaTypes.h:91
@ CBA_BOX_SUB
Definition cbaTypes.h:95
@ CBA_BOX_XOR
Definition cbaTypes.h:56
void Prs_ManWriteVerilog(char *pFileName, Vec_Ptr_t *p)
#define Cba_NtkForEachPo(p, iObj, i)
Definition cba.h:310
typedefABC_NAMESPACE_HEADER_START struct Cba_Ntk_t_ Cba_Ntk_t
INCLUDES ///.
Definition cba.h:45
char * Cba_ManGetSliceName(Cba_Ntk_t *p, int iFon, int RangeId)
struct Cba_Man_t_ Cba_Man_t
Definition cba.h:46
#define Cba_NtkForEachPi(p, iObj, i)
Definition cba.h:308
Cube * p
Definition exorList.c:222
char * Extra_FileNameGenericAppend(char *pBase, char *pSuffix)
Vec_Int_t vInputsR
Definition cbaPrs.h:96
Vec_Int_t vWires
Definition cbaPrs.h:93
Vec_Int_t vOutputs
Definition cbaPrs.h:92
Abc_Nam_t * pStrs
Definition cbaPrs.h:84
Abc_Nam_t * pFuns
Definition cbaPrs.h:85
Vec_Int_t vWiresR
Definition cbaPrs.h:98
Vec_Int_t vOrder
Definition cbaPrs.h:88
Vec_Int_t vOutputsR
Definition cbaPrs.h:97
Vec_Int_t vInouts
Definition cbaPrs.h:90
Hash_IntMan_t * vHash
Definition cbaPrs.h:86
Vec_Int_t vInputs
Definition cbaPrs.h:91
char * pSigNames[6]
Definition cbaReadVer.c:177
int Abc_NamStrFind(Abc_Nam_t *p, char *pStr)
Definition utilNam.c:433
int Abc_NamStrFindOrAddLim(Abc_Nam_t *p, char *pStr, char *pLim, int *pfFound)
Definition utilNam.c:492
int Abc_NamStrFindOrAdd(Abc_Nam_t *p, char *pStr, int *pfFound)
Definition utilNam.c:453
int Abc_NamObjNumMax(Abc_Nam_t *p)
Definition utilNam.c:231
Abc_Nam_t * Abc_NamStart(int nObjs, int nAveSize)
FUNCTION DEFINITIONS ///.
Definition utilNam.c:80
Abc_Nam_t * Abc_NamRef(Abc_Nam_t *p)
Definition utilNam.c:195
char * Abc_NamStr(Abc_Nam_t *p, int NameId)
Definition utilNam.c:555
typedefABC_NAMESPACE_HEADER_START struct Abc_Nam_t_ Abc_Nam_t
INCLUDES ///.
Definition utilNam.h:39
#define assert(ex)
Definition util_old.h:213
int strncmp()
int strlen()
int strcmp()
char * strstr()
char * strchr()
#define Vec_IntForEachEntryDouble(vVec, Entry1, Entry2, i)
Definition vecInt.h:72
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
Definition vecInt.h:54
#define Vec_IntForEachEntryTwo(vVec1, vVec2, Entry1, Entry2, i)
Definition vecInt.h:66
#define Vec_IntForEachEntryStartStop(vVec, Entry, i, Start, Stop)
Definition vecInt.h:60
#define Vec_IntForEachEntryTriple(vVec, Entry1, Entry2, Entry3, i)
Definition vecInt.h:76
#define Vec_IntForEachEntryDoubleStart(vVec, Entry1, Entry2, i, Start)
Definition vecInt.h:74
#define Vec_PtrForEachEntryStart(Type, vVec, pEntry, i, Start)
Definition vecPtr.h:57
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
Definition vecPtr.h:42
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
Definition vecPtr.h:55