@@ -179,6 +179,67 @@ static int print_decl_to_buf(char **p, size_t *left, const char *kw, decl_t *arr
179179 return 0 ;
180180}
181181
182+ static int print_decl_single (char * * p , size_t * left , const char * kw , const decl_t * decl ) {
183+ if (out_cat (p , left , " %s " , kw )) return 1 ;
184+ if (decl -> is_signed ) {
185+ if (out_cat (p , left , "signed " )) return 1 ;
186+ }
187+ if (decl -> width > 1 ) {
188+ if (out_cat (p , left , "[%d:0] " , decl -> width - 1 )) return 1 ;
189+ }
190+ if (out_cat (p , left , "%s;\n" , decl -> name )) return 1 ;
191+ return 0 ;
192+ }
193+
194+ static int print_decl_with_assign (char * * p , size_t * left , const char * kw , const decl_t * decl , const char * rhs ) {
195+ if (out_cat (p , left , " %s " , kw )) return 1 ;
196+ if (decl -> is_signed ) {
197+ if (out_cat (p , left , "signed " )) return 1 ;
198+ }
199+ if (decl -> width > 1 ) {
200+ if (out_cat (p , left , "[%d:0] " , decl -> width - 1 )) return 1 ;
201+ }
202+ if (out_cat (p , left , "%s = %s;\n" , decl -> name , rhs )) return 1 ;
203+ return 0 ;
204+ }
205+
206+ static int print_inputs_short (char * * p , size_t * left , decl_t * arr , int n ) {
207+ for (int i = 0 ; i < n ; ) {
208+ int w = arr [i ].width ;
209+ int sg = arr [i ].is_signed ;
210+ if (out_cat (p , left , " input " )) return 1 ;
211+ if (sg ) {
212+ if (out_cat (p , left , "signed " )) return 1 ;
213+ }
214+ if (w > 1 ) {
215+ if (out_cat (p , left , "[%d:0] " , w - 1 )) return 1 ;
216+ }
217+ int j = i ;
218+ while (j < n && arr [j ].width == w && arr [j ].is_signed == sg ) {
219+ if (out_cat (p , left , "%s%s" , j == i ? "" : ", " , arr [j ].name )) return 1 ;
220+ ++ j ;
221+ }
222+ if (out_cat (p , left , ";\n" )) return 1 ;
223+ i = j ;
224+ }
225+ return 0 ;
226+ }
227+
228+ static decl_t * find_decl_by_name (decl_t * arr , int n , const char * name ) {
229+ for (int i = 0 ; i < n ; ++ i ) {
230+ if (!strcmp (arr [i ].name , name ))
231+ return & arr [i ];
232+ }
233+ return NULL ;
234+ }
235+
236+ static int has_assignment (const mv_ctx * ctx , const char * name ) {
237+ for (int i = 0 ; i < ctx -> na ; ++ i )
238+ if (!strcmp (ctx -> assigns [i ].lhs , name ))
239+ return 1 ;
240+ return 0 ;
241+ }
242+
182243// Add spaces around every alphanumeric/underscore sequence for readability.
183244// Example: "a*b+16'b0" -> " a * b + 16 ' b0 "
184245static void format_rhs_readable (const char * in , char * out , size_t cap ) {
@@ -206,6 +267,20 @@ static void format_rhs_readable(const char *in, char *out, size_t cap) {
206267 if (o < cap ) out [o ] = 0 ; else if (cap ) out [cap - 1 ] = 0 ;
207268}
208269
270+ static void trim_spaces (char * s ) {
271+ if (!s ) return ;
272+ char * start = s ;
273+ while (* start && isspace ((unsigned char )* start ))
274+ ++ start ;
275+ char * end = start + strlen (start );
276+ while (end > start && isspace ((unsigned char )* (end - 1 )))
277+ -- end ;
278+ size_t len = (size_t )(end - start );
279+ if (start != s )
280+ memmove (s , start , len );
281+ s [len ] = 0 ;
282+ }
283+
209284// -----------------------------------------------------------------------------
210285// Parsing helpers that quote offending clauses
211286// -----------------------------------------------------------------------------
@@ -380,7 +455,7 @@ lhs_done:;
380455// Translate a raw mini-Verilog string 'input' into standard Verilog.
381456// The function strips whitespace internally, parses, and writes into 'out' (cap bytes).
382457// Returns 0 on success, 1 on error. Errors are printed (no exit()).
383- int miniver_translate (const char * input , char * out , size_t cap ) {
458+ int miniver_translate (const char * input , char * out , size_t cap , int fShort ) {
384459 if (!input || !out || cap == 0 ) {
385460 printf ("Invalid arguments.\n" );
386461 return 1 ;
@@ -458,15 +533,47 @@ int miniver_translate(const char *input, char *out, size_t cap) {
458533 free (ctx ); return 1 ;
459534 }
460535
461- if (print_decl_to_buf (& p , & left , "input" , ctx -> inputs , ctx -> ni )) { free (ctx ); return 1 ; }
462- if (print_decl_to_buf (& p , & left , "output" , ctx -> outputs , ctx -> no )) { free (ctx ); return 1 ; }
463- if (print_decl_to_buf (& p , & left , "wire" , ctx -> wires , ctx -> nw )) { free (ctx ); return 1 ; }
536+ if (!fShort ) {
537+ if (print_decl_to_buf (& p , & left , "input" , ctx -> inputs , ctx -> ni )) { free (ctx ); return 1 ; }
538+ if (print_decl_to_buf (& p , & left , "output" , ctx -> outputs , ctx -> no )) { free (ctx ); return 1 ; }
539+ if (print_decl_to_buf (& p , & left , "wire" , ctx -> wires , ctx -> nw )) { free (ctx ); return 1 ; }
464540
465541 for (int i = 0 ; i < ctx -> na ; ++ i ) {
466- char rhs_sp [8192 ];
467- format_rhs_readable (ctx -> assigns [i ].rhs , rhs_sp , sizeof (rhs_sp ));
468- if (out_cat (& p , & left , " assign %s = %s;\n" , ctx -> assigns [i ].lhs , rhs_sp )) {
469- free (ctx ); return 1 ;
542+ char rhs_sp [8192 ];
543+ format_rhs_readable (ctx -> assigns [i ].rhs , rhs_sp , sizeof (rhs_sp ));
544+ if (out_cat (& p , & left , " assign %s = %s;\n" , ctx -> assigns [i ].lhs , rhs_sp )) {
545+ free (ctx ); return 1 ;
546+ }
547+ }
548+ } else {
549+ if (print_inputs_short (& p , & left , ctx -> inputs , ctx -> ni )) { free (ctx ); return 1 ; }
550+ for (int i = 0 ; i < ctx -> nw ; ++ i ) {
551+ if (has_assignment (ctx , ctx -> wires [i ].name ))
552+ continue ;
553+ if (print_decl_single (& p , & left , "wire" , & ctx -> wires [i ])) {
554+ free (ctx ); return 1 ;
555+ }
556+ }
557+ for (int i = 0 ; i < ctx -> na ; ++ i ) {
558+ char rhs_sp [8192 ];
559+ format_rhs_readable (ctx -> assigns [i ].rhs , rhs_sp , sizeof (rhs_sp ));
560+ trim_spaces (rhs_sp );
561+ const char * kw = "wire" ;
562+ decl_t * decl = find_decl_by_name (ctx -> outputs , ctx -> no , ctx -> assigns [i ].lhs );
563+ if (decl ) {
564+ kw = "output" ;
565+ } else {
566+ decl = find_decl_by_name (ctx -> wires , ctx -> nw , ctx -> assigns [i ].lhs );
567+ }
568+ if (decl ) {
569+ if (print_decl_with_assign (& p , & left , kw , decl , rhs_sp )) {
570+ free (ctx ); return 1 ;
571+ }
572+ } else {
573+ if (out_cat (& p , & left , " assign %s = %s;\n" , ctx -> assigns [i ].lhs , rhs_sp )) {
574+ free (ctx ); return 1 ;
575+ }
576+ }
470577 }
471578 }
472579 if (out_cat (& p , & left , "endmodule\n" )) {
@@ -506,7 +613,7 @@ int main(int argc, char **argv) {
506613 }
507614
508615 char out [10240 ];
509- int rc = miniver_translate (in , out , sizeof (out ));
616+ int rc = miniver_translate (in , out , sizeof (out ), 0 );
510617 if (!rc ) {
511618 printf ("%s" , out );
512619 }
@@ -520,4 +627,3 @@ int main(int argc, char **argv) {
520627
521628
522629ABC_NAMESPACE_IMPL_END
523-
0 commit comments