diff --git a/VERSION b/VERSION index 86e7118..268b24f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.5.286 +1.5.287 diff --git a/base/verilog.c b/base/verilog.c index 80d2e03..548d274 100644 --- a/base/verilog.c +++ b/base/verilog.c @@ -717,10 +717,12 @@ int GetBus(char *astr, struct bus *wb) return 0; } +//-------------------------------------------------------------------- // Output a Verilog Module. Note that since Verilog does not describe // low-level devices like transistors, capacitors, etc., then this // format is limited to black-box subcircuits. Cells containing any // such low-level devices are ignored. +//-------------------------------------------------------------------- void VerilogModule(struct nlist *tp) { @@ -1833,8 +1835,9 @@ skip_endmodule: } else { /* "assign" */ SkipTokComments(VLOG_PIN_CHECK_DELIMITERS); - if (GetBusTok(&wb) == 0) { - char *aptr = strvchr(nexttok, '['); + char *aptr = strvchr(nexttok, '['); + if (((aptr == NULL) && (GetBusTok(&wb) == 0)) || + ((aptr != NULL) && (GetBus(aptr, &wb) == 0))) { if (aptr != NULL) { *aptr = '\0'; /* Find object of first net in bus */ @@ -1852,6 +1855,15 @@ skip_endmodule: } else { lhs = LookupObject(nexttok, CurrentCell); + /* Handle the case in which an assignment is made + * without first declaring a wire for the signal, + * which is considered valid syntax (patch by + * Sylvain Munaut). + */ + if (lhs == NULL) { + Node(nexttok); + lhs = LookupObject(nexttok, CurrentCell); + } strcpy(noderoot, nexttok); } SkipTokComments(VLOG_DELIMITERS); @@ -1900,8 +1912,9 @@ skip_endmodule: break; } else { - if (GetBusTok(&wb2) == 0) { - char *aptr = strvchr(nexttok, '['); + char *aptr = strvchr(nexttok, '['); + if (((aptr == NULL) && (GetBusTok(&wb2) == 0)) || + ((aptr != NULL) && (GetBus(aptr, &wb2) == 0))) { j = wb2.start; if (aptr != NULL) { *aptr = '\0';