141{
142 int k, j, iObj, iFanin;
143 char Range[100];
144 fprintf( pFile,
"module %s ( ",
p->pName );
145 fprintf( pFile, "\n " );
146 if ( Wln_NtkCiNum(
p) > 0 )
147 {
149 fprintf( pFile, ",\n " );
150 }
151 if ( Wln_NtkCoNum(
p) > 0 )
153 fprintf( pFile, " );\n" );
155 {
156 int End = Wln_ObjRangeEnd(
p, iObj);
157 int Beg = Wln_ObjRangeBeg(
p, iObj);
158 int nDigits = Abc_Base10Log(Abc_AbsInt(End)+1) + Abc_Base10Log(Abc_AbsInt(Beg)+1) + (int)(End < 0) + (int)(Beg < 0);
159 sprintf( Range,
"%s[%d:%d]%*s", (!
p->fSmtLib && Wln_ObjIsSigned(
p, iObj)) ?
"signed ":
" ", End, Beg, 8-nDigits,
"" );
160 fprintf( pFile, " " );
161 if ( Wln_ObjIsCi(
p, iObj) )
162 fprintf( pFile, "input " );
163 else if ( Wln_ObjIsCo(
p, iObj) )
164 fprintf( pFile, "output " );
165 else
166 fprintf( pFile, " " );
167 if ( Wln_ObjIsCio(
p, iObj) )
168 {
169 fprintf( pFile,
"wire %s %s ;\n", Range,
Wln_ObjName(
p, iObj) );
170 if ( Wln_ObjIsCi(
p, iObj) )
171 continue;
172 fprintf( pFile, " assign " );
174 continue;
175 }
177 fprintf( pFile, "reg %s ", Range );
178 else
179 fprintf( pFile, "wire %s ", Range );
181 {
182
183 fprintf( pFile,
"%s ; table%d",
Wln_ObjName(
p, iObj), Wln_ObjFanin1(
p, iObj) );
184 fprintf( pFile,
" s%d_Index(%s, ", iObj,
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
186 }
188 {
189
191 fprintf( pFile,
" lut%d (%s, ", iObj,
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
192 for ( k = 1; k < Wln_ObjFaninNum(
p, iObj); k++ )
193 fprintf( pFile,
"%s, ",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, k)) );
195 }
196 else if ( Wln_ObjIsConst(
p, iObj) )
199 {
200
201 int Num0 = Wln_ObjFanin1(
p, iObj);
202 int Num1 = Wln_ObjRange(
p, iObj) - Num0;
203 assert( Num0 > 0 && Num0 < Wln_ObjRange(
p, iObj) );
206 fprintf( pFile,
"(%s >> %d) | (%s << %d)",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)), Num0,
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)), Num1 );
207 else
208 fprintf( pFile,
"(%s << %d) | (%s >> %d)",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)), Num0,
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)), Num1 );
209 }
211 {
213 fprintf( pFile, " " );
214 fprintf( pFile, "always @( " );
216 fprintf( pFile,
"%s%s", k ?
" or ":
"",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, k)) );
217 fprintf( pFile, " )\n" );
218 fprintf( pFile, " " );
219 fprintf( pFile, "begin\n" );
220 fprintf( pFile, " " );
221 fprintf( pFile,
"case ( %s )\n",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, 0)) );
223 {
224 if ( !k ) continue;
225 fprintf( pFile, " " );
226 fprintf( pFile,
"%d : %s = ", k-1,
Wln_ObjName(
p, iObj) );
227 fprintf( pFile,
"%s ;\n",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, k)) );
228 }
229 fprintf( pFile, " " );
230 fprintf( pFile, "endcase\n" );
231 fprintf( pFile, " " );
232 fprintf( pFile, "end\n" );
233 continue;
234 }
236 {
238 fprintf( pFile, " " );
239 fprintf( pFile, "always @( " );
241 fprintf( pFile,
"%s%s", k ?
" or ":
"",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, k)) );
242 fprintf( pFile, " )\n" );
243 fprintf( pFile, " " );
244 fprintf( pFile, "begin\n" );
245 fprintf( pFile, " " );
246 fprintf( pFile,
"case ( %s )\n",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, 0)) );
248 {
249 if ( !k ) continue;
250 fprintf( pFile, " " );
251 fprintf( pFile,
"%d\'b", Wln_ObjFaninNum(
p, iObj)-1 );
252 for ( j = Wln_ObjFaninNum(
p, iObj)-1; j > 0; j-- )
253 fprintf( pFile, "%d", (int)(j==k) );
255 fprintf( pFile,
"%s ;\n",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, k)) );
256 }
257 fprintf( pFile, " " );
258 fprintf( pFile, "default" );
260 fprintf( pFile,
"%d\'b", Wln_ObjRange(
p, iObj) );
261 for ( j = Wln_ObjRange(
p, iObj)-1; j >= 0; j-- )
262 fprintf( pFile, "%d", 0 );
263 fprintf( pFile, " ;\n" );
264 fprintf( pFile, " " );
265 fprintf( pFile, "endcase\n" );
266 fprintf( pFile, " " );
267 fprintf( pFile, "end\n" );
268 continue;
269 }
271 {
272 int nRange = Wln_ObjRange(
p, Wln_ObjFanin0(
p, iObj));
273 assert( (1 << nRange) == Wln_ObjRange(
p, iObj) );
275 for ( k = 0; k < Wln_ObjRange(
p, iObj); k++ )
276 {
277 fprintf( pFile, " " );
278 fprintf( pFile, "wire " );
280 for ( j = 0; j < nRange; j++ )
281 fprintf( pFile, "%d", (k >> (nRange-1-j)) & 1 );
282 fprintf( pFile, " = " );
283 for ( j = 0; j < nRange; j++ )
284 fprintf( pFile, "%s%s%s[%d]",
285 j ? " & ":"", ((k >> (nRange-1-j)) & 1) ? " ":"~",
287 fprintf( pFile, " ;\n" );
288 }
289 fprintf( pFile, " " );
290 fprintf( pFile,
"assign %s = { ",
Wln_ObjName(
p, iObj) );
291 for ( k = Wln_ObjRange(
p, iObj)-1; k >= 0; k-- )
292 {
293 fprintf( pFile,
"%s%s_", k < Wln_ObjRange(
p, iObj)-1 ?
", ":
"",
Wln_ObjName(
p, iObj) );
294 for ( j = 0; j < nRange; j++ )
295 fprintf( pFile, "%d", (k >> (nRange-1-j)) & 1 );
296 }
297 fprintf( pFile, " } ;\n" );
298 continue;
299 }
301 {
302
304 fprintf( pFile, " " );
305 fprintf( pFile, "assign " );
306 fprintf( pFile, "%s = %s ? %s + %s + %s : %s - %s - %s ;\n",
308 Wln_ObjName(
p, Wln_ObjFanin2(
p, iObj)),
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj,3)),
Wln_ObjName(
p, Wln_ObjFanin1(
p, iObj)),
310 );
311 continue;
312 }
314 {
315 if ( 1 )
316 {
318 fprintf( pFile, " " );
319 fprintf( pFile,
"%s (", Wln_ObjType(
p, iObj) ==
ABC_OPER_RAMR ?
"ABC_READ" :
"ABC_WRITE" );
321 fprintf( pFile,
" .%s(%s),", k==0 ?
"mem_in" : (k==1 ?
"addr":
"data"),
Wln_ObjName(
p, iFanin) );
323 continue;
324 }
325 else
326 {
327 int nBitsMem = Wln_ObjRange(
p, Wln_ObjFanin(
p, iObj, 0) );
328
329 int nBitsDat = Wln_ObjType(
p, iObj) ==
ABC_OPER_RAMR ? Wln_ObjRange(
p, iObj) : Wln_ObjRange(
p, Wln_ObjFanin(
p, iObj, 2));
330 int Depth = nBitsMem / nBitsDat;
331 assert( nBitsMem % nBitsDat == 0 );
333 fprintf( pFile, " " );
334 fprintf( pFile,
"%s_%d (", Wln_ObjType(
p, iObj) ==
ABC_OPER_RAMR ?
"CPL_MEM_READ" :
"CPL_MEM_WRITE", Depth );
336 fprintf( pFile,
" .%s(%s),", k==0 ?
"mem_data_in" : (k==1 ?
"addr_in":
"data_in"),
Wln_ObjName(
p, iFanin) );
337 fprintf( pFile,
" .%s(%s) ) ;\n",
"data_out",
Wln_ObjName(
p, iObj) );
338 continue;
339 }
340 }
342 {
344 continue;
345 }
346 else
347 {
350 fprintf( pFile,
"%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
352 {
353 fprintf( pFile,
"%s ? ",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
354 fprintf( pFile,
"%s : ",
Wln_ObjName(
p, Wln_ObjFanin1(
p, iObj)) );
355 fprintf( pFile,
"%s",
Wln_ObjName(
p, Wln_ObjFanin2(
p, iObj)) );
356 }
358 fprintf( pFile,
"-%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
360 fprintf( pFile,
"~%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
362 fprintf( pFile,
"!%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
364 fprintf( pFile,
"&%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
366 fprintf( pFile,
"|%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
368 fprintf( pFile,
"^%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
370 fprintf( pFile,
"~&%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
372 fprintf( pFile,
"~|%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
374 fprintf( pFile,
"~^%s",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
376 fprintf( pFile,
"%s [%d:%d]",
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)), Wln_ObjRangeEnd(
p, iObj), Wln_ObjRangeBeg(
p, iObj) );
378 fprintf( pFile,
"{ {%d{%s[%d]}}, %s }", Wln_ObjRange(
p, iObj) - Wln_ObjRange(
p, Wln_ObjFanin0(
p, iObj)),
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)), Wln_ObjRange(
p, Wln_ObjFanin0(
p, iObj)) - 1,
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
380 fprintf( pFile,
"{ {%d{1\'b0}}, %s }", Wln_ObjRange(
p, iObj) - Wln_ObjRange(
p, Wln_ObjFanin0(
p, iObj)),
Wln_ObjName(
p, Wln_ObjFanin0(
p, iObj)) );
382 {
383 fprintf( pFile, "{" );
385 fprintf( pFile,
" %s%s",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, k)), k == Wln_ObjFaninNum(
p, iObj)-1 ?
"":
"," );
386 fprintf( pFile, " }" );
387 }
388 else
389 {
390 fprintf( pFile,
"%s ",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, 0)) );
392 fprintf( pFile, ">>" );
394 fprintf( pFile, ">>>" );
396 fprintf( pFile, "<<" );
398 fprintf( pFile, "<<<" );
400 fprintf( pFile, "&" );
402 fprintf( pFile, "|" );
404 fprintf( pFile, "^" );
406 fprintf( pFile, "~&" );
408 fprintf( pFile, "~|" );
410 fprintf( pFile, "~^" );
412 fprintf( pFile, "=>" );
414 fprintf( pFile, "&&" );
416 fprintf( pFile, "||" );
418 fprintf( pFile, "^^" );
420 fprintf( pFile, "==" );
422 fprintf( pFile, "!=" );
424 fprintf( pFile, "<" );
426 fprintf( pFile, ">" );
428 fprintf( pFile, "<=" );
430 fprintf( pFile, ">=" );
432 fprintf( pFile, "+" );
434 fprintf( pFile, "-" );
436 fprintf( pFile, "*" );
438 fprintf( pFile, "/" );
440 fprintf( pFile, "%%" );
442 fprintf( pFile, "%%" );
444 fprintf( pFile, "**" );
446 fprintf( pFile, "@" );
448 fprintf( pFile, "#" );
449 else
450 {
451
452 printf(
"Failed to write node \"%s\" with unknown operator type (%d).\n",
Wln_ObjName(
p, iObj), Wln_ObjType(
p, iObj) );
453 fprintf( pFile, "???\n" );
454 continue;
455 }
456 fprintf( pFile,
" %s",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, 1)) );
458 fprintf( pFile,
" + %s",
Wln_ObjName(
p, Wln_ObjFanin(
p, iObj, 2)) );
459 }
460 }
461 fprintf( pFile,
" ;%s\n", (
p->fSmtLib && Wln_ObjIsSigned(
p, iObj)) ?
" // signed SMT-LIB operator" :
"" );
462 }
463 iFanin = 0;
464
465 fprintf( pFile, "\n" );
467 {
468 char * pInNames[8] = {"d", "clk", "reset", "set", "enable", "async", "sre", "init"};
469 fprintf( pFile, " " );
470 fprintf( pFile, "%s (", "ABC_DFFRSE" );
472 if ( iFanin ) fprintf( pFile,
" .%s(%s),", pInNames[k],
Wln_ObjName(
p, iFanin) );
473 fprintf( pFile,
" .%s(%s) ) ;\n",
"q",
Wln_ObjName(
p, iObj) );
474 }
475 fprintf( pFile, "\n" );
476 fprintf( pFile, "endmodule\n\n" );
477}
void Wln_WriteVerIntVec(FILE *pFile, Wln_Ntk_t *p, Vec_Int_t *vVec, int Start)
#define Wln_NtkForEachFf(p, iFf, i)
#define Wln_ObjForEachFanin(p, iObj, iFanin, i)
char * Wln_ObjConstString(Wln_Ntk_t *p, int iObj)
char * Wln_ObjName(Wln_Ntk_t *p, int iObj)
DECLARATIONS ///.