diff options
author | Larry Doolittle <ldoolitt@recycle.lbl.gov> | 2017-11-25 23:45:05 -0800 |
---|---|---|
committer | Larry Doolittle <ldoolitt@recycle.lbl.gov> | 2017-11-25 23:45:05 -0800 |
commit | 20c9a77fb048b9d54245359c347cbfe1bffad2f2 (patch) | |
tree | cf28f7218aba2d2b5e452eed1194d00ada96f3ea | |
parent | 7aa0f8b9184dbc921e50529f5acefbfad70cb5b7 (diff) | |
download | vhdl2vl-20c9a77fb048b9d54245359c347cbfe1bffad2f2.tar.gz vhdl2vl-20c9a77fb048b9d54245359c347cbfe1bffad2f2.zip |
Correct selection of -: vs. +:
Adds new updown field to struct vrange
Both cases exercised by examples/partselect.vhd
-rw-r--r-- | examples/partselect.vhd | 4 | ||||
-rw-r--r-- | src/def.h | 1 | ||||
-rw-r--r-- | src/vhd2vl.y | 24 | ||||
-rw-r--r-- | translated_examples/bigfile.v | 42 | ||||
-rw-r--r-- | translated_examples/dsp.v | 2 | ||||
-rw-r--r-- | translated_examples/for.v | 2 | ||||
-rw-r--r-- | translated_examples/partselect.v | 8 |
7 files changed, 45 insertions, 38 deletions
diff --git a/examples/partselect.vhd b/examples/partselect.vhd index 25279dd..564f820 100644 --- a/examples/partselect.vhd +++ b/examples/partselect.vhd @@ -15,12 +15,14 @@ begin test_i: process(clk_i) variable big_var : std_logic_vector(31 downto 0); + variable lit_var : std_logic_vector(0 to 31); variable j : integer; -- XXX not ready for :=8; begin if rising_edge(clk_i) then big_sig(31 downto 24) <= big_sig(7 downto 0); big_var(31 downto 24) := big_var(7 downto 0); - lit_sig(24 to 31) <= lit_sig(0 to 7); + lit_sig(i*3 to i*3+7) <= lit_sig(0 to 7); + lit_var(j*3 to j*3+8) <= lit_var(j*0 to 8+j*0); -- big_sig(i*3+8 downto i*3) <= big_sig(8 downto 0); big_var(j*3+8 downto j*3) := big_var(j*0+8 downto j*0); @@ -54,6 +54,7 @@ typedef struct vrange { struct slist *nhi, *nlo; /* MAG index is a simple expression */ slist *size_expr; /* expression that calculates size (width) of this vrange */ int sizeval; /* precalculated size value */ + int updown; /* only used for indext part select case */ struct slist *xhi, *xlo; /* array index range; 0,0 for normal scalars */ } vrange; diff --git a/src/vhd2vl.y b/src/vhd2vl.y index 20bab8e..0e116ce 100644 --- a/src/vhd2vl.y +++ b/src/vhd2vl.y @@ -313,10 +313,10 @@ slist *addpar_snug(slist *sl, vrange *v){ sl=addtxt(sl,"["); if(v->nhi != NULL){ sl=addsl(sl,v->nhi); - if(v->sizeval==-2) sl=addtxt(sl,"+"); - sl=addtxt(sl,":"); + if(v->updown) sl=addtxt(sl,v->updown==1 ? " +: " : " -: "); + else sl=addtxt(sl,":"); } - if(v->sizeval==-2){ + if(v->updown){ sl=addsl(sl,v->size_expr); sl=addtxt(sl," + 1"); } else { @@ -449,20 +449,21 @@ char *string_check_diff(char *s1, char *s2) return rv; } -/* look for common beginning or end of a string, - * needed for creating indexed part selects */ -char *slist_check_diff(slist *shi, slist *slo) +/* Look for common beginning or end of a string, + * as needed for creating indexed part selects. + * updown key: DOWNTO = -1, TO = 1 */ +char *slist_check_diff(slist *shi, slist *slo, int updown) { char t1[200], t2[200]; char *diff = 0; size_t t1len, t2len; sslprint(t1, sizeof(t1), shi); t1len = strlen(t1); sslprint(t2, sizeof(t2), slo); t2len = strlen(t2); - if (t2len < t1len) { + if (updown == -1 && t2len < t1len) { diff = string_check_diff(t1, t2); - } else { + } else if (updown == 1 && t1len < t2len) { diff = string_check_diff(t2, t1); - } + } /* I don't have sane test cases for the other possibilities */ return diff; } @@ -1201,6 +1202,7 @@ vec_range : simple_expr updown simple_expr { $$->nhi=$1->sl; $$->nlo=$3->sl; $$->sizeval = -1; /* undefined size */ + $$->updown = 0; /* not relevant */ /* Here is where we may want to analyze the two expressions to * see if they have a simple (possibly constant) difference. * For now, here's an option to visualise their data structures. @@ -1222,9 +1224,9 @@ vec_range : simple_expr updown simple_expr { } else { /* (nhi:natural to nlo:natural) */ $$->sizeval = $3->value - $1->value + 1; } - } else if ((range_diff = slist_check_diff($$->nhi, $$->nlo))) { + } else if ((range_diff = slist_check_diff($$->nhi, $$->nlo, $2))) { if (DEBUG_RANGE) fprintf(stderr, "difference: %s\n", range_diff); - $$->sizeval = -2; /* special */ + $$->updown = $2; /* triggers use of range_diff in addpar_snug */ $$->size_expr = addtxt(NULL, range_diff); } else { /* make an expression to calculate the width of this vrange: diff --git a/translated_examples/bigfile.v b/translated_examples/bigfile.v index 26a3ae3..974dc55 100644 --- a/translated_examples/bigfile.v +++ b/translated_examples/bigfile.v @@ -187,7 +187,7 @@ wire [31:0] g_dout_i; //vnavigatoron case(g_dout_w0x0f_v) g_t_klim_w0x0f : begin - g_t_klim_dout <= din[i * 32 + 31+:31 + 1]; + g_t_klim_dout <= din[i * 32 + 31 -: 31 + 1]; end g_t_u_w0x0f : begin // output klim @@ -198,68 +198,68 @@ wire [31:0] g_dout_i; end end g_t_l_w0x0f : begin - g_t_l_dout <= din[i * 32 + 31+:31 + 1]; + g_t_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_t_hhh_l_w0x0f : begin - g_t_hhh_l_dout <= din[i * 32 + 31+:31 + 1]; + g_t_hhh_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_t_jkl_sink_l_w0x0f : begin - g_t_jkl_sink_l_dout <= din[i * 32 + 31+:31 + 1]; + g_t_jkl_sink_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_secondary_t_l_w0x0f : begin - g_secondary_t_l_dout <= din[i * 32 + 31+:31 + 1]; + g_secondary_t_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_style_c_l_w0x0f : begin - g_style_c_l_dout[3:0] <= din[3 + i * 32+:3 + 1]; + g_style_c_l_dout[3:0] <= din[3 + i * 32 -: 3 + 1]; end g_e_z_w0x0f : begin - g_e_z_dout <= din[i * 32 + 31+:31 + 1]; + g_e_z_dout <= din[i * 32 + 31 -: 31 + 1]; end g_n_both_qbars_l_w0x0f : begin - g_n_both_qbars_l_dout <= din[i * 32 + 31+:31 + 1]; + g_n_both_qbars_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_style_vfr_w0x0f : begin // read-only register end g_style_klim_w0x0f : begin - g_style_klim_dout <= din[i * 32 + 31+:31 + 1]; + g_style_klim_dout <= din[i * 32 + 31 -: 31 + 1]; end g_unklimed_style_vfr_w0x0f : begin // read-only register end g_style_t_y_w0x0f : begin - g_style_t_y_dout <= din[i * 32 + 31+:31 + 1]; + g_style_t_y_dout <= din[i * 32 + 31 -: 31 + 1]; end g_n_l_w0x0f : begin - g_n_l_dout <= din[i * 32 + 31+:31 + 1]; + g_n_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_n_vfr_w0x0f : begin // writes end g_e_n_r_w0x0f : begin - g_e_n_r_dout <= din[i * 32 + 31+:31 + 1]; + g_e_n_r_dout <= din[i * 32 + 31 -: 31 + 1]; end g_n_r_bne_w0x0f : begin g_n_r_bne_dout <= din[i * 32]; end g_n_div_rebeq_w0x0f : begin - g_n_div_rebeq_dout <= din[i * 32 + 31+:31 + 1] | g_n_div_rebeq_dout; + g_n_div_rebeq_dout <= din[i * 32 + 31 -: 31 + 1] | g_n_div_rebeq_dout; // a '1' writes end g_alu_l_w0x0f : begin - g_alu_l_dout <= din[i * 32 + 31+:31 + 1]; + g_alu_l_dout <= din[i * 32 + 31 -: 31 + 1]; end g_t_qaz_mult_low_w0x0f : begin - g_t_qaz_mult_low_dout <= din[i * 32 + 31+:31 + 1]; + g_t_qaz_mult_low_dout <= din[i * 32 + 31 -: 31 + 1]; end g_t_qaz_mult_high_w0x0f : begin - g_t_qaz_mult_high_dout <= din[i * 32 + 31+:31 + 1]; + g_t_qaz_mult_high_dout <= din[i * 32 + 31 -: 31 + 1]; end gwerthernal_style_u_w0x0f : begin - gwerthernal_style_u_dout <= din[i * 32 + 31+:31 + 1]; + gwerthernal_style_u_dout <= din[i * 32 + 31 -: 31 + 1]; end gwerthernal_style_l_w0x0f : begin - gwerthernal_style_l_dout <= din[i * 32 + 31+:31 + 1]; + gwerthernal_style_l_dout <= din[i * 32 + 31 -: 31 + 1]; //vnavigatoroff end default : begin @@ -404,15 +404,15 @@ wire [31:0] g_dout_i; idiv8 = i / 8; if((g_n_r_bne_dout == 1'b0)) begin // non-unique - g_vector[8 * i + 7+:7 + 1] <= g_e_n_r_dout[8 * idiv8 + 7+:7 + 1]; + g_vector[8 * i + 7 -: 7 + 1] <= g_e_n_r_dout[8 * idiv8 + 7 -: 7 + 1]; end else begin // unique if((imod8 == 0)) begin - g_vector[8 * i + 7+:7 + 1] <= g_e_n_r_dout[8 * idiv8 + 7+:7 + 1]; + g_vector[8 * i + 7 -: 7 + 1] <= g_e_n_r_dout[8 * idiv8 + 7 -: 7 + 1]; end else begin - g_vector[8 * i + 7+:7 + 1] <= (g_e_n_r_dout[8 * idiv8 + 7+:7 + 1]) + (imod8); + g_vector[8 * i + 7 -: 7 + 1] <= (g_e_n_r_dout[8 * idiv8 + 7 -: 7 + 1]) + (imod8); end end end diff --git a/translated_examples/dsp.v b/translated_examples/dsp.v index fe4331e..557ca0d 100644 --- a/translated_examples/dsp.v +++ b/translated_examples/dsp.v @@ -34,7 +34,7 @@ wire [31:0] iparam; if(we == 1'b1) begin sr <= {sr[thing_size - bus_width - 1:0],din}; end - dout <= sr[iparam * bus_width + bus_width - 1+:bus_width - 1 + 1]; + dout <= sr[iparam * bus_width + bus_width - 1 -: bus_width - 1 + 1]; end diff --git a/translated_examples/for.v b/translated_examples/for.v index 707d981..ce31bc7 100644 --- a/translated_examples/for.v +++ b/translated_examples/for.v @@ -29,7 +29,7 @@ reg [6:0] egg_timer; for (i=0; i <= j * k; i = i + 1) begin a = a + i; for (k=a - 9; k >= -14; k = k - 1) begin - zz5 = zz[31 + k+:31 + 1]; + zz5 = zz[31 + k -: 31 + 1]; end // k end diff --git a/translated_examples/partselect.v b/translated_examples/partselect.v index 2197b0b..7c8640a 100644 --- a/translated_examples/partselect.v +++ b/translated_examples/partselect.v @@ -13,15 +13,17 @@ wire [31:0] i = 8; always @(posedge clk_i) begin : P1 reg [31:0] big_var; + reg [0:31] lit_var; reg [31:0] j; // XXX not ready for :=8; big_sig[31:24] <= big_sig[7:0]; big_var[31:24] = big_var[7:0]; - lit_sig[24:31] <= lit_sig[0:7]; + lit_sig[i * 3 +: 7 + 1] <= lit_sig[0:7]; + lit_var[j * 3 +: 8 + 1] <= lit_var[j * 0 +: 8 + 1]; // - big_sig[i * 3 + 8+:8 + 1] <= big_sig[8:0]; - big_var[j * 3 + 8+:8 + 1] = big_var[j * 0 + 8+:8 + 1]; + big_sig[i * 3 + 8 -: 8 + 1] <= big_sig[8:0]; + big_var[j * 3 + 8 -: 8 + 1] = big_var[j * 0 + 8 -: 8 + 1]; end |