Skip to content

Commit d8f497c

Browse files
committed
Improve signal names generated from real literals
If a real literal was small enough to use E notation with a negative exponent, that negative sign would appear in signal names derived from that expression, which is illegal for both Verilog and Bluesim. We were eliminating decimal points from numbers, but failing to remove negative signs. Instead of removing them, however, we now replace them (with "d" and "neg") so that the value in the name is not misinterpreted.
1 parent a67cac8 commit d8f497c

File tree

4 files changed

+115
-1
lines changed

4 files changed

+115
-1
lines changed

src/comp/SignalNaming.hs

+7-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,13 @@ signalNameFromAExpr' (expr@ASDef { }) =
8787
signalNameFromAExpr' (expr@ASInt { }) =
8888
dropGeneratedSuffixes (ppString (ae_ival expr))
8989
signalNameFromAExpr' (expr@ASReal { }) =
90-
dropGeneratedSuffixes (ppString (ae_rval expr))
90+
-- replace decimal point with 'd'
91+
-- replace negative sign with 'neg' (for example in "1e-2")
92+
dropGeneratedSuffixes (sanitize (ppString (ae_rval expr)))
93+
where sanitize "" = ""
94+
sanitize ('.':cs) = 'd' : sanitize cs
95+
sanitize ('-':cs) = 'n' : 'e' : 'g' : sanitize cs
96+
sanitize (c:cs) = c : sanitize cs
9197
signalNameFromAExpr' (expr@ASStr { }) =
9298
dropGeneratedSuffixes ("STR_" ++ sanitize (ae_strval expr))
9399
where sanitize "" = ""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// ---------------------------------------------------------------------------
2+
3+
import Real::*;
4+
5+
(* synthesize *)
6+
module sysLiteralNum_ENotation ();
7+
8+
Reg#(Bool) rg_start <- mkReg(True);
9+
10+
rule do_disp (rg_start);
11+
rg_start <= False;
12+
for (Integer i=0; i<4; i=i+1) begin
13+
Real r = (pi * (2**fromInteger(i))) / (2**10);
14+
$display("%d: %f", i, r);
15+
end
16+
endrule
17+
18+
endmodule
19+
20+
// ---------------------------------------------------------------------------
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
checking package dependencies
2+
compiling LiteralNum_ENotation.bsv
3+
code generation for sysLiteralNum_ENotation starts
4+
=== ATS:
5+
APackage sysLiteralNum_ENotation
6+
-- APackage parameters
7+
[]
8+
-- APackage arguments
9+
clock { osc = CLK }
10+
reset { RST_N }
11+
-- APackage wire info
12+
clock info clock default_clock(CLK, {-inhigh-});
13+
reset info reset default_reset(RST_N) clocked_by(default_clock);
14+
arg info [clockarg default_clock;, resetarg default_reset;]
15+
-- APackage clock domains
16+
[(0, [{ osc: CLK gate: 1'd1 }])]
17+
-- APackage resets
18+
[(0, { wire: RST_N })]
19+
-- AP state elements
20+
rg_start :: ABSTRACT: Prelude.VReg = RegN
21+
(VModInfo
22+
RegN
23+
clock _clk__1(CLK, {-unused-});
24+
reset _rst__1(RST) clocked_by(_clk__1);
25+
[clockarg _clk__1;, resetarg _rst__1;, param width;, param init;]
26+
[method (Q_OUT, [reg])read clocked_by (_clk__1) reset_by (_rst__1);,
27+
method write((D_IN, [reg])) enable ((EN,
28+
[])) clocked_by (_clk__1) reset_by (_rst__1);]
29+
SchedInfo [read CF read, read SB write, write SBR write] [] [] []
30+
[])
31+
[clock { osc: CLK gate: 1'd1 }, reset { wire: RST_N }, 32'd1, 1'd1]
32+
[]
33+
meth types=[([], Nothing, Just (Bit 1)), ([Bit 1], Just (Bit 1), Nothing)]
34+
port types=D_IN -> Prelude.Bool
35+
Q_OUT -> Prelude.Bool
36+
-- AP local definitions
37+
rg_start___d1 :: Bit 1;
38+
rg_start___d1 = rg_start.read;
39+
-- IdProp rg_start___d1[IdP_from_rhs]
40+
signed_0___d2 :: Bit 32;
41+
signed_0___d2 = Prelude.$signed 32'd0;
42+
-- IdProp signed_0___d2[IdP_from_rhs,IdP_signed]
43+
signed_1___d4 :: Bit 32;
44+
signed_1___d4 = Prelude.$signed 32'd1;
45+
-- IdProp signed_1___d4[IdP_from_rhs,IdP_signed]
46+
signed_2___d6 :: Bit 32;
47+
signed_2___d6 = Prelude.$signed 32'd2;
48+
-- IdProp signed_2___d6[IdP_from_rhs,IdP_signed]
49+
signed_3___d8 :: Bit 32;
50+
signed_3___d8 = Prelude.$signed 32'd3;
51+
-- IdProp signed_3___d8[IdP_from_rhs,IdP_signed]
52+
_3d0679615757712823eneg3___d3 :: Real ;
53+
_3d0679615757712823eneg3___d3 = 3.0679615757712823e-3;
54+
-- IdProp _3d0679615757712823eneg3___d3[IdP_from_rhs]
55+
_6d135923151542565eneg3___d5 :: Real ;
56+
_6d135923151542565eneg3___d5 = 6.135923151542565e-3;
57+
-- IdProp _6d135923151542565eneg3___d5[IdP_from_rhs]
58+
_1d227184630308513eneg2___d7 :: Real ;
59+
_1d227184630308513eneg2___d7 = 1.227184630308513e-2;
60+
-- IdProp _1d227184630308513eneg2___d7[IdP_from_rhs]
61+
_2d454369260617026eneg2___d9 :: Real ;
62+
_2d454369260617026eneg2___d9 = 2.454369260617026e-2;
63+
-- IdProp _2d454369260617026eneg2___d9[IdP_from_rhs]
64+
-- AP rules
65+
rule RL_do_disp "do_disp":
66+
when rg_start___d1
67+
==> { rg_start.write 1'd0;
68+
Prelude.$display "%d: %f" signed_0___d2 _3d0679615757712823eneg3___d3;
69+
Prelude.$display "%d: %f" signed_1___d4 _6d135923151542565eneg3___d5;
70+
Prelude.$display "%d: %f" signed_2___d6 _1d227184630308513eneg2___d7;
71+
Prelude.$display "%d: %f" signed_3___d8 _2d454369260617026eneg2___d9; }
72+
[]
73+
clock domain = Just (0), resets = [0]
74+
-- AP scheduling pragmas
75+
[]
76+
-- AP interface
77+
-- AP instance comments
78+
-- AP remaining proof obligations
79+
[]
80+
81+
-----
82+
83+
Verilog file created: sysLiteralNum_ENotation.v
84+
All packages are up to date.

testsuite/bsc.names/signal_names/signal_names.exp

+4
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@ check_ats TaskValue
2525
# XXX ASStr
2626
# XXX ASAny
2727
# XXX AMGate
28+
29+
# Check that numeric literals that are small enough to need scientific
30+
# notiation don't introduce a minus sign into signal names
31+
check_ats LiteralNum_ENotation

0 commit comments

Comments
 (0)