summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLarry Doolittle <ldoolitt@recycle.lbl.gov>2017-11-25 23:45:05 -0800
committerLarry Doolittle <ldoolitt@recycle.lbl.gov>2017-11-25 23:45:05 -0800
commit20c9a77fb048b9d54245359c347cbfe1bffad2f2 (patch)
treecf28f7218aba2d2b5e452eed1194d00ada96f3ea
parent7aa0f8b9184dbc921e50529f5acefbfad70cb5b7 (diff)
downloadvhdl2vl-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.vhd4
-rw-r--r--src/def.h1
-rw-r--r--src/vhd2vl.y24
-rw-r--r--translated_examples/bigfile.v42
-rw-r--r--translated_examples/dsp.v2
-rw-r--r--translated_examples/for.v2
-rw-r--r--translated_examples/partselect.v8
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);
diff --git a/src/def.h b/src/def.h
index cd51456..85acc95 100644
--- a/src/def.h
+++ b/src/def.h
@@ -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
OpenPOWER on IntegriCloud