Write verilog escape (#394)

* Fir for write_verilog issue 3826

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>

* staToVerilog2 remove escaped_name+=ch

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>

* updated regression to remove \ from module name

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>

* Using helpers.tcl function to redirect results

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>

* add std::string and remove trailing space, update regression name

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>

* update regression to reflect correct output verilog name

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>

---------

Signed-off-by: dsengupta0628 <dsengupta@precisioninno.com>
This commit is contained in:
Deepashree Sengupta 2026-03-03 00:48:15 +00:00 committed by GitHub
parent 73e1a392c5
commit eb0446d4e2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 46 additions and 9 deletions

View File

@ -86,15 +86,12 @@ staToVerilog(const char *sta_name)
for (const char *s = sta_name; *s ; s++) {
char ch = s[0];
if (ch == verilog_escape) {
escaped = true;
char next_ch = s[1];
if (next_ch == verilog_escape) {
escaped_name += ch;
escaped_name += next_ch;
s++;
}
else
// Skip escape.
escaped = true;
}
else {
if ((!(isalnum(ch) || ch == '_')))
@ -124,15 +121,12 @@ staToVerilog2(const char *sta_name)
for (const char *s = sta_name; *s ; s++) {
char ch = s[0];
if (ch == verilog_escape) {
escaped = true;
char next_ch = s[1];
if (next_ch == verilog_escape) {
escaped_name += ch;
escaped_name += next_ch;
s++;
}
else
// Skip escape.
escaped = true;
}
else {
bool is_brkt = (ch == bus_brkt_left || ch == bus_brkt_right);

View File

@ -165,6 +165,7 @@ record_public_tests {
suppress_msg
verilog_attribute
verilog_specify
verilog_write_escape
}
define_test_group fast [group_tests all]

View File

@ -0,0 +1,18 @@
module multi_sink (clk);
input clk;
wire \alu_adder_result_ex[0] ;
hier_block \h1\x (.childclk(clk),
.\Y[2:1] ({\alu_adder_result_ex[0] ,
\alu_adder_result_ex[0] }));
endmodule
module hier_block (childclk,
\Y[2:1] );
input childclk;
output [1:0] \Y[2:1] ;
BUFx2_ASAP7_75t_R \abuf_$100 (.A(childclk));
BUFx2_ASAP7_75t_R \ff0/name (.A(childclk));
endmodule

View File

@ -0,0 +1,10 @@
# Check if "h1\x" and \Y[2:1] are correctly processed from input to output of Verilog
source helpers.tcl
read_liberty gf180mcu_sram.lib.gz
read_liberty asap7_small.lib.gz
read_verilog verilog_write_escape.v
link_design multi_sink
set verilog_file [make_result_file "verilog_write_escape.v"]
write_verilog $verilog_file
report_file $verilog_file
read_verilog $verilog_file

View File

@ -0,0 +1,13 @@
module multi_sink (clk);
input clk;
wire \alu_adder_result_ex[0] ;
\hier_block \h1\x (.childclk(clk), .\Y[2:1] ({ \alu_adder_result_ex[0] , \alu_adder_result_ex[0] }) );
endmodule // multi_sink
module hier_block (childclk, \Y[2:1] );
input childclk;
output [1:0] \Y[2:1] ;
wire [1:0] \Y[2:1] ;
BUFx2_ASAP7_75t_R \abuf_$100 (.A(childclk));
BUFx2_ASAP7_75t_R \ff0/name (.A(childclk));
endmodule // hier_block1

View File

@ -386,7 +386,8 @@ VerilogWriter::writeInstBusPin(const Instance *inst,
if (!first_port)
fprintf(stream_, ",\n ");
fprintf(stream_, ".%s({", network_->name(port));
std::string port_vname = portVerilogName(network_->name(port));
fprintf(stream_, ".%s({", port_vname.c_str());
first_port = false;
bool first_member = true;