Fix spacing issues.
This patch removes space before a tab and space or tab before end of line.
This commit is contained in:
parent
5ae3e48cdb
commit
dd4fb9b4ef
|
|
@ -40,10 +40,10 @@ extern void process_include_dir(const char*name);
|
||||||
|
|
||||||
/* Add a new -D define. */
|
/* Add a new -D define. */
|
||||||
extern void process_define(const char*name);
|
extern void process_define(const char*name);
|
||||||
|
|
||||||
/* Add a new parameter definition */
|
/* Add a new parameter definition */
|
||||||
extern void process_parameter(const char*name);
|
extern void process_parameter(const char*name);
|
||||||
|
|
||||||
/* Set the default timescale for the simulator. */
|
/* Set the default timescale for the simulator. */
|
||||||
extern void process_timescale(const char*ts_string);
|
extern void process_timescale(const char*ts_string);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ Verilog source for use by other compilers.
|
||||||
.B -g1995\fI|\fP-g2001\fI|\fP-g2001-noconfig\fI|\fP-g2005\fI|\fP-g2009
|
.B -g1995\fI|\fP-g2001\fI|\fP-g2001-noconfig\fI|\fP-g2005\fI|\fP-g2009
|
||||||
Select the Verilog language \fIgeneration\fP to support in the
|
Select the Verilog language \fIgeneration\fP to support in the
|
||||||
compiler. This selects between \fIIEEE1364\-1995\fP,
|
compiler. This selects between \fIIEEE1364\-1995\fP,
|
||||||
\fIIEEE1364\-2001\fP, \fIIEEE1364\-2005\fP, or \fIIEEE1800-2009\fP.
|
\fIIEEE1364\-2001\fP, \fIIEEE1364\-2005\fP, or \fIIEEE1800-2009\fP.
|
||||||
Normally, Icarus Verilog defaults to the latest known generation of the
|
Normally, Icarus Verilog defaults to the latest known generation of the
|
||||||
language. This flag is most useful to restrict the language to a set
|
language. This flag is most useful to restrict the language to a set
|
||||||
supported by tools of specific generations, for compatibility with
|
supported by tools of specific generations, for compatibility with
|
||||||
|
|
|
||||||
|
|
@ -497,7 +497,7 @@ NetNet* PEIdent::elaborate_lnet_common_(Design*des, NetScope*scope,
|
||||||
/* The array has a part/bit select at the end. */
|
/* The array has a part/bit select at the end. */
|
||||||
if (name_tail.index.size() > sig->array_dimensions()) {
|
if (name_tail.index.size() > sig->array_dimensions()) {
|
||||||
if (sig->get_scalar()) {
|
if (sig->get_scalar()) {
|
||||||
cerr << get_fileline() << ": error: "
|
cerr << get_fileline() << ": error: "
|
||||||
<< "can not select part of ";
|
<< "can not select part of ";
|
||||||
if (sig->data_type() == IVL_VT_REAL) cerr << "real";
|
if (sig->data_type() == IVL_VT_REAL) cerr << "real";
|
||||||
else cerr << "scalar";
|
else cerr << "scalar";
|
||||||
|
|
@ -512,7 +512,7 @@ NetNet* PEIdent::elaborate_lnet_common_(Design*des, NetScope*scope,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (lidx_tmp < 0) {
|
if (lidx_tmp < 0) {
|
||||||
cerr << get_fileline() << ": sorry: part selects "
|
cerr << get_fileline() << ": sorry: part selects "
|
||||||
"straddling the start of signal (" << path_
|
"straddling the start of signal (" << path_
|
||||||
<< ") are not currently supported." << endl;
|
<< ") are not currently supported." << endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
|
|
@ -523,7 +523,7 @@ NetNet* PEIdent::elaborate_lnet_common_(Design*des, NetScope*scope,
|
||||||
}
|
}
|
||||||
} else if (!name_tail.index.empty()) {
|
} else if (!name_tail.index.empty()) {
|
||||||
if (sig->get_scalar()) {
|
if (sig->get_scalar()) {
|
||||||
cerr << get_fileline() << ": error: "
|
cerr << get_fileline() << ": error: "
|
||||||
<< "can not select part of ";
|
<< "can not select part of ";
|
||||||
if (sig->data_type() == IVL_VT_REAL) cerr << "real: ";
|
if (sig->data_type() == IVL_VT_REAL) cerr << "real: ";
|
||||||
else cerr << "scalar: ";
|
else cerr << "scalar: ";
|
||||||
|
|
@ -537,7 +537,7 @@ NetNet* PEIdent::elaborate_lnet_common_(Design*des, NetScope*scope,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (lidx_tmp < 0) {
|
if (lidx_tmp < 0) {
|
||||||
cerr << get_fileline() << ": sorry: part selects "
|
cerr << get_fileline() << ": sorry: part selects "
|
||||||
"straddling the start of signal (" << path_
|
"straddling the start of signal (" << path_
|
||||||
<< ") are not currently supported." << endl;
|
<< ") are not currently supported." << endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
|
|
|
||||||
|
|
@ -1422,7 +1422,7 @@ void PGModule::elaborate_mod_(Design*des, Module*rmod, NetScope*scope) const
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We do not support real inout ports at all.
|
// We do not support real inout ports at all.
|
||||||
if (!prts.empty() && (prts[0]->data_type() == IVL_VT_REAL )) {
|
if (!prts.empty() && (prts[0]->data_type() == IVL_VT_REAL )) {
|
||||||
cerr << pins[idx]->get_fileline() << ": error: "
|
cerr << pins[idx]->get_fileline() << ": error: "
|
||||||
|
|
|
||||||
126
examples/des.v
126
examples/des.v
|
|
@ -162,11 +162,11 @@ end
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module des(pt, key, ct, clk);
|
module des(pt, key, ct, clk);
|
||||||
input [1:64] pt;
|
input [1:64] pt;
|
||||||
input [1:64] key;
|
input [1:64] key;
|
||||||
output [1:64] ct;
|
output [1:64] ct;
|
||||||
input clk;
|
input clk;
|
||||||
wire [1:48] k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x;
|
wire [1:48] k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x;
|
||||||
wire [1:32] l0x,l1x,l2x,l3x,l4x,l5x,l6x,l7x,l8x,l9x,l10x,l11x,l12x,l13x,l14x,l15x,l16x;
|
wire [1:32] l0x,l1x,l2x,l3x,l4x,l5x,l6x,l7x,l8x,l9x,l10x,l11x,l12x,l13x,l14x,l15x,l16x;
|
||||||
wire [1:32] r0x,r1x,r2x,r3x,r4x,r5x,r6x,r7x,r8x,r9x,r10x,r11x,r12x,r13x,r14x,r15x,r16x;
|
wire [1:32] r0x,r1x,r2x,r3x,r4x,r5x,r6x,r7x,r8x,r9x,r10x,r11x,r12x,r13x,r14x,r15x,r16x;
|
||||||
|
|
||||||
|
|
@ -194,9 +194,9 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module pc1(key, c0x, d0x);
|
module pc1(key, c0x, d0x);
|
||||||
input [1:64] key;
|
input [1:64] key;
|
||||||
output [1:28] c0x, d0x;
|
output [1:28] c0x, d0x;
|
||||||
wire [1:56] XX;
|
wire [1:56] XX;
|
||||||
|
|
||||||
assign XX[1]=key[57]; assign XX[2]=key[49]; assign XX[3]=key[41]; assign XX[4]=key[33]; assign XX[5]=key[25]; assign XX[6]=key[17]; assign XX[7]=key[9];
|
assign XX[1]=key[57]; assign XX[2]=key[49]; assign XX[3]=key[41]; assign XX[4]=key[33]; assign XX[5]=key[25]; assign XX[6]=key[17]; assign XX[7]=key[9];
|
||||||
assign XX[8]=key[1]; assign XX[9]=key[58]; assign XX[10]=key[50]; assign XX[11]=key[42]; assign XX[12]=key[34]; assign XX[13]=key[26]; assign XX[14]=key[18];
|
assign XX[8]=key[1]; assign XX[9]=key[58]; assign XX[10]=key[50]; assign XX[11]=key[42]; assign XX[12]=key[34]; assign XX[13]=key[26]; assign XX[14]=key[18];
|
||||||
|
|
@ -213,9 +213,9 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module pc2(c,d,k);
|
module pc2(c,d,k);
|
||||||
input [1:28] c,d;
|
input [1:28] c,d;
|
||||||
output [1:48] k;
|
output [1:48] k;
|
||||||
wire [1:56] YY;
|
wire [1:56] YY;
|
||||||
|
|
||||||
assign YY[1:28]=c; assign YY[29:56]=d;
|
assign YY[1:28]=c; assign YY[29:56]=d;
|
||||||
|
|
||||||
|
|
@ -231,7 +231,7 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module rol1(o, i);
|
module rol1(o, i);
|
||||||
output [1:28] o;
|
output [1:28] o;
|
||||||
input [1:28] i;
|
input [1:28] i;
|
||||||
|
|
||||||
assign o={i[2:28],i[1]};
|
assign o={i[2:28],i[1]};
|
||||||
|
|
@ -240,7 +240,7 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module rol2(o, i);
|
module rol2(o, i);
|
||||||
output [1:28] o;
|
output [1:28] o;
|
||||||
input [1:28] i;
|
input [1:28] i;
|
||||||
|
|
||||||
assign o={i[3:28],i[1:2]};
|
assign o={i[3:28],i[1:2]};
|
||||||
|
|
@ -248,10 +248,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module keysched(key,k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x);
|
module keysched(key,k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x);
|
||||||
input [1:64] key;
|
input [1:64] key;
|
||||||
output [1:48] k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x;
|
output [1:48] k1x,k2x,k3x,k4x,k5x,k6x,k7x,k8x,k9x,k10x,k11x,k12x,k13x,k14x,k15x,k16x;
|
||||||
wire [1:28] c0x,c1x,c2x,c3x,c4x,c5x,c6x,c7x,c8x,c9x,c10x,c11x,c12x,c13x,c14x,c15x,c16x;
|
wire [1:28] c0x,c1x,c2x,c3x,c4x,c5x,c6x,c7x,c8x,c9x,c10x,c11x,c12x,c13x,c14x,c15x,c16x;
|
||||||
wire [1:28] d0x,d1x,d2x,d3x,d4x,d5x,d6x,d7x,d8x,d9x,d10x,d11x,d12x,d13x,d14x,d15x,d16x;
|
wire [1:28] d0x,d1x,d2x,d3x,d4x,d5x,d6x,d7x,d8x,d9x,d10x,d11x,d12x,d13x,d14x,d15x,d16x;
|
||||||
|
|
||||||
pc1 pc1(key, c0x, d0x);
|
pc1 pc1(key, c0x, d0x);
|
||||||
|
|
||||||
|
|
@ -294,10 +294,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s1(clk, b, so);
|
module s1(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -370,10 +370,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s2(clk, b, so);
|
module s2(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -446,10 +446,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s3(clk, b, so);
|
module s3(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -522,10 +522,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s4(clk, b, so);
|
module s4(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -598,10 +598,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s5(clk, b, so);
|
module s5(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -674,10 +674,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s6(clk, b, so);
|
module s6(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -750,10 +750,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s7(clk, b, so);
|
module s7(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -826,10 +826,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module s8(clk, b, so);
|
module s8(clk, b, so);
|
||||||
input clk;
|
input clk;
|
||||||
input [1:6] b;
|
input [1:6] b;
|
||||||
output [1:4] so;
|
output [1:4] so;
|
||||||
reg [1:4] so;
|
reg [1:4] so;
|
||||||
|
|
||||||
always @(posedge clk)
|
always @(posedge clk)
|
||||||
casex(b)
|
casex(b)
|
||||||
|
|
@ -902,8 +902,8 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module ip(pt, l0x, r0x);
|
module ip(pt, l0x, r0x);
|
||||||
input [1:64] pt;
|
input [1:64] pt;
|
||||||
output [1:32] l0x, r0x;
|
output [1:32] l0x, r0x;
|
||||||
|
|
||||||
assign l0x[1]=pt[58]; assign l0x[2]=pt[50]; assign l0x[3]=pt[42]; assign l0x[4]=pt[34];
|
assign l0x[1]=pt[58]; assign l0x[2]=pt[50]; assign l0x[3]=pt[42]; assign l0x[4]=pt[34];
|
||||||
assign l0x[5]=pt[26]; assign l0x[6]=pt[18]; assign l0x[7]=pt[10]; assign l0x[8]=pt[2];
|
assign l0x[5]=pt[26]; assign l0x[6]=pt[18]; assign l0x[7]=pt[10]; assign l0x[8]=pt[2];
|
||||||
|
|
@ -941,10 +941,10 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module desxor1(e,b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x,k);
|
module desxor1(e,b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x,k);
|
||||||
input [1:48] e;
|
input [1:48] e;
|
||||||
output [1:6] b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x;
|
output [1:6] b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x;
|
||||||
input [1:48] k;
|
input [1:48] k;
|
||||||
wire [1:48] XX;
|
wire [1:48] XX;
|
||||||
|
|
||||||
assign XX = k ^ e;
|
assign XX = k ^ e;
|
||||||
assign b1x = XX[1:6];
|
assign b1x = XX[1:6];
|
||||||
|
|
@ -960,9 +960,9 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module pp(so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x,ppo);
|
module pp(so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x,ppo);
|
||||||
input [1:4] so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x;
|
input [1:4] so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x;
|
||||||
output [1:32] ppo;
|
output [1:32] ppo;
|
||||||
wire [1:32] XX;
|
wire [1:32] XX;
|
||||||
|
|
||||||
assign XX[1:4]=so1x; assign XX[5:8]=so2x; assign XX[9:12]=so3x; assign XX[13:16]=so4x;
|
assign XX[1:4]=so1x; assign XX[5:8]=so2x; assign XX[9:12]=so3x; assign XX[13:16]=so4x;
|
||||||
assign XX[17:20]=so5x; assign XX[21:24]=so6x; assign XX[25:28]=so7x; assign XX[29:32]=so8x;
|
assign XX[17:20]=so5x; assign XX[21:24]=so6x; assign XX[25:28]=so7x; assign XX[29:32]=so8x;
|
||||||
|
|
@ -980,8 +980,8 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module desxor2(d,l,q);
|
module desxor2(d,l,q);
|
||||||
input [1:32] d,l;
|
input [1:32] d,l;
|
||||||
output [1:32] q;
|
output [1:32] q;
|
||||||
|
|
||||||
assign q = d ^ l;
|
assign q = d ^ l;
|
||||||
|
|
||||||
|
|
@ -994,10 +994,10 @@ input [1:32] li, ri;
|
||||||
input [1:48] k;
|
input [1:48] k;
|
||||||
output [1:32] lo, ro;
|
output [1:32] lo, ro;
|
||||||
|
|
||||||
wire [1:48] e;
|
wire [1:48] e;
|
||||||
wire [1:6] b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x;
|
wire [1:6] b1x,b2x,b3x,b4x,b5x,b6x,b7x,b8x;
|
||||||
wire [1:4] so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x;
|
wire [1:4] so1x,so2x,so3x,so4x,so5x,so6x,so7x,so8x;
|
||||||
wire [1:32] ppo;
|
wire [1:32] ppo;
|
||||||
|
|
||||||
xp xp(ri, e);
|
xp xp(ri, e);
|
||||||
desxor1 desxor1(e, b1x, b2x, b3x, b4x, b5x, b6x, b7x, b8x, k);
|
desxor1 desxor1(e, b1x, b2x, b3x, b4x, b5x, b6x, b7x, b8x, k);
|
||||||
|
|
@ -1018,7 +1018,7 @@ endmodule
|
||||||
|
|
||||||
|
|
||||||
module fp(l,r,ct);
|
module fp(l,r,ct);
|
||||||
input [1:32] l,r;
|
input [1:32] l,r;
|
||||||
output [1:64] ct;
|
output [1:64] ct;
|
||||||
|
|
||||||
assign ct[1]=r[8]; assign ct[2]=l[8]; assign ct[3]=r[16]; assign ct[4]=l[16]; assign ct[5]=r[24]; assign ct[6]=l[24]; assign ct[7]=r[32]; assign ct[8]=l[32];
|
assign ct[1]=r[8]; assign ct[2]=l[8]; assign ct[3]=r[16]; assign ct[4]=l[16]; assign ct[5]=r[24]; assign ct[6]=l[24]; assign ct[7]=r[32]; assign ct[8]=l[32];
|
||||||
|
|
|
||||||
|
|
@ -55,12 +55,12 @@
|
||||||
module register (out, val, clk, oe);
|
module register (out, val, clk, oe);
|
||||||
|
|
||||||
output [7:0] out;
|
output [7:0] out;
|
||||||
input [7:0] val;
|
input [7:0] val;
|
||||||
input clk, oe;
|
input clk, oe;
|
||||||
|
|
||||||
reg [7:0] Q;
|
reg [7:0] Q;
|
||||||
|
|
||||||
wire [7:0] out;
|
wire [7:0] out;
|
||||||
|
|
||||||
bufif0 drv[7:0](out, Q, oe);
|
bufif0 drv[7:0](out, Q, oe);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -252,7 +252,7 @@ endmodule // sqrt32
|
||||||
module main;
|
module main;
|
||||||
|
|
||||||
reg [31:0] x;
|
reg [31:0] x;
|
||||||
reg clk, reset;
|
reg clk, reset;
|
||||||
|
|
||||||
wire [15:0] y;
|
wire [15:0] y;
|
||||||
wire rdy;
|
wire rdy;
|
||||||
|
|
@ -354,7 +354,7 @@ module chip_root(clk, rdy, reset, x, y);
|
||||||
input [31:0] x;
|
input [31:0] x;
|
||||||
output [15:0] y;
|
output [15:0] y;
|
||||||
|
|
||||||
wire clk_int;
|
wire clk_int;
|
||||||
|
|
||||||
(* cellref="BUFG:O,I" *)
|
(* cellref="BUFG:O,I" *)
|
||||||
buf gbuf (clk_int, clk);
|
buf gbuf (clk_int, clk);
|
||||||
|
|
|
||||||
|
|
@ -1328,7 +1328,7 @@ static NetEvWait* make_func_trigger(Design*des, NetScope*scope, NetExpr*root)
|
||||||
delete nset;
|
delete nset;
|
||||||
|
|
||||||
return trigger;
|
return trigger;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetNet* NetESFunc::synthesize(Design*des, NetScope*scope, NetExpr*root)
|
NetNet* NetESFunc::synthesize(Design*des, NetScope*scope, NetExpr*root)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1394,19 +1394,19 @@ static void do_expand(int use_args)
|
||||||
str_buf[idx+1] = '0';
|
str_buf[idx+1] = '0';
|
||||||
str_buf[idx+2] = '4';
|
str_buf[idx+2] = '4';
|
||||||
str_buf[idx+3] = '2';
|
str_buf[idx+3] = '2';
|
||||||
idx += 4;
|
idx += 4;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (*cp == '\\') {
|
if (*cp == '\\') {
|
||||||
str_buf[idx] = '\\';
|
str_buf[idx] = '\\';
|
||||||
str_buf[idx+1] = '1';
|
str_buf[idx+1] = '1';
|
||||||
str_buf[idx+2] = '3';
|
str_buf[idx+2] = '3';
|
||||||
str_buf[idx+3] = '4';
|
str_buf[idx+3] = '4';
|
||||||
idx += 4;
|
idx += 4;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
str_buf[idx] = *cp;
|
str_buf[idx] = *cp;
|
||||||
idx += 1;
|
idx += 1;
|
||||||
}
|
}
|
||||||
str_buf[idx] = 0;
|
str_buf[idx] = 0;
|
||||||
idx += 1;
|
idx += 1;
|
||||||
|
|
|
||||||
2
main.cc
2
main.cc
|
|
@ -872,7 +872,7 @@ int main(int argc, char*argv[])
|
||||||
|
|
||||||
if (gn_cadence_types_flag)
|
if (gn_cadence_types_flag)
|
||||||
lexor_keyword_mask |= GN_KEYWORDS_ICARUS;
|
lexor_keyword_mask |= GN_KEYWORDS_ICARUS;
|
||||||
|
|
||||||
if (gn_verilog_ams_flag)
|
if (gn_verilog_ams_flag)
|
||||||
lexor_keyword_mask |= GN_KEYWORDS_VAMS_2_3;
|
lexor_keyword_mask |= GN_KEYWORDS_VAMS_2_3;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,7 @@ Download the msys-1.x.x.exe and msysdtc-1.x.x.exe binaries. These are
|
||||||
self-installing packages. Install msys first, and then msysDTC. Most
|
self-installing packages. Install msys first, and then msysDTC. Most
|
||||||
likely, you want to install them in c:/msys. (The msysDTK is installed
|
likely, you want to install them in c:/msys. (The msysDTK is installed
|
||||||
in the same location, as it is an add-on.)
|
in the same location, as it is an add-on.)
|
||||||
|
|
||||||
This install should be easy and reliable.
|
This install should be easy and reliable.
|
||||||
|
|
||||||
The installation will leave an "msys" icon on your desktop and in the
|
The installation will leave an "msys" icon on your desktop and in the
|
||||||
|
|
|
||||||
|
|
@ -382,7 +382,7 @@ void Nexus::unlink(Link*that)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the link I'm removing was a driver for this nexus, then
|
// If the link I'm removing was a driver for this nexus, then
|
||||||
// cancel my guess of the driven value.
|
// cancel my guess of the driven value.
|
||||||
if (that->get_dir() != Link::INPUT)
|
if (that->get_dir() != Link::INPUT)
|
||||||
driven_ = NO_GUESS;
|
driven_ = NO_GUESS;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -251,14 +251,14 @@ void NetScope::print_type(ostream&stream) const
|
||||||
break;
|
break;
|
||||||
case FORK_JOIN:
|
case FORK_JOIN:
|
||||||
stream << "parallel block";
|
stream << "parallel block";
|
||||||
break;
|
break;
|
||||||
case FUNC:
|
case FUNC:
|
||||||
stream << "function";
|
stream << "function";
|
||||||
break;
|
break;
|
||||||
case MODULE:
|
case MODULE:
|
||||||
stream << "module <" << (module_name_ ? module_name_.str() : "")
|
stream << "module <" << (module_name_ ? module_name_.str() : "")
|
||||||
<< "> instance";
|
<< "> instance";
|
||||||
break;
|
break;
|
||||||
case TASK:
|
case TASK:
|
||||||
stream << "task";
|
stream << "task";
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
2
parse.y
2
parse.y
|
|
@ -2052,7 +2052,7 @@ local_timeunit_prec_decl
|
||||||
module : attribute_list_opt module_start IDENTIFIER
|
module : attribute_list_opt module_start IDENTIFIER
|
||||||
{ pform_startmodule($3, @2.text, @2.first_line, $1); }
|
{ pform_startmodule($3, @2.text, @2.first_line, $1); }
|
||||||
module_parameter_port_list_opt
|
module_parameter_port_list_opt
|
||||||
module_port_list_opt
|
module_port_list_opt
|
||||||
module_attribute_foreign ';'
|
module_attribute_foreign ';'
|
||||||
{ pform_module_set_ports($6); }
|
{ pform_module_set_ports($6); }
|
||||||
local_timeunit_prec_decl_opt
|
local_timeunit_prec_decl_opt
|
||||||
|
|
|
||||||
18
pform.cc
18
pform.cc
|
|
@ -62,7 +62,7 @@ void parm_to_defparam_list(const string¶m)
|
||||||
key = strdup(param.substr(0, off).c_str());
|
key = strdup(param.substr(0, off).c_str());
|
||||||
value = strdup(param.substr(off+1).c_str());
|
value = strdup(param.substr(off+1).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve hierarchical name for defparam. Remember
|
// Resolve hierarchical name for defparam. Remember
|
||||||
// to deal with bit select for generate scopes. Bit
|
// to deal with bit select for generate scopes. Bit
|
||||||
// select expression should be constant interger.
|
// select expression should be constant interger.
|
||||||
|
|
@ -109,7 +109,7 @@ void parm_to_defparam_list(const string¶m)
|
||||||
ptr = strchr(nkey, '.');
|
ptr = strchr(nkey, '.');
|
||||||
}
|
}
|
||||||
name.push_back(name_component_t(lex_strings.make(nkey)));
|
name.push_back(name_component_t(lex_strings.make(nkey)));
|
||||||
|
|
||||||
// Resolve value to PExpr class. Should support all kind of constant
|
// Resolve value to PExpr class. Should support all kind of constant
|
||||||
// format including based number, dec number, real number and string.
|
// format including based number, dec number, real number and string.
|
||||||
if (*value == '"') { // string type
|
if (*value == '"') { // string type
|
||||||
|
|
@ -127,13 +127,13 @@ void parm_to_defparam_list(const string¶m)
|
||||||
cerr << "<command line>: error: missing close quote of string for defparam: " << name << endl;
|
cerr << "<command line>: error: missing close quote of string for defparam: " << name << endl;
|
||||||
else if (*(buf_ptr+1) != 0) { // '"' appears within string with no escape
|
else if (*(buf_ptr+1) != 0) { // '"' appears within string with no escape
|
||||||
cerr << buf_ptr << endl;
|
cerr << buf_ptr << endl;
|
||||||
cerr << "<command line>: error: \'\"\' appears within string value for defparam: " << name
|
cerr << "<command line>: error: \'\"\' appears within string value for defparam: " << name
|
||||||
<< ". Ignore characters after \'\"\'" << endl;
|
<< ". Ignore characters after \'\"\'" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
*buf_ptr = '\0';
|
*buf_ptr = '\0';
|
||||||
buf_ptr = buf+1;
|
buf_ptr = buf+1;
|
||||||
// Remember to use 'new' to allocate string for PEString
|
// Remember to use 'new' to allocate string for PEString
|
||||||
// because 'delete' is used by its destructor.
|
// because 'delete' is used by its destructor.
|
||||||
char *nchar = strcpy(new char [strlen(buf_ptr)+1], buf_ptr);
|
char *nchar = strcpy(new char [strlen(buf_ptr)+1], buf_ptr);
|
||||||
PExpr* ndec = new PEString(nchar);
|
PExpr* ndec = new PEString(nchar);
|
||||||
|
|
@ -165,17 +165,17 @@ void parm_to_defparam_list(const string¶m)
|
||||||
free(value);
|
free(value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// BASED_NUMBER with size, something like - scope.parameter=2'b11
|
// BASED_NUMBER with size, something like - scope.parameter=2'b11
|
||||||
if (num != value) {
|
if (num != value) {
|
||||||
*num = 0;
|
*num = 0;
|
||||||
verinum *siz = make_unsized_dec(value);
|
verinum *siz = make_unsized_dec(value);
|
||||||
val = pform_verinum_with_size(siz, val, "<command line>", 0);
|
val = pform_verinum_with_size(siz, val, "<command line>", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
PExpr* ndec = new PENumber(val);
|
PExpr* ndec = new PENumber(val);
|
||||||
Module::user_defparms.push_back( make_pair(name, ndec) );
|
Module::user_defparms.push_back( make_pair(name, ndec) );
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// REALTIME, something like - scope.parameter=1.22 or scope.parameter=1e2
|
// REALTIME, something like - scope.parameter=1.22 or scope.parameter=1e2
|
||||||
|
|
@ -799,7 +799,7 @@ void pform_endmodule(const char*name, bool inside_celldefine,
|
||||||
tp_local_flag = false;
|
tp_local_flag = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pform_add_genvar(const struct vlltype&li, const perm_string&name,
|
static void pform_add_genvar(const struct vlltype&li, const perm_string&name,
|
||||||
map<perm_string,LineInfo*>&genvars)
|
map<perm_string,LineInfo*>&genvars)
|
||||||
{
|
{
|
||||||
LineInfo*lni = new LineInfo();
|
LineInfo*lni = new LineInfo();
|
||||||
|
|
|
||||||
2
pform.h
2
pform.h
|
|
@ -418,7 +418,7 @@ extern PExpr* pform_make_branch_probe_expression(const struct vlltype&loc,
|
||||||
extern PExpr* pform_make_branch_probe_expression(const struct vlltype&loc,
|
extern PExpr* pform_make_branch_probe_expression(const struct vlltype&loc,
|
||||||
char*name, char*branch);
|
char*name, char*branch);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse configuration file with format <key>=<value>, where key
|
* Parse configuration file with format <key>=<value>, where key
|
||||||
* is the hierarchical name of a valid parameter name and value
|
* is the hierarchical name of a valid parameter name and value
|
||||||
* is the value user wants to assign to. The value should be constant.
|
* is the value user wants to assign to. The value should be constant.
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ NetScope*symbol_search(const LineInfo*li, Design*des, NetScope*scope,
|
||||||
cerr << li->get_fileline() << ": error: Hierarchical "
|
cerr << li->get_fileline() << ": error: Hierarchical "
|
||||||
"reference to automatically allocated item "
|
"reference to automatically allocated item "
|
||||||
"`" << key << "' in path `" << path << "'" << endl;
|
"`" << key << "' in path `" << path << "'" << endl;
|
||||||
des->errors += 1;
|
des->errors += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
hier_path = true;
|
hier_path = true;
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ stamp-vhdl_config-h: $(srcdir)/vhdl_config.h.in ../config.status
|
||||||
vhdl_config.h: stamp-vhdl_config-h
|
vhdl_config.h: stamp-vhdl_config-h
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(O) dep vhdl.tgt
|
rm -rf $(O) dep vhdl.tgt
|
||||||
|
|
||||||
distclean: clean
|
distclean: clean
|
||||||
rm -f Makefile config.log
|
rm -f Makefile config.log
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ vhdl_expr *vhdl_expr::cast(const vhdl_type *to)
|
||||||
// we can't generate any type conversion code
|
// we can't generate any type conversion code
|
||||||
if (NULL == type_)
|
if (NULL == type_)
|
||||||
return this;
|
return this;
|
||||||
|
|
||||||
if (to->get_name() == type_->get_name()) {
|
if (to->get_name() == type_->get_name()) {
|
||||||
if (to->get_width() == type_->get_width())
|
if (to->get_width() == type_->get_width())
|
||||||
return this; // Identical
|
return this; // Identical
|
||||||
|
|
@ -79,7 +79,7 @@ vhdl_expr *vhdl_expr::to_vector(vhdl_type_name_t name, int w)
|
||||||
vhdl_bit_spec_expr *bs =
|
vhdl_bit_spec_expr *bs =
|
||||||
new vhdl_bit_spec_expr(new vhdl_type(name, w - 1, 0), others);
|
new vhdl_bit_spec_expr(new vhdl_type(name, w - 1, 0), others);
|
||||||
bs->add_bit(0, this);
|
bs->add_bit(0, this);
|
||||||
|
|
||||||
return bs;
|
return bs;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -89,11 +89,11 @@ vhdl_expr *vhdl_expr::to_vector(vhdl_type_name_t name, int w)
|
||||||
vhdl_type *t = new vhdl_type(name, w - 1, 0);
|
vhdl_type *t = new vhdl_type(name, w - 1, 0);
|
||||||
vhdl_fcall *conv = new vhdl_fcall(t->get_string().c_str(), t);
|
vhdl_fcall *conv = new vhdl_fcall(t->get_string().c_str(), t);
|
||||||
conv->add_expr(this);
|
conv->add_expr(this);
|
||||||
|
|
||||||
if (w != type_->get_width())
|
if (w != type_->get_width())
|
||||||
return conv->resize(w);
|
return conv->resize(w);
|
||||||
else
|
else
|
||||||
return conv;
|
return conv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -110,9 +110,9 @@ vhdl_expr *vhdl_expr::to_integer()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
conv = new vhdl_fcall("To_Integer", vhdl_type::integer());
|
conv = new vhdl_fcall("To_Integer", vhdl_type::integer());
|
||||||
|
|
||||||
conv->add_expr(this);
|
conv->add_expr(this);
|
||||||
|
|
||||||
return conv;
|
return conv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -130,7 +130,7 @@ vhdl_expr *vhdl_expr::to_boolean()
|
||||||
else if (type_->get_name() == VHDL_TYPE_UNSIGNED) {
|
else if (type_->get_name() == VHDL_TYPE_UNSIGNED) {
|
||||||
// Need to use a support function for this conversion
|
// Need to use a support function for this conversion
|
||||||
require_support_function(SF_UNSIGNED_TO_BOOLEAN);
|
require_support_function(SF_UNSIGNED_TO_BOOLEAN);
|
||||||
|
|
||||||
vhdl_fcall *conv =
|
vhdl_fcall *conv =
|
||||||
new vhdl_fcall(support_function::function_name(SF_UNSIGNED_TO_BOOLEAN),
|
new vhdl_fcall(support_function::function_name(SF_UNSIGNED_TO_BOOLEAN),
|
||||||
vhdl_type::boolean());
|
vhdl_type::boolean());
|
||||||
|
|
@ -139,7 +139,7 @@ vhdl_expr *vhdl_expr::to_boolean()
|
||||||
}
|
}
|
||||||
else if (type_->get_name() == VHDL_TYPE_SIGNED) {
|
else if (type_->get_name() == VHDL_TYPE_SIGNED) {
|
||||||
require_support_function(SF_SIGNED_TO_BOOLEAN);
|
require_support_function(SF_SIGNED_TO_BOOLEAN);
|
||||||
|
|
||||||
vhdl_fcall *conv =
|
vhdl_fcall *conv =
|
||||||
new vhdl_fcall(support_function::function_name(SF_SIGNED_TO_BOOLEAN),
|
new vhdl_fcall(support_function::function_name(SF_SIGNED_TO_BOOLEAN),
|
||||||
vhdl_type::boolean());
|
vhdl_type::boolean());
|
||||||
|
|
@ -157,12 +157,12 @@ vhdl_expr *vhdl_expr::to_std_logic()
|
||||||
{
|
{
|
||||||
if (type_->get_name() == VHDL_TYPE_BOOLEAN) {
|
if (type_->get_name() == VHDL_TYPE_BOOLEAN) {
|
||||||
require_support_function(SF_BOOLEAN_TO_LOGIC);
|
require_support_function(SF_BOOLEAN_TO_LOGIC);
|
||||||
|
|
||||||
vhdl_fcall *ah =
|
vhdl_fcall *ah =
|
||||||
new vhdl_fcall(support_function::function_name(SF_BOOLEAN_TO_LOGIC),
|
new vhdl_fcall(support_function::function_name(SF_BOOLEAN_TO_LOGIC),
|
||||||
vhdl_type::std_logic());
|
vhdl_type::std_logic());
|
||||||
ah->add_expr(this);
|
ah->add_expr(this);
|
||||||
|
|
||||||
return ah;
|
return ah;
|
||||||
}
|
}
|
||||||
else if (type_->get_name() == VHDL_TYPE_SIGNED) {
|
else if (type_->get_name() == VHDL_TYPE_SIGNED) {
|
||||||
|
|
@ -196,7 +196,7 @@ vhdl_expr *vhdl_expr::to_std_ulogic()
|
||||||
f->add_expr(this);
|
f->add_expr(this);
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -219,11 +219,11 @@ vhdl_expr *vhdl_expr::resize(int newwidth)
|
||||||
vhdl_binop_expr* concat =
|
vhdl_binop_expr* concat =
|
||||||
new vhdl_binop_expr(zeros, VHDL_BINOP_CONCAT, this,
|
new vhdl_binop_expr(zeros, VHDL_BINOP_CONCAT, this,
|
||||||
vhdl_type::nunsigned(newwidth));
|
vhdl_type::nunsigned(newwidth));
|
||||||
return concat;
|
return concat;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return this; // Doesn't make sense to resize non-vector type
|
return this; // Doesn't make sense to resize non-vector type
|
||||||
|
|
||||||
vhdl_fcall *resizef = new vhdl_fcall("Resize", rtype);
|
vhdl_fcall *resizef = new vhdl_fcall("Resize", rtype);
|
||||||
resizef->add_expr(this);
|
resizef->add_expr(this);
|
||||||
resizef->add_expr(new vhdl_const_int(newwidth));
|
resizef->add_expr(new vhdl_const_int(newwidth));
|
||||||
|
|
@ -267,10 +267,10 @@ vhdl_expr *vhdl_const_bits::to_std_logic()
|
||||||
// VHDL won't let us cast directly between a vector and
|
// VHDL won't let us cast directly between a vector and
|
||||||
// a scalar type
|
// a scalar type
|
||||||
// But we don't need to here as we have the bits available
|
// But we don't need to here as we have the bits available
|
||||||
|
|
||||||
// Take the least significant bit
|
// Take the least significant bit
|
||||||
char lsb = value_[0];
|
char lsb = value_[0];
|
||||||
|
|
||||||
return new vhdl_const_bit(lsb);
|
return new vhdl_const_bit(lsb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -280,14 +280,14 @@ char vhdl_const_bits::sign_bit() const
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_expr *vhdl_const_bits::to_vector(vhdl_type_name_t name, int w)
|
vhdl_expr *vhdl_const_bits::to_vector(vhdl_type_name_t name, int w)
|
||||||
{
|
{
|
||||||
if (name == VHDL_TYPE_STD_LOGIC_VECTOR) {
|
if (name == VHDL_TYPE_STD_LOGIC_VECTOR) {
|
||||||
// Don't need to do anything
|
// Don't need to do anything
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
else if (name == VHDL_TYPE_SIGNED || name == VHDL_TYPE_UNSIGNED) {
|
else if (name == VHDL_TYPE_SIGNED || name == VHDL_TYPE_UNSIGNED) {
|
||||||
// Extend with sign bit
|
// Extend with sign bit
|
||||||
value_.resize(w, sign_bit());
|
value_.resize(w, sign_bit());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
@ -304,8 +304,8 @@ vhdl_expr *vhdl_const_bits::resize(int w)
|
||||||
// Rather than generating a call to Resize, when can just sign-extend
|
// Rather than generating a call to Resize, when can just sign-extend
|
||||||
// the bits here. As well as looking better, this avoids any ambiguity
|
// the bits here. As well as looking better, this avoids any ambiguity
|
||||||
// between which of the signed/unsigned versions of Resize to use.
|
// between which of the signed/unsigned versions of Resize to use.
|
||||||
|
|
||||||
value_.resize(w, sign_bit());
|
value_.resize(w, sign_bit());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,16 +48,16 @@ static void display_write(stmt_container *container, vhdl_expr *expr)
|
||||||
// supported by std.textio
|
// supported by std.textio
|
||||||
std::string name(expr->get_type()->get_string());
|
std::string name(expr->get_type()->get_string());
|
||||||
name += "'Image";
|
name += "'Image";
|
||||||
|
|
||||||
vhdl_fcall *cast
|
vhdl_fcall *cast
|
||||||
= new vhdl_fcall(name.c_str(), vhdl_type::string());
|
= new vhdl_fcall(name.c_str(), vhdl_type::string());
|
||||||
cast->add_expr(expr);
|
cast->add_expr(expr);
|
||||||
|
|
||||||
write->add_expr(cast);
|
write->add_expr(cast);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
write->add_expr(expr);
|
write->add_expr(expr);
|
||||||
|
|
||||||
container->add_stmt(write);
|
container->add_stmt(write);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -125,7 +125,7 @@ int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
||||||
line_var->set_comment("For generating $display output");
|
line_var->set_comment("For generating $display output");
|
||||||
proc->get_scope()->add_decl(line_var);
|
proc->get_scope()->add_decl(line_var);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the data into the line
|
// Write the data into the line
|
||||||
int count = ivl_stmt_parm_count(stmt), i = 0;
|
int count = ivl_stmt_parm_count(stmt), i = 0;
|
||||||
while (i < count) {
|
while (i < count) {
|
||||||
|
|
@ -137,7 +137,7 @@ int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
||||||
display_write(container, new vhdl_const_string(" "));
|
display_write(container, new vhdl_const_string(" "));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ivl_expr_type(net) == IVL_EX_STRING) {
|
if (ivl_expr_type(net) == IVL_EX_STRING) {
|
||||||
ostringstream ss;
|
ostringstream ss;
|
||||||
for (const char *p = ivl_expr_string(net); *p; p++) {
|
for (const char *p = ivl_expr_string(net); *p; p++) {
|
||||||
|
|
@ -154,7 +154,7 @@ int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
||||||
}
|
}
|
||||||
else if (*p == '%' && *(++p) != '%') {
|
else if (*p == '%' && *(++p) != '%') {
|
||||||
flush_string(ss, container);
|
flush_string(ss, container);
|
||||||
|
|
||||||
// Skip over width for now
|
// Skip over width for now
|
||||||
while (isdigit(*p)) ++p;
|
while (isdigit(*p)) ++p;
|
||||||
|
|
||||||
|
|
@ -167,11 +167,11 @@ int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
||||||
assert(i < count);
|
assert(i < count);
|
||||||
ivl_expr_t netp = ivl_stmt_parm(stmt, i++);
|
ivl_expr_t netp = ivl_stmt_parm(stmt, i++);
|
||||||
assert(netp);
|
assert(netp);
|
||||||
|
|
||||||
vhdl_expr *base = translate_expr(netp);
|
vhdl_expr *base = translate_expr(netp);
|
||||||
if (NULL == base)
|
if (NULL == base)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
display_write(container, base);
|
display_write(container, base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -181,20 +181,20 @@ int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call Write on any non-empty string data left in the buffer
|
// Call Write on any non-empty string data left in the buffer
|
||||||
if (!ss.str().empty())
|
if (!ss.str().empty())
|
||||||
display_write(container, new vhdl_const_string(ss.str().c_str()));
|
display_write(container, new vhdl_const_string(ss.str().c_str()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
vhdl_expr *base = translate_expr(net);
|
vhdl_expr *base = translate_expr(net);
|
||||||
if (NULL == base)
|
if (NULL == base)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
display_write(container, base);
|
display_write(container, base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newline)
|
if (newline)
|
||||||
display_line(container);
|
display_line(container);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ static vhdl_expr *change_signedness(vhdl_expr *e, bool issigned)
|
||||||
int msb = e->get_type()->get_msb();
|
int msb = e->get_type()->get_msb();
|
||||||
int lsb = e->get_type()->get_lsb();
|
int lsb = e->get_type()->get_lsb();
|
||||||
vhdl_type u(issigned ? VHDL_TYPE_SIGNED : VHDL_TYPE_UNSIGNED, msb, lsb);
|
vhdl_type u(issigned ? VHDL_TYPE_SIGNED : VHDL_TYPE_UNSIGNED, msb, lsb);
|
||||||
|
|
||||||
return e->cast(&u);
|
return e->cast(&u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -44,9 +44,9 @@ static vhdl_expr *change_signedness(vhdl_expr *e, bool issigned)
|
||||||
* same signedness as the Verilog expression vl_e.
|
* same signedness as the Verilog expression vl_e.
|
||||||
*/
|
*/
|
||||||
static vhdl_expr *correct_signedness(vhdl_expr *vhd_e, ivl_expr_t vl_e)
|
static vhdl_expr *correct_signedness(vhdl_expr *vhd_e, ivl_expr_t vl_e)
|
||||||
{
|
{
|
||||||
bool should_be_signed = ivl_expr_signed(vl_e) != 0;
|
bool should_be_signed = ivl_expr_signed(vl_e) != 0;
|
||||||
|
|
||||||
if (vhd_e->get_type()->get_name() == VHDL_TYPE_UNSIGNED
|
if (vhd_e->get_type()->get_name() == VHDL_TYPE_UNSIGNED
|
||||||
&& should_be_signed) {
|
&& should_be_signed) {
|
||||||
//operand->print();
|
//operand->print();
|
||||||
|
|
@ -69,7 +69,7 @@ static vhdl_expr *correct_signedness(vhdl_expr *vhd_e, ivl_expr_t vl_e)
|
||||||
* Convert a constant Verilog string to a constant VHDL string.
|
* Convert a constant Verilog string to a constant VHDL string.
|
||||||
*/
|
*/
|
||||||
static vhdl_expr *translate_string(ivl_expr_t e)
|
static vhdl_expr *translate_string(ivl_expr_t e)
|
||||||
{
|
{
|
||||||
// TODO: May need to inspect or escape parts of this
|
// TODO: May need to inspect or escape parts of this
|
||||||
const char *str = ivl_expr_string(e);
|
const char *str = ivl_expr_string(e);
|
||||||
return new vhdl_const_string(str);
|
return new vhdl_const_string(str);
|
||||||
|
|
@ -82,12 +82,12 @@ static vhdl_expr *translate_string(ivl_expr_t e)
|
||||||
static vhdl_var_ref *translate_signal(ivl_expr_t e)
|
static vhdl_var_ref *translate_signal(ivl_expr_t e)
|
||||||
{
|
{
|
||||||
ivl_signal_t sig = ivl_expr_signal(e);
|
ivl_signal_t sig = ivl_expr_signal(e);
|
||||||
|
|
||||||
const vhdl_scope *scope = find_scope_for_signal(sig);
|
const vhdl_scope *scope = find_scope_for_signal(sig);
|
||||||
assert(scope);
|
assert(scope);
|
||||||
|
|
||||||
const char *renamed = get_renamed_signal(sig).c_str();
|
const char *renamed = get_renamed_signal(sig).c_str();
|
||||||
|
|
||||||
vhdl_decl *decl = scope->get_decl(renamed);
|
vhdl_decl *decl = scope->get_decl(renamed);
|
||||||
assert(decl);
|
assert(decl);
|
||||||
|
|
||||||
|
|
@ -102,7 +102,7 @@ static vhdl_var_ref *translate_signal(ivl_expr_t e)
|
||||||
|
|
||||||
vhdl_var_ref *ref =
|
vhdl_var_ref *ref =
|
||||||
new vhdl_var_ref(renamed, new vhdl_type(*decl->get_type()));
|
new vhdl_var_ref(renamed, new vhdl_type(*decl->get_type()));
|
||||||
|
|
||||||
ivl_expr_t off;
|
ivl_expr_t off;
|
||||||
if (ivl_signal_array_count(sig) > 0 && (off = ivl_expr_oper1(e))) {
|
if (ivl_signal_array_count(sig) > 0 && (off = ivl_expr_oper1(e))) {
|
||||||
// Select from an array
|
// Select from an array
|
||||||
|
|
@ -152,7 +152,7 @@ static vhdl_expr *translate_reduction(support_function_t f, bool neg,
|
||||||
vhdl_fcall *fcall =
|
vhdl_fcall *fcall =
|
||||||
new vhdl_fcall(support_function::function_name(f),
|
new vhdl_fcall(support_function::function_name(f),
|
||||||
vhdl_type::std_logic());
|
vhdl_type::std_logic());
|
||||||
|
|
||||||
vhdl_type std_logic_vector(VHDL_TYPE_STD_LOGIC_VECTOR);
|
vhdl_type std_logic_vector(VHDL_TYPE_STD_LOGIC_VECTOR);
|
||||||
fcall->add_expr(operand->cast(&std_logic_vector));
|
fcall->add_expr(operand->cast(&std_logic_vector));
|
||||||
|
|
||||||
|
|
@ -173,7 +173,7 @@ static vhdl_expr *translate_unary(ivl_expr_t e)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
operand = correct_signedness(operand, e);
|
operand = correct_signedness(operand, e);
|
||||||
|
|
||||||
char opcode = ivl_expr_opcode(e);
|
char opcode = ivl_expr_opcode(e);
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case '!':
|
case '!':
|
||||||
|
|
@ -234,7 +234,7 @@ static vhdl_expr *translate_relation(vhdl_expr *lhs, vhdl_expr *rhs,
|
||||||
// Generate any necessary casts
|
// Generate any necessary casts
|
||||||
// Arbitrarily, the RHS is casted to the type of the LHS
|
// Arbitrarily, the RHS is casted to the type of the LHS
|
||||||
vhdl_expr *r_cast = rhs->cast(lhs->get_type());
|
vhdl_expr *r_cast = rhs->cast(lhs->get_type());
|
||||||
|
|
||||||
return new vhdl_binop_expr(lhs, op, r_cast, vhdl_type::boolean());
|
return new vhdl_binop_expr(lhs, op, r_cast, vhdl_type::boolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -311,7 +311,7 @@ static vhdl_expr *translate_binary(ivl_expr_t e)
|
||||||
vhdl_expr *lhs = translate_expr(ivl_expr_oper1(e));
|
vhdl_expr *lhs = translate_expr(ivl_expr_oper1(e));
|
||||||
if (NULL == lhs)
|
if (NULL == lhs)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vhdl_expr *rhs = translate_expr(ivl_expr_oper2(e));
|
vhdl_expr *rhs = translate_expr(ivl_expr_oper2(e));
|
||||||
if (NULL == rhs)
|
if (NULL == rhs)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -319,7 +319,7 @@ static vhdl_expr *translate_binary(ivl_expr_t e)
|
||||||
int lwidth = lhs->get_type()->get_width();
|
int lwidth = lhs->get_type()->get_width();
|
||||||
int rwidth = rhs->get_type()->get_width();
|
int rwidth = rhs->get_type()->get_width();
|
||||||
int result_width = ivl_expr_width(e);
|
int result_width = ivl_expr_width(e);
|
||||||
|
|
||||||
// For === and !== we need to compare std_logic_vectors
|
// For === and !== we need to compare std_logic_vectors
|
||||||
// rather than signeds
|
// rather than signeds
|
||||||
vhdl_type std_logic_vector(VHDL_TYPE_STD_LOGIC_VECTOR, result_width-1, 0);
|
vhdl_type std_logic_vector(VHDL_TYPE_STD_LOGIC_VECTOR, result_width-1, 0);
|
||||||
|
|
@ -328,7 +328,7 @@ static vhdl_expr *translate_binary(ivl_expr_t e)
|
||||||
bool vectorop =
|
bool vectorop =
|
||||||
(ltype == VHDL_TYPE_SIGNED || ltype == VHDL_TYPE_UNSIGNED) &&
|
(ltype == VHDL_TYPE_SIGNED || ltype == VHDL_TYPE_UNSIGNED) &&
|
||||||
(rtype == VHDL_TYPE_SIGNED || rtype == VHDL_TYPE_UNSIGNED);
|
(rtype == VHDL_TYPE_SIGNED || rtype == VHDL_TYPE_UNSIGNED);
|
||||||
|
|
||||||
// May need to resize the left or right hand side or change the
|
// May need to resize the left or right hand side or change the
|
||||||
// signedness
|
// signedness
|
||||||
if (vectorop) {
|
if (vectorop) {
|
||||||
|
|
@ -425,7 +425,7 @@ static vhdl_expr *translate_binary(ivl_expr_t e)
|
||||||
result = translate_shift(lhs, rhs, VHDL_BINOP_SRA);
|
result = translate_shift(lhs, rhs, VHDL_BINOP_SRA);
|
||||||
else
|
else
|
||||||
result = translate_shift(lhs, rhs, VHDL_BINOP_SR);
|
result = translate_shift(lhs, rhs, VHDL_BINOP_SR);
|
||||||
break;
|
break;
|
||||||
case '^':
|
case '^':
|
||||||
result = translate_numeric(lhs, rhs, VHDL_BINOP_XOR);
|
result = translate_numeric(lhs, rhs, VHDL_BINOP_XOR);
|
||||||
break;
|
break;
|
||||||
|
|
@ -463,7 +463,7 @@ static vhdl_expr *translate_select(ivl_expr_t e)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ivl_expr_t o2 = ivl_expr_oper2(e);
|
ivl_expr_t o2 = ivl_expr_oper2(e);
|
||||||
if (o2) {
|
if (o2) {
|
||||||
vhdl_expr *base = translate_expr(ivl_expr_oper2(e));
|
vhdl_expr *base = translate_expr(ivl_expr_oper2(e));
|
||||||
if (NULL == base)
|
if (NULL == base)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -528,7 +528,7 @@ static vhdl_expr *translate_ufunc(ivl_expr_t e)
|
||||||
|
|
||||||
const char *funcname = ivl_scope_tname(defscope);
|
const char *funcname = ivl_scope_tname(defscope);
|
||||||
|
|
||||||
vhdl_type *rettype =
|
vhdl_type *rettype =
|
||||||
vhdl_type::type_for(ivl_expr_width(e), ivl_expr_signed(e) != 0);
|
vhdl_type::type_for(ivl_expr_width(e), ivl_expr_signed(e) != 0);
|
||||||
vhdl_fcall *fcall = new vhdl_fcall(funcname, rettype);
|
vhdl_fcall *fcall = new vhdl_fcall(funcname, rettype);
|
||||||
|
|
||||||
|
|
@ -539,18 +539,18 @@ static vhdl_expr *translate_ufunc(ivl_expr_t e)
|
||||||
delete fcall;
|
delete fcall;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the parameter has the correct VHDL type
|
// Ensure the parameter has the correct VHDL type
|
||||||
// Parameter number is i + 1 since 0th parameter is return value
|
// Parameter number is i + 1 since 0th parameter is return value
|
||||||
ivl_signal_t param_sig = ivl_scope_port(defscope, i + 1);
|
ivl_signal_t param_sig = ivl_scope_port(defscope, i + 1);
|
||||||
vhdl_type *param_type =
|
vhdl_type *param_type =
|
||||||
vhdl_type::type_for(ivl_signal_width(param_sig),
|
vhdl_type::type_for(ivl_signal_width(param_sig),
|
||||||
ivl_signal_signed(param_sig) != 0);
|
ivl_signal_signed(param_sig) != 0);
|
||||||
|
|
||||||
fcall->add_expr(param->cast(param_type));
|
fcall->add_expr(param->cast(param_type));
|
||||||
delete param_type;
|
delete param_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fcall;
|
return fcall;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -565,7 +565,7 @@ static vhdl_expr *translate_ternary(ivl_expr_t e)
|
||||||
sf = SF_TERNARY_SIGNED;
|
sf = SF_TERNARY_SIGNED;
|
||||||
else
|
else
|
||||||
sf = SF_TERNARY_UNSIGNED;
|
sf = SF_TERNARY_UNSIGNED;
|
||||||
|
|
||||||
require_support_function(sf);
|
require_support_function(sf);
|
||||||
|
|
||||||
vhdl_expr *test = translate_expr(ivl_expr_oper1(e));
|
vhdl_expr *test = translate_expr(ivl_expr_oper1(e));
|
||||||
|
|
@ -576,20 +576,20 @@ static vhdl_expr *translate_ternary(ivl_expr_t e)
|
||||||
|
|
||||||
vhdl_type boolean(VHDL_TYPE_BOOLEAN);
|
vhdl_type boolean(VHDL_TYPE_BOOLEAN);
|
||||||
test = test->cast(&boolean);
|
test = test->cast(&boolean);
|
||||||
|
|
||||||
vhdl_fcall *fcall =
|
vhdl_fcall *fcall =
|
||||||
new vhdl_fcall(support_function::function_name(sf),
|
new vhdl_fcall(support_function::function_name(sf),
|
||||||
vhdl_type::type_for(width, issigned));
|
vhdl_type::type_for(width, issigned));
|
||||||
fcall->add_expr(test);
|
fcall->add_expr(test);
|
||||||
fcall->add_expr(true_part);
|
fcall->add_expr(true_part);
|
||||||
fcall->add_expr(false_part);
|
fcall->add_expr(false_part);
|
||||||
|
|
||||||
return fcall;
|
return fcall;
|
||||||
}
|
}
|
||||||
|
|
||||||
static vhdl_expr *translate_concat(ivl_expr_t e)
|
static vhdl_expr *translate_concat(ivl_expr_t e)
|
||||||
{
|
{
|
||||||
vhdl_type *rtype =
|
vhdl_type *rtype =
|
||||||
vhdl_type::type_for(ivl_expr_width(e), ivl_expr_signed(e) != 0);
|
vhdl_type::type_for(ivl_expr_width(e), ivl_expr_signed(e) != 0);
|
||||||
vhdl_binop_expr *concat = new vhdl_binop_expr(VHDL_BINOP_CONCAT, rtype);
|
vhdl_binop_expr *concat = new vhdl_binop_expr(VHDL_BINOP_CONCAT, rtype);
|
||||||
|
|
||||||
|
|
@ -716,11 +716,11 @@ vhdl_expr *translate_time_expr(ivl_expr_t e)
|
||||||
if (time->get_type()->get_name() != VHDL_TYPE_TIME) {
|
if (time->get_type()->get_name() != VHDL_TYPE_TIME) {
|
||||||
vhdl_type integer(VHDL_TYPE_INTEGER);
|
vhdl_type integer(VHDL_TYPE_INTEGER);
|
||||||
time = time->cast(&integer);
|
time = time->cast(&integer);
|
||||||
|
|
||||||
vhdl_expr *ns1 = scale_time(get_active_entity(), 1);
|
vhdl_expr *ns1 = scale_time(get_active_entity(), 1);
|
||||||
return new vhdl_binop_expr(time, VHDL_BINOP_MULT, ns1,
|
return new vhdl_binop_expr(time, VHDL_BINOP_MULT, ns1,
|
||||||
vhdl_type::time());
|
vhdl_type::time());
|
||||||
}
|
}
|
||||||
else // Translating IVL_EX_DELAY will always return a time type
|
else // Translating IVL_EX_DELAY will always return a time type
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,11 +36,11 @@ static vhdl_expr *inputs_to_expr(vhdl_scope *scope, vhdl_binop_t op,
|
||||||
// the program has already been type checked
|
// the program has already been type checked
|
||||||
vhdl_binop_expr *gate =
|
vhdl_binop_expr *gate =
|
||||||
new vhdl_binop_expr(op, vhdl_type::std_logic());
|
new vhdl_binop_expr(op, vhdl_type::std_logic());
|
||||||
|
|
||||||
int npins = ivl_logic_pins(log);
|
int npins = ivl_logic_pins(log);
|
||||||
for (int i = 1; i < npins; i++) {
|
for (int i = 1; i < npins; i++) {
|
||||||
ivl_nexus_t input = ivl_logic_pin(log, i);
|
ivl_nexus_t input = ivl_logic_pin(log, i);
|
||||||
|
|
||||||
gate->add_expr(readable_ref(scope, input));
|
gate->add_expr(readable_ref(scope, input));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,7 +57,7 @@ static vhdl_expr *input_to_expr(vhdl_scope *scope, vhdl_unaryop_t op,
|
||||||
assert(input);
|
assert(input);
|
||||||
|
|
||||||
vhdl_expr *operand = readable_ref(scope, input);
|
vhdl_expr *operand = readable_ref(scope, input);
|
||||||
return new vhdl_unaryop_expr(op, operand, vhdl_type::std_logic());
|
return new vhdl_unaryop_expr(op, operand, vhdl_type::std_logic());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bufif_logic(vhdl_arch *arch, ivl_net_logic_t log, bool if0)
|
static void bufif_logic(vhdl_arch *arch, ivl_net_logic_t log, bool if0)
|
||||||
|
|
@ -65,7 +65,7 @@ static void bufif_logic(vhdl_arch *arch, ivl_net_logic_t log, bool if0)
|
||||||
ivl_nexus_t output = ivl_logic_pin(log, 0);
|
ivl_nexus_t output = ivl_logic_pin(log, 0);
|
||||||
vhdl_var_ref *lhs = nexus_to_var_ref(arch->get_scope(), output);
|
vhdl_var_ref *lhs = nexus_to_var_ref(arch->get_scope(), output);
|
||||||
assert(lhs);
|
assert(lhs);
|
||||||
|
|
||||||
vhdl_expr *val = readable_ref(arch->get_scope(), ivl_logic_pin(log, 1));
|
vhdl_expr *val = readable_ref(arch->get_scope(), ivl_logic_pin(log, 1));
|
||||||
|
|
||||||
vhdl_expr *sel = readable_ref(arch->get_scope(), ivl_logic_pin(log, 2));
|
vhdl_expr *sel = readable_ref(arch->get_scope(), ivl_logic_pin(log, 2));
|
||||||
|
|
@ -80,7 +80,7 @@ static void bufif_logic(vhdl_arch *arch, ivl_net_logic_t log, bool if0)
|
||||||
vhdl_binop_t op = if0 ? VHDL_BINOP_EQ : VHDL_BINOP_NEQ;
|
vhdl_binop_t op = if0 ? VHDL_BINOP_EQ : VHDL_BINOP_NEQ;
|
||||||
cmp = new vhdl_binop_expr(sel, op, zero, NULL);
|
cmp = new vhdl_binop_expr(sel, op, zero, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ivl_signal_t sig = find_signal_named(lhs->get_name(), arch->get_scope());
|
ivl_signal_t sig = find_signal_named(lhs->get_name(), arch->get_scope());
|
||||||
char zbit;
|
char zbit;
|
||||||
switch (ivl_signal_type(sig)) {
|
switch (ivl_signal_type(sig)) {
|
||||||
|
|
@ -107,12 +107,12 @@ static void bufif_logic(vhdl_arch *arch, ivl_net_logic_t log, bool if0)
|
||||||
static void comb_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
static void comb_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
{
|
{
|
||||||
ivl_udp_t udp = ivl_logic_udp(log);
|
ivl_udp_t udp = ivl_logic_udp(log);
|
||||||
|
|
||||||
// As with regular case statements, the expression in a
|
// As with regular case statements, the expression in a
|
||||||
// `with .. select' statement must be "locally static".
|
// `with .. select' statement must be "locally static".
|
||||||
// This is achieved by first combining the inputs into
|
// This is achieved by first combining the inputs into
|
||||||
// a temporary
|
// a temporary
|
||||||
|
|
||||||
ostringstream ss;
|
ostringstream ss;
|
||||||
ss << ivl_logic_basename(log) << "_Tmp";
|
ss << ivl_logic_basename(log) << "_Tmp";
|
||||||
int msb = ivl_udp_nin(udp) - 1;
|
int msb = ivl_udp_nin(udp) - 1;
|
||||||
|
|
@ -149,11 +149,11 @@ static void comb_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
// Ensure the select statement completely covers the input space
|
// Ensure the select statement completely covers the input space
|
||||||
// or some strict VHDL compilers will complain
|
// or some strict VHDL compilers will complain
|
||||||
ws->add_default(new vhdl_const_bit('X'));
|
ws->add_default(new vhdl_const_bit('X'));
|
||||||
|
|
||||||
int nrows = ivl_udp_rows(udp);
|
int nrows = ivl_udp_rows(udp);
|
||||||
for (int i = 0; i < nrows; i++) {
|
for (int i = 0; i < nrows; i++) {
|
||||||
const char *row = ivl_udp_row(udp, i);
|
const char *row = ivl_udp_row(udp, i);
|
||||||
|
|
||||||
vhdl_expr *value = new vhdl_const_bit(row[nin]);
|
vhdl_expr *value = new vhdl_const_bit(row[nin]);
|
||||||
vhdl_expr *cond = new vhdl_const_bits(row, nin, false);
|
vhdl_expr *cond = new vhdl_const_bits(row, nin, false);
|
||||||
|
|
||||||
|
|
@ -189,11 +189,11 @@ static void seq_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
int msb = ivl_udp_nin(udp) - 1;
|
int msb = ivl_udp_nin(udp) - 1;
|
||||||
vhdl_type *tmp_type = vhdl_type::std_logic_vector(msb, 0);
|
vhdl_type *tmp_type = vhdl_type::std_logic_vector(msb, 0);
|
||||||
proc->get_scope()->add_decl(new vhdl_var_decl("UDP_Inputs", tmp_type));
|
proc->get_scope()->add_decl(new vhdl_var_decl("UDP_Inputs", tmp_type));
|
||||||
|
|
||||||
// Concatenate the inputs into a single expression that can be
|
// Concatenate the inputs into a single expression that can be
|
||||||
// used as the test in a case statement (this can't be inserted
|
// used as the test in a case statement (this can't be inserted
|
||||||
// directly into the case statement due to the requirement that
|
// directly into the case statement due to the requirement that
|
||||||
// the test expression be "locally static")
|
// the test expression be "locally static")
|
||||||
int nin = ivl_udp_nin(udp);
|
int nin = ivl_udp_nin(udp);
|
||||||
vhdl_expr *tmp_rhs = NULL;
|
vhdl_expr *tmp_rhs = NULL;
|
||||||
if (nin == 1) {
|
if (nin == 1) {
|
||||||
|
|
@ -217,7 +217,7 @@ static void seq_udp_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
|
|
||||||
proc->get_container()->add_stmt
|
proc->get_container()->add_stmt
|
||||||
(new vhdl_assign_stmt(new vhdl_var_ref("UDP_Inputs", NULL), tmp_rhs));
|
(new vhdl_assign_stmt(new vhdl_var_ref("UDP_Inputs", NULL), tmp_rhs));
|
||||||
|
|
||||||
arch->add_stmt(proc);
|
arch->add_stmt(proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -273,18 +273,18 @@ void draw_logic(vhdl_arch *arch, ivl_net_logic_t log)
|
||||||
udp_logic(arch, log);
|
udp_logic(arch, log);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
// The output is always pin zero
|
// The output is always pin zero
|
||||||
ivl_nexus_t output = ivl_logic_pin(log, 0);
|
ivl_nexus_t output = ivl_logic_pin(log, 0);
|
||||||
vhdl_var_ref *lhs = nexus_to_var_ref(arch->get_scope(), output);
|
vhdl_var_ref *lhs = nexus_to_var_ref(arch->get_scope(), output);
|
||||||
|
|
||||||
vhdl_expr *rhs = translate_logic_inputs(arch->get_scope(), log);
|
vhdl_expr *rhs = translate_logic_inputs(arch->get_scope(), log);
|
||||||
vhdl_cassign_stmt *ass = new vhdl_cassign_stmt(lhs, rhs);
|
vhdl_cassign_stmt *ass = new vhdl_cassign_stmt(lhs, rhs);
|
||||||
|
|
||||||
ivl_expr_t delay = ivl_logic_delay(log, 1);
|
ivl_expr_t delay = ivl_logic_delay(log, 1);
|
||||||
if (delay)
|
if (delay)
|
||||||
ass->set_after(translate_time_expr(delay));
|
ass->set_after(translate_time_expr(delay));
|
||||||
|
|
||||||
arch->add_stmt(ass);
|
arch->add_stmt(ass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ static vhdl_expr *concat_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
||||||
vhdl_type::type_for(ivl_lpm_width(lpm), ivl_lpm_signed(lpm) != 0);
|
vhdl_type::type_for(ivl_lpm_width(lpm), ivl_lpm_signed(lpm) != 0);
|
||||||
vhdl_binop_expr *expr =
|
vhdl_binop_expr *expr =
|
||||||
new vhdl_binop_expr(VHDL_BINOP_CONCAT, result_type);
|
new vhdl_binop_expr(VHDL_BINOP_CONCAT, result_type);
|
||||||
|
|
||||||
for (int i = ivl_lpm_size(lpm) - 1; i >= 0; i--) {
|
for (int i = ivl_lpm_size(lpm) - 1; i >= 0; i--) {
|
||||||
vhdl_expr *e = readable_ref(scope, ivl_lpm_data(lpm, i));
|
vhdl_expr *e = readable_ref(scope, ivl_lpm_data(lpm, i));
|
||||||
if (NULL == e) {
|
if (NULL == e) {
|
||||||
|
|
@ -67,7 +67,7 @@ static vhdl_expr *binop_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm, vhdl_binop
|
||||||
vhdl_type *result_type =
|
vhdl_type *result_type =
|
||||||
vhdl_type::type_for(out_width, ivl_lpm_signed(lpm) != 0);
|
vhdl_type::type_for(out_width, ivl_lpm_signed(lpm) != 0);
|
||||||
vhdl_binop_expr *expr = new vhdl_binop_expr(op, result_type);
|
vhdl_binop_expr *expr = new vhdl_binop_expr(op, result_type);
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
vhdl_expr *e = readable_ref(scope, ivl_lpm_data(lpm, i));
|
vhdl_expr *e = readable_ref(scope, ivl_lpm_data(lpm, i));
|
||||||
if (NULL == e) {
|
if (NULL == e) {
|
||||||
|
|
@ -77,16 +77,16 @@ static vhdl_expr *binop_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm, vhdl_binop
|
||||||
|
|
||||||
expr->add_expr(e->cast(result_type));
|
expr->add_expr(e->cast(result_type));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op == VHDL_BINOP_MULT) {
|
if (op == VHDL_BINOP_MULT) {
|
||||||
// Need to resize the output to the desired size,
|
// Need to resize the output to the desired size,
|
||||||
// as this does not happen automatically in VHDL
|
// as this does not happen automatically in VHDL
|
||||||
|
|
||||||
vhdl_fcall *resize =
|
vhdl_fcall *resize =
|
||||||
new vhdl_fcall("Resize", vhdl_type::nsigned(out_width));
|
new vhdl_fcall("Resize", vhdl_type::nsigned(out_width));
|
||||||
resize->add_expr(expr);
|
resize->add_expr(expr);
|
||||||
resize->add_expr(new vhdl_const_int(out_width));
|
resize->add_expr(new vhdl_const_int(out_width));
|
||||||
|
|
||||||
return resize;
|
return resize;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -106,7 +106,7 @@ static vhdl_expr *rel_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm, vhdl_binop_t
|
||||||
delete lhs;
|
delete lhs;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure LHS and RHS are the same type
|
// Ensure LHS and RHS are the same type
|
||||||
if (lhs->get_type() != rhs->get_type())
|
if (lhs->get_type() != rhs->get_type())
|
||||||
rhs = rhs->cast(lhs->get_type());
|
rhs = rhs->cast(lhs->get_type());
|
||||||
|
|
@ -122,20 +122,20 @@ static vhdl_expr *part_select_vp_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
||||||
vhdl_var_ref *selfrom = readable_ref(scope, ivl_lpm_data(lpm, 0));
|
vhdl_var_ref *selfrom = readable_ref(scope, ivl_lpm_data(lpm, 0));
|
||||||
if (NULL == selfrom)
|
if (NULL == selfrom)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vhdl_expr *off = part_select_base(scope, lpm);;
|
vhdl_expr *off = part_select_base(scope, lpm);;
|
||||||
if (NULL == off)
|
if (NULL == off)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (selfrom->get_type()->get_width() > 1)
|
if (selfrom->get_type()->get_width() > 1)
|
||||||
selfrom->set_slice(off, ivl_lpm_width(lpm) - 1);
|
selfrom->set_slice(off, ivl_lpm_width(lpm) - 1);
|
||||||
|
|
||||||
return selfrom;
|
return selfrom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static vhdl_expr *part_select_pv_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
static vhdl_expr *part_select_pv_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
||||||
{
|
{
|
||||||
return readable_ref(scope, ivl_lpm_data(lpm, 0));
|
return readable_ref(scope, ivl_lpm_data(lpm, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -171,13 +171,13 @@ static vhdl_expr *reduction_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm,
|
||||||
require_support_function(f);
|
require_support_function(f);
|
||||||
vhdl_fcall *fcall = new vhdl_fcall(support_function::function_name(f),
|
vhdl_fcall *fcall = new vhdl_fcall(support_function::function_name(f),
|
||||||
vhdl_type::std_logic());
|
vhdl_type::std_logic());
|
||||||
|
|
||||||
vhdl_type std_logic_vector(VHDL_TYPE_STD_LOGIC_VECTOR);
|
vhdl_type std_logic_vector(VHDL_TYPE_STD_LOGIC_VECTOR);
|
||||||
fcall->add_expr(ref->cast(&std_logic_vector));
|
fcall->add_expr(ref->cast(&std_logic_vector));
|
||||||
|
|
||||||
result = fcall;
|
result = fcall;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (invert)
|
if (invert)
|
||||||
return new vhdl_unaryop_expr
|
return new vhdl_unaryop_expr
|
||||||
(VHDL_UNARYOP_NOT, result, vhdl_type::std_logic());
|
(VHDL_UNARYOP_NOT, result, vhdl_type::std_logic());
|
||||||
|
|
@ -199,12 +199,12 @@ static vhdl_expr *array_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
||||||
ivl_signal_t array = ivl_lpm_array(lpm);
|
ivl_signal_t array = ivl_lpm_array(lpm);
|
||||||
if (!seen_signal_before(array))
|
if (!seen_signal_before(array))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
const char *renamed = get_renamed_signal(array).c_str();
|
const char *renamed = get_renamed_signal(array).c_str();
|
||||||
|
|
||||||
vhdl_decl *adecl = scope->get_decl(renamed);
|
vhdl_decl *adecl = scope->get_decl(renamed);
|
||||||
assert(adecl);
|
assert(adecl);
|
||||||
|
|
||||||
vhdl_type *atype = new vhdl_type(*adecl->get_type());
|
vhdl_type *atype = new vhdl_type(*adecl->get_type());
|
||||||
|
|
||||||
vhdl_expr *select = readable_ref(scope, ivl_lpm_select(lpm));
|
vhdl_expr *select = readable_ref(scope, ivl_lpm_select(lpm));
|
||||||
|
|
@ -212,11 +212,11 @@ static vhdl_expr *array_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm)
|
||||||
delete atype;
|
delete atype;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_var_ref *ref = new vhdl_var_ref(renamed, atype);
|
vhdl_var_ref *ref = new vhdl_var_ref(renamed, atype);
|
||||||
vhdl_type integer(VHDL_TYPE_INTEGER);
|
vhdl_type integer(VHDL_TYPE_INTEGER);
|
||||||
ref->set_slice(select->cast(&integer));
|
ref->set_slice(select->cast(&integer));
|
||||||
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -226,8 +226,8 @@ static vhdl_expr *shift_lpm_to_expr(vhdl_scope *scope, ivl_lpm_t lpm,
|
||||||
vhdl_expr *lhs = readable_ref(scope, ivl_lpm_data(lpm, 0));
|
vhdl_expr *lhs = readable_ref(scope, ivl_lpm_data(lpm, 0));
|
||||||
vhdl_expr *rhs = readable_ref(scope, ivl_lpm_data(lpm, 1));
|
vhdl_expr *rhs = readable_ref(scope, ivl_lpm_data(lpm, 1));
|
||||||
if (!lhs || !rhs)
|
if (!lhs || !rhs)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// The RHS must be an integer
|
// The RHS must be an integer
|
||||||
vhdl_type integer(VHDL_TYPE_INTEGER);
|
vhdl_type integer(VHDL_TYPE_INTEGER);
|
||||||
vhdl_expr *r_cast = rhs->cast(&integer);
|
vhdl_expr *r_cast = rhs->cast(&integer);
|
||||||
|
|
@ -311,7 +311,7 @@ static int draw_mux_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_scope *scope = arch->get_scope();
|
vhdl_scope *scope = arch->get_scope();
|
||||||
|
|
||||||
vhdl_expr *s0 = readable_ref(scope, ivl_lpm_data(lpm, 0));
|
vhdl_expr *s0 = readable_ref(scope, ivl_lpm_data(lpm, 0));
|
||||||
vhdl_expr *s1 = readable_ref(scope, ivl_lpm_data(lpm, 1));
|
vhdl_expr *s1 = readable_ref(scope, ivl_lpm_data(lpm, 1));
|
||||||
|
|
||||||
|
|
@ -319,7 +319,7 @@ static int draw_mux_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||||
vhdl_expr *b1 = new vhdl_const_bit('1');
|
vhdl_expr *b1 = new vhdl_const_bit('1');
|
||||||
vhdl_expr *t1 =
|
vhdl_expr *t1 =
|
||||||
new vhdl_binop_expr(sel, VHDL_BINOP_EQ, b1, vhdl_type::boolean());
|
new vhdl_binop_expr(sel, VHDL_BINOP_EQ, b1, vhdl_type::boolean());
|
||||||
|
|
||||||
vhdl_var_ref *out = nexus_to_var_ref(scope, ivl_lpm_q(lpm));
|
vhdl_var_ref *out = nexus_to_var_ref(scope, ivl_lpm_q(lpm));
|
||||||
|
|
||||||
// Make sure s0 and s1 have the same type as the output
|
// Make sure s0 and s1 have the same type as the output
|
||||||
|
|
@ -337,11 +337,11 @@ int draw_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||||
{
|
{
|
||||||
if (ivl_lpm_type(lpm) == IVL_LPM_MUX)
|
if (ivl_lpm_type(lpm) == IVL_LPM_MUX)
|
||||||
return draw_mux_lpm(arch, lpm);
|
return draw_mux_lpm(arch, lpm);
|
||||||
|
|
||||||
vhdl_expr *f = lpm_to_expr(arch->get_scope(), lpm);
|
vhdl_expr *f = lpm_to_expr(arch->get_scope(), lpm);
|
||||||
if (NULL == f)
|
if (NULL == f)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
vhdl_var_ref *out = nexus_to_var_ref(arch->get_scope(), ivl_lpm_q(lpm));
|
vhdl_var_ref *out = nexus_to_var_ref(arch->get_scope(), ivl_lpm_q(lpm));
|
||||||
if (ivl_lpm_type(lpm) == IVL_LPM_PART_PV) {
|
if (ivl_lpm_type(lpm) == IVL_LPM_PART_PV) {
|
||||||
vhdl_expr *off = part_select_base(arch->get_scope(), lpm);
|
vhdl_expr *off = part_select_base(arch->get_scope(), lpm);
|
||||||
|
|
@ -357,16 +357,16 @@ int draw_lpm(vhdl_arch *arch, ivl_lpm_t lpm)
|
||||||
bool bool_to_logic =
|
bool bool_to_logic =
|
||||||
out->get_type()->get_name() == VHDL_TYPE_STD_LOGIC
|
out->get_type()->get_name() == VHDL_TYPE_STD_LOGIC
|
||||||
&& f->get_type()->get_name() == VHDL_TYPE_BOOLEAN;
|
&& f->get_type()->get_name() == VHDL_TYPE_BOOLEAN;
|
||||||
|
|
||||||
if (bool_to_logic) {
|
if (bool_to_logic) {
|
||||||
vhdl_cassign_stmt* s =
|
vhdl_cassign_stmt* s =
|
||||||
new vhdl_cassign_stmt(out, new vhdl_const_bit('0'));
|
new vhdl_cassign_stmt(out, new vhdl_const_bit('0'));
|
||||||
s->add_condition(new vhdl_const_bit('1'), f);
|
s->add_condition(new vhdl_const_bit('1'), f);
|
||||||
arch->add_stmt(s);
|
arch->add_stmt(s);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
arch->add_stmt(new vhdl_cassign_stmt(out, f->cast(out->get_type())));
|
arch->add_stmt(new vhdl_cassign_stmt(out, f->cast(out->get_type())));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
static int generate_vhdl_process(vhdl_entity *ent, ivl_process_t proc)
|
static int generate_vhdl_process(vhdl_entity *ent, ivl_process_t proc)
|
||||||
{
|
{
|
||||||
set_active_entity(ent);
|
set_active_entity(ent);
|
||||||
|
|
||||||
// Create a new process and store it in the entity's
|
// Create a new process and store it in the entity's
|
||||||
// architecture. This needs to be done first or the
|
// architecture. This needs to be done first or the
|
||||||
// parent link won't be valid (and draw_stmt needs this
|
// parent link won't be valid (and draw_stmt needs this
|
||||||
|
|
@ -45,7 +45,7 @@ static int generate_vhdl_process(vhdl_entity *ent, ivl_process_t proc)
|
||||||
// into the declarations
|
// into the declarations
|
||||||
vhdl_proc->get_scope()->set_initializing
|
vhdl_proc->get_scope()->set_initializing
|
||||||
(ivl_process_type(proc) == IVL_PR_INITIAL);
|
(ivl_process_type(proc) == IVL_PR_INITIAL);
|
||||||
|
|
||||||
ivl_statement_t stmt = ivl_process_stmt(proc);
|
ivl_statement_t stmt = ivl_process_stmt(proc);
|
||||||
int rc = draw_stmt(vhdl_proc, vhdl_proc->get_container(), stmt);
|
int rc = draw_stmt(vhdl_proc, vhdl_proc->get_container(), stmt);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
|
|
@ -61,13 +61,13 @@ static int generate_vhdl_process(vhdl_entity *ent, ivl_process_t proc)
|
||||||
// Get rid of any useless `wait for 0 ns's at the end of the process
|
// Get rid of any useless `wait for 0 ns's at the end of the process
|
||||||
prune_wait_for_0(vhdl_proc->get_container());
|
prune_wait_for_0(vhdl_proc->get_container());
|
||||||
|
|
||||||
// The above pruning might have removed all logic from the process
|
// The above pruning might have removed all logic from the process
|
||||||
if (!vhdl_proc->get_container()->empty()) {
|
if (!vhdl_proc->get_container()->empty()) {
|
||||||
vhdl_wait_stmt *wait = new vhdl_wait_stmt();
|
vhdl_wait_stmt *wait = new vhdl_wait_stmt();
|
||||||
vhdl_proc->get_container()->add_stmt(wait);
|
vhdl_proc->get_container()->add_stmt(wait);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a comment indicating where it came from
|
// Add a comment indicating where it came from
|
||||||
ivl_scope_t scope = ivl_process_scope(proc);
|
ivl_scope_t scope = ivl_process_scope(proc);
|
||||||
const char *type = ivl_process_type(proc) == IVL_PR_INITIAL
|
const char *type = ivl_process_type(proc) == IVL_PR_INITIAL
|
||||||
|
|
@ -90,21 +90,21 @@ extern "C" int draw_process(ivl_process_t proc, void *cd)
|
||||||
if (!is_default_scope_instance(scope))
|
if (!is_default_scope_instance(scope))
|
||||||
return 0; // Ignore this process at it's not in a scope that
|
return 0; // Ignore this process at it's not in a scope that
|
||||||
// we're using to generate code
|
// we're using to generate code
|
||||||
|
|
||||||
debug_msg("Translating process in scope type %s (%s:%d)",
|
debug_msg("Translating process in scope type %s (%s:%d)",
|
||||||
ivl_scope_tname(scope), ivl_process_file(proc),
|
ivl_scope_tname(scope), ivl_process_file(proc),
|
||||||
ivl_process_lineno(proc));
|
ivl_process_lineno(proc));
|
||||||
|
|
||||||
// Skip over any generate and begin scopes until we find
|
// Skip over any generate and begin scopes until we find
|
||||||
// the module that contains them - this is where we will
|
// the module that contains them - this is where we will
|
||||||
// generate the process
|
// generate the process
|
||||||
while (ivl_scope_type(scope) == IVL_SCT_GENERATE
|
while (ivl_scope_type(scope) == IVL_SCT_GENERATE
|
||||||
|| ivl_scope_type(scope) == IVL_SCT_BEGIN)
|
|| ivl_scope_type(scope) == IVL_SCT_BEGIN)
|
||||||
scope = ivl_scope_parent(scope);
|
scope = ivl_scope_parent(scope);
|
||||||
|
|
||||||
assert(ivl_scope_type(scope) == IVL_SCT_MODULE);
|
assert(ivl_scope_type(scope) == IVL_SCT_MODULE);
|
||||||
vhdl_entity *ent = find_entity(scope);
|
vhdl_entity *ent = find_entity(scope);
|
||||||
assert(ent != NULL);
|
assert(ent != NULL);
|
||||||
|
|
||||||
return generate_vhdl_process(ent, proc);
|
return generate_vhdl_process(ent, proc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ struct scope_nexus_t {
|
||||||
string tmpname; // A new temporary signal
|
string tmpname; // A new temporary signal
|
||||||
list<ivl_signal_t> connect; // Other signals to wire together
|
list<ivl_signal_t> connect; // Other signals to wire together
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This structure is stored in the private part of each nexus.
|
* This structure is stored in the private part of each nexus.
|
||||||
* It stores a scope_nexus_t for each VHDL scope which is
|
* It stores a scope_nexus_t for each VHDL scope which is
|
||||||
|
|
@ -76,11 +76,11 @@ static scope_nexus_t *visible_nexus(nexus_private_t *priv, vhdl_scope *scope)
|
||||||
*/
|
*/
|
||||||
static void link_scope_to_nexus_signal(nexus_private_t *priv, vhdl_scope *scope,
|
static void link_scope_to_nexus_signal(nexus_private_t *priv, vhdl_scope *scope,
|
||||||
ivl_signal_t sig, unsigned pin)
|
ivl_signal_t sig, unsigned pin)
|
||||||
{
|
{
|
||||||
scope_nexus_t *sn;
|
scope_nexus_t *sn;
|
||||||
if ((sn = visible_nexus(priv, scope))) {
|
if ((sn = visible_nexus(priv, scope))) {
|
||||||
assert(sn->tmpname == "");
|
assert(sn->tmpname == "");
|
||||||
|
|
||||||
// Remember to connect this signal up later
|
// Remember to connect this signal up later
|
||||||
// If one of the signals is a input, make sure the input is not being driven
|
// If one of the signals is a input, make sure the input is not being driven
|
||||||
if (ivl_signal_port(sn->sig) == IVL_SIP_INPUT)
|
if (ivl_signal_port(sn->sig) == IVL_SIP_INPUT)
|
||||||
|
|
@ -126,16 +126,16 @@ static ivl_signal_type_t signal_type_of_nexus(ivl_nexus_t nex, int &width)
|
||||||
{
|
{
|
||||||
ivl_signal_type_t out = IVL_SIT_TRI;
|
ivl_signal_type_t out = IVL_SIT_TRI;
|
||||||
width = 0;
|
width = 0;
|
||||||
|
|
||||||
for (unsigned idx = 0; idx < ivl_nexus_ptrs(nex); idx += 1) {
|
for (unsigned idx = 0; idx < ivl_nexus_ptrs(nex); idx += 1) {
|
||||||
ivl_signal_type_t stype;
|
ivl_signal_type_t stype;
|
||||||
ivl_nexus_ptr_t ptr = ivl_nexus_ptr(nex, idx);
|
ivl_nexus_ptr_t ptr = ivl_nexus_ptr(nex, idx);
|
||||||
ivl_signal_t sig = ivl_nexus_ptr_sig(ptr);
|
ivl_signal_t sig = ivl_nexus_ptr_sig(ptr);
|
||||||
if (sig == 0)
|
if (sig == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
width = ivl_signal_width(sig);
|
width = ivl_signal_width(sig);
|
||||||
|
|
||||||
stype = ivl_signal_type(sig);
|
stype = ivl_signal_type(sig);
|
||||||
if (stype == IVL_SIT_TRI)
|
if (stype == IVL_SIT_TRI)
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -143,7 +143,7 @@ static ivl_signal_type_t signal_type_of_nexus(ivl_nexus_t nex, int &width)
|
||||||
continue;
|
continue;
|
||||||
out = stype;
|
out = stype;
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -151,11 +151,11 @@ static ivl_signal_type_t signal_type_of_nexus(ivl_nexus_t nex, int &width)
|
||||||
* Generates VHDL code to fully represent a nexus.
|
* Generates VHDL code to fully represent a nexus.
|
||||||
*/
|
*/
|
||||||
void draw_nexus(ivl_nexus_t nexus)
|
void draw_nexus(ivl_nexus_t nexus)
|
||||||
{
|
{
|
||||||
nexus_private_t *priv = new nexus_private_t;
|
nexus_private_t *priv = new nexus_private_t;
|
||||||
int nexus_signal_width = -1;
|
int nexus_signal_width = -1;
|
||||||
priv->const_driver = NULL;
|
priv->const_driver = NULL;
|
||||||
|
|
||||||
int nptrs = ivl_nexus_ptrs(nexus);
|
int nptrs = ivl_nexus_ptrs(nexus);
|
||||||
|
|
||||||
// Number of drivers for this nexus
|
// Number of drivers for this nexus
|
||||||
|
|
@ -164,9 +164,9 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
// First pass through connect all the signals up
|
// First pass through connect all the signals up
|
||||||
for (int i = 0; i < nptrs; i++) {
|
for (int i = 0; i < nptrs; i++) {
|
||||||
ivl_nexus_ptr_t nexus_ptr = ivl_nexus_ptr(nexus, i);
|
ivl_nexus_ptr_t nexus_ptr = ivl_nexus_ptr(nexus, i);
|
||||||
|
|
||||||
ivl_signal_t sig;
|
ivl_signal_t sig;
|
||||||
if ((sig = ivl_nexus_ptr_sig(nexus_ptr))) {
|
if ((sig = ivl_nexus_ptr_sig(nexus_ptr))) {
|
||||||
vhdl_scope *scope = find_scope_for_signal(sig);
|
vhdl_scope *scope = find_scope_for_signal(sig);
|
||||||
if (scope) {
|
if (scope) {
|
||||||
unsigned pin = ivl_nexus_ptr_pin(nexus_ptr);
|
unsigned pin = ivl_nexus_ptr_pin(nexus_ptr);
|
||||||
|
|
@ -181,7 +181,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
// inputs and outputs
|
// inputs and outputs
|
||||||
for (int i = 0; i < nptrs; i++) {
|
for (int i = 0; i < nptrs; i++) {
|
||||||
ivl_nexus_ptr_t nexus_ptr = ivl_nexus_ptr(nexus, i);
|
ivl_nexus_ptr_t nexus_ptr = ivl_nexus_ptr(nexus, i);
|
||||||
|
|
||||||
ivl_net_logic_t log;
|
ivl_net_logic_t log;
|
||||||
ivl_lpm_t lpm;
|
ivl_lpm_t lpm;
|
||||||
ivl_net_const_t con;
|
ivl_net_const_t con;
|
||||||
|
|
@ -189,10 +189,10 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
ivl_scope_t log_scope = ivl_logic_scope(log);
|
ivl_scope_t log_scope = ivl_logic_scope(log);
|
||||||
if (!is_default_scope_instance(log_scope))
|
if (!is_default_scope_instance(log_scope))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
vhdl_entity *ent = find_entity(log_scope);
|
vhdl_entity *ent = find_entity(log_scope);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
||||||
vhdl_scope *vhdl_scope = ent->get_arch()->get_scope();
|
vhdl_scope *vhdl_scope = ent->get_arch()->get_scope();
|
||||||
if (visible_nexus(priv, vhdl_scope)) {
|
if (visible_nexus(priv, vhdl_scope)) {
|
||||||
// Already seen this signal in vhdl_scope
|
// Already seen this signal in vhdl_scope
|
||||||
|
|
@ -201,7 +201,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
// Create a temporary signal to connect it to the nexus
|
// Create a temporary signal to connect it to the nexus
|
||||||
vhdl_type *type =
|
vhdl_type *type =
|
||||||
vhdl_type::type_for(ivl_logic_width(log), false);
|
vhdl_type::type_for(ivl_logic_width(log), false);
|
||||||
|
|
||||||
ostringstream ss;
|
ostringstream ss;
|
||||||
ss << "LO" << ivl_logic_basename(log);
|
ss << "LO" << ivl_logic_basename(log);
|
||||||
vhdl_scope->add_decl(new vhdl_signal_decl(ss.str().c_str(), type));
|
vhdl_scope->add_decl(new vhdl_signal_decl(ss.str().c_str(), type));
|
||||||
|
|
@ -218,7 +218,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
ivl_scope_t lpm_scope = ivl_lpm_scope(lpm);
|
ivl_scope_t lpm_scope = ivl_lpm_scope(lpm);
|
||||||
vhdl_entity *ent = find_entity(lpm_scope);
|
vhdl_entity *ent = find_entity(lpm_scope);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
||||||
vhdl_scope *vhdl_scope = ent->get_arch()->get_scope();
|
vhdl_scope *vhdl_scope = ent->get_arch()->get_scope();
|
||||||
if (visible_nexus(priv, vhdl_scope)) {
|
if (visible_nexus(priv, vhdl_scope)) {
|
||||||
// Already seen this signal in vhdl_scope
|
// Already seen this signal in vhdl_scope
|
||||||
|
|
@ -235,7 +235,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
lpm_temp_width = nexus_signal_width;
|
lpm_temp_width = nexus_signal_width;
|
||||||
else
|
else
|
||||||
lpm_temp_width = ivl_lpm_width(lpm);
|
lpm_temp_width = ivl_lpm_width(lpm);
|
||||||
|
|
||||||
vhdl_type *type = vhdl_type::type_for(lpm_temp_width,
|
vhdl_type *type = vhdl_type::type_for(lpm_temp_width,
|
||||||
ivl_lpm_signed(lpm) != 0);
|
ivl_lpm_signed(lpm) != 0);
|
||||||
ostringstream ss;
|
ostringstream ss;
|
||||||
|
|
@ -243,7 +243,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
|
|
||||||
if (!vhdl_scope->have_declared(ss.str()))
|
if (!vhdl_scope->have_declared(ss.str()))
|
||||||
vhdl_scope->add_decl(new vhdl_signal_decl(ss.str().c_str(), type));
|
vhdl_scope->add_decl(new vhdl_signal_decl(ss.str().c_str(), type));
|
||||||
|
|
||||||
link_scope_to_nexus_tmp(priv, vhdl_scope, ss.str());
|
link_scope_to_nexus_tmp(priv, vhdl_scope, ss.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -274,7 +274,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
if (ndrivers == 0) {
|
if (ndrivers == 0) {
|
||||||
char def = 0;
|
char def = 0;
|
||||||
int width;
|
int width;
|
||||||
|
|
||||||
switch (signal_type_of_nexus(nexus, width)) {
|
switch (signal_type_of_nexus(nexus, width)) {
|
||||||
case IVL_SIT_TRI:
|
case IVL_SIT_TRI:
|
||||||
case IVL_SIT_UWIRE:
|
case IVL_SIT_UWIRE:
|
||||||
|
|
@ -305,7 +305,7 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
priv->const_driver = new vhdl_const_bit(def);
|
priv->const_driver = new vhdl_const_bit(def);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the private data in the nexus
|
// Save the private data in the nexus
|
||||||
ivl_nexus_set_private(nexus, priv);
|
ivl_nexus_set_private(nexus, priv);
|
||||||
}
|
}
|
||||||
|
|
@ -316,10 +316,10 @@ void draw_nexus(ivl_nexus_t nexus)
|
||||||
*/
|
*/
|
||||||
static void seen_nexus(ivl_nexus_t nexus)
|
static void seen_nexus(ivl_nexus_t nexus)
|
||||||
{
|
{
|
||||||
if (ivl_nexus_get_private(nexus) == NULL)
|
if (ivl_nexus_get_private(nexus) == NULL)
|
||||||
draw_nexus(nexus);
|
draw_nexus(nexus);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Translate a nexus to a variable reference. Given a nexus and a
|
* Translate a nexus to a variable reference. Given a nexus and a
|
||||||
* scope, this function returns a reference to a signal that is
|
* scope, this function returns a reference to a signal that is
|
||||||
|
|
@ -332,18 +332,18 @@ static void seen_nexus(ivl_nexus_t nexus)
|
||||||
vhdl_var_ref *nexus_to_var_ref(vhdl_scope *scope, ivl_nexus_t nexus)
|
vhdl_var_ref *nexus_to_var_ref(vhdl_scope *scope, ivl_nexus_t nexus)
|
||||||
{
|
{
|
||||||
seen_nexus(nexus);
|
seen_nexus(nexus);
|
||||||
|
|
||||||
nexus_private_t *priv =
|
nexus_private_t *priv =
|
||||||
static_cast<nexus_private_t*>(ivl_nexus_get_private(nexus));
|
static_cast<nexus_private_t*>(ivl_nexus_get_private(nexus));
|
||||||
unsigned pin;
|
unsigned pin;
|
||||||
string renamed(visible_nexus_signal_name(priv, scope, &pin));
|
string renamed(visible_nexus_signal_name(priv, scope, &pin));
|
||||||
|
|
||||||
vhdl_decl *decl = scope->get_decl(renamed);
|
vhdl_decl *decl = scope->get_decl(renamed);
|
||||||
assert(decl);
|
assert(decl);
|
||||||
|
|
||||||
vhdl_type *type = new vhdl_type(*(decl->get_type()));
|
vhdl_type *type = new vhdl_type(*(decl->get_type()));
|
||||||
vhdl_var_ref *ref = new vhdl_var_ref(renamed.c_str(), type);
|
vhdl_var_ref *ref = new vhdl_var_ref(renamed.c_str(), type);
|
||||||
|
|
||||||
if (decl->get_type()->get_name() == VHDL_TYPE_ARRAY)
|
if (decl->get_type()->get_name() == VHDL_TYPE_ARRAY)
|
||||||
ref->set_slice(new vhdl_const_int(pin), 0);
|
ref->set_slice(new vhdl_const_int(pin), 0);
|
||||||
|
|
||||||
|
|
@ -355,7 +355,7 @@ vhdl_var_ref *nexus_to_var_ref(vhdl_scope *scope, ivl_nexus_t nexus)
|
||||||
vhdl_var_ref* readable_ref(vhdl_scope* scope, ivl_nexus_t nex)
|
vhdl_var_ref* readable_ref(vhdl_scope* scope, ivl_nexus_t nex)
|
||||||
{
|
{
|
||||||
vhdl_var_ref* ref = nexus_to_var_ref(scope, nex);
|
vhdl_var_ref* ref = nexus_to_var_ref(scope, nex);
|
||||||
|
|
||||||
vhdl_decl* decl = scope->get_decl(ref->get_name());
|
vhdl_decl* decl = scope->get_decl(ref->get_name());
|
||||||
decl->ensure_readable();
|
decl->ensure_readable();
|
||||||
|
|
||||||
|
|
@ -369,10 +369,10 @@ vhdl_var_ref* readable_ref(vhdl_scope* scope, ivl_nexus_t nex)
|
||||||
static void declare_logic(vhdl_arch *arch, ivl_scope_t scope)
|
static void declare_logic(vhdl_arch *arch, ivl_scope_t scope)
|
||||||
{
|
{
|
||||||
debug_msg("Declaring logic in scope type %s", ivl_scope_tname(scope));
|
debug_msg("Declaring logic in scope type %s", ivl_scope_tname(scope));
|
||||||
|
|
||||||
int nlogs = ivl_scope_logs(scope);
|
int nlogs = ivl_scope_logs(scope);
|
||||||
for (int i = 0; i < nlogs; i++)
|
for (int i = 0; i < nlogs; i++)
|
||||||
draw_logic(arch, ivl_scope_log(scope, i));
|
draw_logic(arch, ivl_scope_log(scope, i));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replace consecutive underscores with a single underscore
|
// Replace consecutive underscores with a single underscore
|
||||||
|
|
@ -422,7 +422,7 @@ static string valid_entity_name(const string& module_name)
|
||||||
name = "module" + name;
|
name = "module" + name;
|
||||||
if (*name.rbegin() == '_')
|
if (*name.rbegin() == '_')
|
||||||
name += "module";
|
name += "module";
|
||||||
|
|
||||||
if (is_vhdl_reserved_word(name))
|
if (is_vhdl_reserved_word(name))
|
||||||
name += "_module";
|
name += "_module";
|
||||||
|
|
||||||
|
|
@ -434,7 +434,7 @@ static string valid_entity_name(const string& module_name)
|
||||||
ss.str("");
|
ss.str("");
|
||||||
ss << name << i++;
|
ss << name << i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -445,7 +445,7 @@ string make_safe_name(ivl_signal_t sig)
|
||||||
|
|
||||||
if (ivl_signal_local(sig))
|
if (ivl_signal_local(sig))
|
||||||
base = "tmp" + base;
|
base = "tmp" + base;
|
||||||
|
|
||||||
if (base[0] == '_')
|
if (base[0] == '_')
|
||||||
base = "sig" + base;
|
base = "sig" + base;
|
||||||
|
|
||||||
|
|
@ -454,14 +454,14 @@ string make_safe_name(ivl_signal_t sig)
|
||||||
|
|
||||||
// Can't have two consecutive underscores
|
// Can't have two consecutive underscores
|
||||||
replace_consecutive_underscores(base);
|
replace_consecutive_underscores(base);
|
||||||
|
|
||||||
// A signal name may not be the same as a component name
|
// A signal name may not be the same as a component name
|
||||||
if (find_entity(base) != NULL)
|
if (find_entity(base) != NULL)
|
||||||
base += "_sig";
|
base += "_sig";
|
||||||
|
|
||||||
if (is_vhdl_reserved_word(base))
|
if (is_vhdl_reserved_word(base))
|
||||||
base += "_sig";
|
base += "_sig";
|
||||||
|
|
||||||
return base;
|
return base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -478,7 +478,7 @@ static void avoid_name_collision(string& name, vhdl_scope* scope)
|
||||||
ss.str("");
|
ss.str("");
|
||||||
ss << name << i++;
|
ss << name << i++;
|
||||||
} while (scope->name_collides(ss.str()));
|
} while (scope->name_collides(ss.str()));
|
||||||
|
|
||||||
name = ss.str();
|
name = ss.str();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -495,24 +495,24 @@ static string genvar_unique_suffix(ivl_scope_t scope)
|
||||||
for (unsigned i = 0; i < ivl_scope_params(scope); i++) {
|
for (unsigned i = 0; i < ivl_scope_params(scope); i++) {
|
||||||
ivl_parameter_t param = ivl_scope_param(scope, i);
|
ivl_parameter_t param = ivl_scope_param(scope, i);
|
||||||
ivl_expr_t e = ivl_parameter_expr(param);
|
ivl_expr_t e = ivl_parameter_expr(param);
|
||||||
|
|
||||||
if (ivl_expr_type(e) == IVL_EX_NUMBER) {
|
if (ivl_expr_type(e) == IVL_EX_NUMBER) {
|
||||||
vhdl_expr* value = translate_expr(e);
|
vhdl_expr* value = translate_expr(e);
|
||||||
assert(value);
|
assert(value);
|
||||||
|
|
||||||
value = value->cast(vhdl_type::integer());
|
value = value->cast(vhdl_type::integer());
|
||||||
|
|
||||||
suffix << "_" << ivl_parameter_basename(param);
|
suffix << "_" << ivl_parameter_basename(param);
|
||||||
value->emit(suffix, 0);
|
value->emit(suffix, 0);
|
||||||
|
|
||||||
delete value;
|
delete value;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
error("Only numeric genvars supported at the moment");
|
error("Only numeric genvars supported at the moment");
|
||||||
return "_ERROR"; // Never used
|
return "_ERROR"; // Never used
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
scope = ivl_scope_parent(scope);
|
scope = ivl_scope_parent(scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -528,33 +528,33 @@ static void declare_one_signal(vhdl_entity *ent, ivl_signal_t sig,
|
||||||
string name(make_safe_name(sig));
|
string name(make_safe_name(sig));
|
||||||
name += genvar_unique_suffix(scope);
|
name += genvar_unique_suffix(scope);
|
||||||
avoid_name_collision(name, ent->get_arch()->get_scope());
|
avoid_name_collision(name, ent->get_arch()->get_scope());
|
||||||
|
|
||||||
rename_signal(sig, name);
|
rename_signal(sig, name);
|
||||||
|
|
||||||
vhdl_type *sig_type;
|
vhdl_type *sig_type;
|
||||||
unsigned dimensions = ivl_signal_dimensions(sig);
|
unsigned dimensions = ivl_signal_dimensions(sig);
|
||||||
if (dimensions > 0) {
|
if (dimensions > 0) {
|
||||||
// Arrays are implemented by generating a separate type
|
// Arrays are implemented by generating a separate type
|
||||||
// declaration for each array, and then declaring a
|
// declaration for each array, and then declaring a
|
||||||
// signal of that type
|
// signal of that type
|
||||||
|
|
||||||
if (dimensions > 1) {
|
if (dimensions > 1) {
|
||||||
error("> 1 dimension arrays not implemented yet");
|
error("> 1 dimension arrays not implemented yet");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string type_name = name + "_Type";
|
string type_name = name + "_Type";
|
||||||
vhdl_type *base_type =
|
vhdl_type *base_type =
|
||||||
vhdl_type::type_for(ivl_signal_width(sig), ivl_signal_signed(sig) != 0);
|
vhdl_type::type_for(ivl_signal_width(sig), ivl_signal_signed(sig) != 0);
|
||||||
|
|
||||||
int lsb = ivl_signal_array_base(sig);
|
int lsb = ivl_signal_array_base(sig);
|
||||||
int msb = lsb + ivl_signal_array_count(sig) - 1;
|
int msb = lsb + ivl_signal_array_count(sig) - 1;
|
||||||
|
|
||||||
vhdl_type *array_type =
|
vhdl_type *array_type =
|
||||||
vhdl_type::array_of(base_type, type_name, msb, lsb);
|
vhdl_type::array_of(base_type, type_name, msb, lsb);
|
||||||
vhdl_decl *array_decl = new vhdl_type_decl(type_name.c_str(), array_type);
|
vhdl_decl *array_decl = new vhdl_type_decl(type_name.c_str(), array_type);
|
||||||
ent->get_arch()->get_scope()->add_decl(array_decl);
|
ent->get_arch()->get_scope()->add_decl(array_decl);
|
||||||
|
|
||||||
sig_type = new vhdl_type(*array_type);
|
sig_type = new vhdl_type(*array_type);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -562,15 +562,15 @@ static void declare_one_signal(vhdl_entity *ent, ivl_signal_t sig,
|
||||||
ivl_signal_signed(sig) != 0,
|
ivl_signal_signed(sig) != 0,
|
||||||
0, ivl_signal_type(sig) == IVL_SIT_UWIRE);
|
0, ivl_signal_type(sig) == IVL_SIT_UWIRE);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ivl_signal_port_t mode = ivl_signal_port(sig);
|
ivl_signal_port_t mode = ivl_signal_port(sig);
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case IVL_SIP_NONE:
|
case IVL_SIP_NONE:
|
||||||
{
|
{
|
||||||
vhdl_decl *decl = new vhdl_signal_decl(name.c_str(), sig_type);
|
vhdl_decl *decl = new vhdl_signal_decl(name.c_str(), sig_type);
|
||||||
|
|
||||||
ostringstream ss;
|
ostringstream ss;
|
||||||
if (ivl_signal_local(sig)) {
|
if (ivl_signal_local(sig)) {
|
||||||
ss << "Temporary created at " << ivl_signal_file(sig) << ":"
|
ss << "Temporary created at " << ivl_signal_file(sig) << ":"
|
||||||
|
|
@ -580,7 +580,7 @@ static void declare_one_signal(vhdl_entity *ent, ivl_signal_t sig,
|
||||||
<< ivl_signal_lineno(sig);
|
<< ivl_signal_lineno(sig);
|
||||||
}
|
}
|
||||||
decl->set_comment(ss.str().c_str());
|
decl->set_comment(ss.str().c_str());
|
||||||
|
|
||||||
ent->get_arch()->get_scope()->add_decl(decl);
|
ent->get_arch()->get_scope()->add_decl(decl);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -591,10 +591,10 @@ static void declare_one_signal(vhdl_entity *ent, ivl_signal_t sig,
|
||||||
case IVL_SIP_OUTPUT:
|
case IVL_SIP_OUTPUT:
|
||||||
{
|
{
|
||||||
vhdl_port_decl *decl =
|
vhdl_port_decl *decl =
|
||||||
new vhdl_port_decl(name.c_str(), sig_type, VHDL_PORT_OUT);
|
new vhdl_port_decl(name.c_str(), sig_type, VHDL_PORT_OUT);
|
||||||
ent->get_scope()->add_decl(decl);
|
ent->get_scope()->add_decl(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ivl_signal_type(sig) == IVL_SIT_REG) {
|
if (ivl_signal_type(sig) == IVL_SIT_REG) {
|
||||||
// A registered output
|
// A registered output
|
||||||
// In Verilog the output and reg can have the
|
// In Verilog the output and reg can have the
|
||||||
|
|
@ -604,11 +604,11 @@ static void declare_one_signal(vhdl_entity *ent, ivl_signal_t sig,
|
||||||
std::string newname(name);
|
std::string newname(name);
|
||||||
newname += "_Reg";
|
newname += "_Reg";
|
||||||
rename_signal(sig, newname.c_str());
|
rename_signal(sig, newname.c_str());
|
||||||
|
|
||||||
vhdl_type *reg_type = new vhdl_type(*sig_type);
|
vhdl_type *reg_type = new vhdl_type(*sig_type);
|
||||||
ent->get_arch()->get_scope()->add_decl
|
ent->get_arch()->get_scope()->add_decl
|
||||||
(new vhdl_signal_decl(newname.c_str(), reg_type));
|
(new vhdl_signal_decl(newname.c_str(), reg_type));
|
||||||
|
|
||||||
// Create a concurrent assignment statement to
|
// Create a concurrent assignment statement to
|
||||||
// connect the register to the output
|
// connect the register to the output
|
||||||
ent->get_arch()->add_stmt
|
ent->get_arch()->add_stmt
|
||||||
|
|
@ -633,17 +633,17 @@ static void declare_one_signal(vhdl_entity *ent, ivl_signal_t sig,
|
||||||
static void declare_signals(vhdl_entity *ent, ivl_scope_t scope)
|
static void declare_signals(vhdl_entity *ent, ivl_scope_t scope)
|
||||||
{
|
{
|
||||||
debug_msg("Declaring signals in scope type %s", ivl_scope_tname(scope));
|
debug_msg("Declaring signals in scope type %s", ivl_scope_tname(scope));
|
||||||
|
|
||||||
int nsigs = ivl_scope_sigs(scope);
|
int nsigs = ivl_scope_sigs(scope);
|
||||||
for (int i = 0; i < nsigs; i++) {
|
for (int i = 0; i < nsigs; i++) {
|
||||||
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
||||||
|
|
||||||
if (ivl_signal_port(sig) != IVL_SIP_NONE)
|
if (ivl_signal_port(sig) != IVL_SIP_NONE)
|
||||||
declare_one_signal(ent, sig, scope);
|
declare_one_signal(ent, sig, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < nsigs; i++) {
|
for (int i = 0; i < nsigs; i++) {
|
||||||
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
||||||
|
|
||||||
if (ivl_signal_port(sig) == IVL_SIP_NONE)
|
if (ivl_signal_port(sig) == IVL_SIP_NONE)
|
||||||
declare_one_signal(ent, sig, scope);
|
declare_one_signal(ent, sig, scope);
|
||||||
|
|
@ -669,7 +669,7 @@ static void declare_lpm(vhdl_arch *arch, ivl_scope_t scope)
|
||||||
*/
|
*/
|
||||||
static void map_signal(ivl_signal_t to, vhdl_entity *parent,
|
static void map_signal(ivl_signal_t to, vhdl_entity *parent,
|
||||||
vhdl_comp_inst *inst)
|
vhdl_comp_inst *inst)
|
||||||
{
|
{
|
||||||
// TODO: Work for multiple words
|
// TODO: Work for multiple words
|
||||||
ivl_nexus_t nexus = ivl_signal_nex(to, 0);
|
ivl_nexus_t nexus = ivl_signal_nex(to, 0);
|
||||||
seen_nexus(nexus);
|
seen_nexus(nexus);
|
||||||
|
|
@ -699,14 +699,14 @@ static void map_signal(ivl_signal_t to, vhdl_entity *parent,
|
||||||
&& !arch_scope->have_declared(name + "_Readable")) {
|
&& !arch_scope->have_declared(name + "_Readable")) {
|
||||||
vhdl_decl* tmp_decl =
|
vhdl_decl* tmp_decl =
|
||||||
new vhdl_signal_decl(name + "_Readable", ref->get_type());
|
new vhdl_signal_decl(name + "_Readable", ref->get_type());
|
||||||
|
|
||||||
// Add a comment to explain what this is for
|
// Add a comment to explain what this is for
|
||||||
tmp_decl->set_comment("Needed to connect outputs");
|
tmp_decl->set_comment("Needed to connect outputs");
|
||||||
|
|
||||||
arch_scope->add_decl(tmp_decl);
|
arch_scope->add_decl(tmp_decl);
|
||||||
parent->get_arch()->add_stmt
|
parent->get_arch()->add_stmt
|
||||||
(new vhdl_cassign_stmt(from_decl->make_ref(), tmp_decl->make_ref()));
|
(new vhdl_cassign_stmt(from_decl->make_ref(), tmp_decl->make_ref()));
|
||||||
|
|
||||||
map_to = tmp_decl->make_ref();
|
map_to = tmp_decl->make_ref();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -719,7 +719,7 @@ static void map_signal(ivl_signal_t to, vhdl_entity *parent,
|
||||||
else {
|
else {
|
||||||
// This nexus isn't attached to anything in the parent
|
// This nexus isn't attached to anything in the parent
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
inst->map_port(name, map_to);
|
inst->map_port(name, map_to);
|
||||||
}
|
}
|
||||||
|
|
@ -734,7 +734,7 @@ static void port_map(ivl_scope_t scope, vhdl_entity *parent,
|
||||||
int nsigs = ivl_scope_sigs(scope);
|
int nsigs = ivl_scope_sigs(scope);
|
||||||
for (int i = 0; i < nsigs; i++) {
|
for (int i = 0; i < nsigs; i++) {
|
||||||
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
||||||
|
|
||||||
ivl_signal_port_t mode = ivl_signal_port(sig);
|
ivl_signal_port_t mode = ivl_signal_port(sig);
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case IVL_SIP_NONE:
|
case IVL_SIP_NONE:
|
||||||
|
|
@ -744,10 +744,10 @@ static void port_map(ivl_scope_t scope, vhdl_entity *parent,
|
||||||
case IVL_SIP_OUTPUT:
|
case IVL_SIP_OUTPUT:
|
||||||
case IVL_SIP_INOUT:
|
case IVL_SIP_INOUT:
|
||||||
map_signal(sig, parent, inst);
|
map_signal(sig, parent, inst);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -788,9 +788,9 @@ static int draw_function(ivl_scope_t scope, ivl_scope_t parent)
|
||||||
vhdl_type *sigtype =
|
vhdl_type *sigtype =
|
||||||
vhdl_type::type_for(ivl_signal_width(sig),
|
vhdl_type::type_for(ivl_signal_width(sig),
|
||||||
ivl_signal_signed(sig) != 0);
|
ivl_signal_signed(sig) != 0);
|
||||||
|
|
||||||
string signame(make_safe_name(sig));
|
string signame(make_safe_name(sig));
|
||||||
|
|
||||||
switch (ivl_signal_port(sig)) {
|
switch (ivl_signal_port(sig)) {
|
||||||
case IVL_SIP_INPUT:
|
case IVL_SIP_INPUT:
|
||||||
func->add_param(new vhdl_param_decl(signame.c_str(), sigtype));
|
func->add_param(new vhdl_param_decl(signame.c_str(), sigtype));
|
||||||
|
|
@ -807,30 +807,30 @@ static int draw_function(ivl_scope_t scope, ivl_scope_t parent)
|
||||||
// Only expecting inputs and outputs
|
// Only expecting inputs and outputs
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
remember_signal(sig, func->get_scope());
|
remember_signal(sig, func->get_scope());
|
||||||
rename_signal(sig, signame);
|
rename_signal(sig, signame);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nsigs = ivl_scope_sigs(scope);
|
int nsigs = ivl_scope_sigs(scope);
|
||||||
for (int i = 0; i < nsigs; i++) {
|
for (int i = 0; i < nsigs; i++) {
|
||||||
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
||||||
|
|
||||||
if (ivl_signal_port(sig) == IVL_SIP_NONE) {
|
if (ivl_signal_port(sig) == IVL_SIP_NONE) {
|
||||||
vhdl_type *sigtype =
|
vhdl_type *sigtype =
|
||||||
vhdl_type::type_for(
|
vhdl_type::type_for(
|
||||||
ivl_signal_width(sig),
|
ivl_signal_width(sig),
|
||||||
ivl_signal_signed(sig) != 0);
|
ivl_signal_signed(sig) != 0);
|
||||||
|
|
||||||
string signame(make_safe_name(sig));
|
string signame(make_safe_name(sig));
|
||||||
func->get_scope()->add_decl(
|
func->get_scope()->add_decl(
|
||||||
new vhdl_var_decl(signame, sigtype));
|
new vhdl_var_decl(signame, sigtype));
|
||||||
|
|
||||||
remember_signal(sig, func->get_scope());
|
remember_signal(sig, func->get_scope());
|
||||||
rename_signal(sig, signame);
|
rename_signal(sig, signame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Non-blocking assignment not allowed in functions
|
// Non-blocking assignment not allowed in functions
|
||||||
func->get_scope()->set_allow_signal_assignment(false);
|
func->get_scope()->set_allow_signal_assignment(false);
|
||||||
|
|
||||||
|
|
@ -849,8 +849,8 @@ static int draw_function(ivl_scope_t scope, ivl_scope_t parent)
|
||||||
ss << "Generated from function " << funcname << " at "
|
ss << "Generated from function " << funcname << " at "
|
||||||
<< ivl_scope_def_file(scope) << ":" << ivl_scope_def_lineno(scope);
|
<< ivl_scope_def_file(scope) << ":" << ivl_scope_def_lineno(scope);
|
||||||
func->set_comment(ss.str().c_str());
|
func->set_comment(ss.str().c_str());
|
||||||
|
|
||||||
ent->get_arch()->get_scope()->add_decl(func);
|
ent->get_arch()->get_scope()->add_decl(func);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -867,14 +867,14 @@ static int draw_task(ivl_scope_t scope, ivl_scope_t parent)
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
||||||
const char *taskname = ivl_scope_tname(scope);
|
const char *taskname = ivl_scope_tname(scope);
|
||||||
|
|
||||||
int nsigs = ivl_scope_sigs(scope);
|
int nsigs = ivl_scope_sigs(scope);
|
||||||
for (int i = 0; i < nsigs; i++) {
|
for (int i = 0; i < nsigs; i++) {
|
||||||
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
||||||
vhdl_type *sigtype =
|
vhdl_type *sigtype =
|
||||||
vhdl_type::type_for(ivl_signal_width(sig),
|
vhdl_type::type_for(ivl_signal_width(sig),
|
||||||
ivl_signal_signed(sig) != 0);
|
ivl_signal_signed(sig) != 0);
|
||||||
|
|
||||||
string signame(make_safe_name(sig));
|
string signame(make_safe_name(sig));
|
||||||
|
|
||||||
// Check this signal isn't declared in the outer scope
|
// Check this signal isn't declared in the outer scope
|
||||||
|
|
@ -889,13 +889,13 @@ static int draw_task(ivl_scope_t scope, ivl_scope_t parent)
|
||||||
ss << "Declared at " << ivl_signal_file(sig) << ":"
|
ss << "Declared at " << ivl_signal_file(sig) << ":"
|
||||||
<< ivl_signal_lineno(sig) << " (in task " << taskname << ")";
|
<< ivl_signal_lineno(sig) << " (in task " << taskname << ")";
|
||||||
decl->set_comment(ss.str().c_str());
|
decl->set_comment(ss.str().c_str());
|
||||||
|
|
||||||
ent->get_arch()->get_scope()->add_decl(decl);
|
ent->get_arch()->get_scope()->add_decl(decl);
|
||||||
|
|
||||||
remember_signal(sig, ent->get_arch()->get_scope());
|
remember_signal(sig, ent->get_arch()->get_scope());
|
||||||
rename_signal(sig, signame);
|
rename_signal(sig, signame);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -908,7 +908,7 @@ static void create_skeleton_entity_for(ivl_scope_t scope, int depth)
|
||||||
|
|
||||||
// The type name will become the entity name
|
// The type name will become the entity name
|
||||||
const string tname = valid_entity_name(ivl_scope_tname(scope));
|
const string tname = valid_entity_name(ivl_scope_tname(scope));
|
||||||
|
|
||||||
// Verilog does not have the entity/architecture distinction
|
// Verilog does not have the entity/architecture distinction
|
||||||
// so we always create a pair and associate the architecture
|
// so we always create a pair and associate the architecture
|
||||||
// with the entity for convenience (this also means that we
|
// with the entity for convenience (this also means that we
|
||||||
|
|
@ -925,10 +925,10 @@ static void create_skeleton_entity_for(ivl_scope_t scope, int depth)
|
||||||
ss << "Generated from Verilog module " << ivl_scope_tname(scope)
|
ss << "Generated from Verilog module " << ivl_scope_tname(scope)
|
||||||
<< " (" << ivl_scope_def_file(scope) << ":"
|
<< " (" << ivl_scope_def_file(scope) << ":"
|
||||||
<< ivl_scope_def_lineno(scope) << ")";
|
<< ivl_scope_def_lineno(scope) << ")";
|
||||||
|
|
||||||
arch->set_comment(ss.str());
|
arch->set_comment(ss.str());
|
||||||
ent->set_comment(ss.str());
|
ent->set_comment(ss.str());
|
||||||
|
|
||||||
remember_entity(ent, scope);
|
remember_entity(ent, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -939,13 +939,13 @@ static void create_skeleton_entity_for(ivl_scope_t scope, int depth)
|
||||||
extern "C" int draw_skeleton_scope(ivl_scope_t scope, void *_unused)
|
extern "C" int draw_skeleton_scope(ivl_scope_t scope, void *_unused)
|
||||||
{
|
{
|
||||||
static int depth = 0;
|
static int depth = 0;
|
||||||
|
|
||||||
if (seen_this_scope_type(scope))
|
if (seen_this_scope_type(scope))
|
||||||
return 0; // Already generated a skeleton for this scope type
|
return 0; // Already generated a skeleton for this scope type
|
||||||
|
|
||||||
debug_msg("Initial visit to scope type %s at depth %d",
|
debug_msg("Initial visit to scope type %s at depth %d",
|
||||||
ivl_scope_tname(scope), depth);
|
ivl_scope_tname(scope), depth);
|
||||||
|
|
||||||
switch (ivl_scope_type(scope)) {
|
switch (ivl_scope_type(scope)) {
|
||||||
case IVL_SCT_MODULE:
|
case IVL_SCT_MODULE:
|
||||||
create_skeleton_entity_for(scope, depth);
|
create_skeleton_entity_for(scope, depth);
|
||||||
|
|
@ -968,7 +968,7 @@ extern "C" int draw_all_signals(ivl_scope_t scope, void *_parent)
|
||||||
{
|
{
|
||||||
if (!is_default_scope_instance(scope))
|
if (!is_default_scope_instance(scope))
|
||||||
return 0; // Not interested in this instance
|
return 0; // Not interested in this instance
|
||||||
|
|
||||||
if (ivl_scope_type(scope) == IVL_SCT_MODULE) {
|
if (ivl_scope_type(scope) == IVL_SCT_MODULE) {
|
||||||
vhdl_entity *ent = find_entity(scope);
|
vhdl_entity *ent = find_entity(scope);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
@ -983,7 +983,7 @@ extern "C" int draw_all_signals(ivl_scope_t scope, void *_parent)
|
||||||
ivl_scope_t parent = ivl_scope_parent(scope);
|
ivl_scope_t parent = ivl_scope_parent(scope);
|
||||||
while (ivl_scope_type(parent) == IVL_SCT_GENERATE)
|
while (ivl_scope_type(parent) == IVL_SCT_GENERATE)
|
||||||
parent = ivl_scope_parent(scope);
|
parent = ivl_scope_parent(scope);
|
||||||
|
|
||||||
vhdl_entity* ent = find_entity(parent);
|
vhdl_entity* ent = find_entity(parent);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
||||||
|
|
@ -1000,7 +1000,7 @@ extern "C" int draw_functions(ivl_scope_t scope, void *_parent)
|
||||||
{
|
{
|
||||||
if (!is_default_scope_instance(scope))
|
if (!is_default_scope_instance(scope))
|
||||||
return 0; // Not interested in this instance
|
return 0; // Not interested in this instance
|
||||||
|
|
||||||
ivl_scope_t parent = static_cast<ivl_scope_t>(_parent);
|
ivl_scope_t parent = static_cast<ivl_scope_t>(_parent);
|
||||||
if (ivl_scope_type(scope) == IVL_SCT_FUNCTION) {
|
if (ivl_scope_type(scope) == IVL_SCT_FUNCTION) {
|
||||||
if (draw_function(scope, parent) != 0)
|
if (draw_function(scope, parent) != 0)
|
||||||
|
|
@ -1024,9 +1024,9 @@ extern "C" int draw_constant_drivers(ivl_scope_t scope, void *_parent)
|
||||||
{
|
{
|
||||||
if (!is_default_scope_instance(scope))
|
if (!is_default_scope_instance(scope))
|
||||||
return 0; // Not interested in this instance
|
return 0; // Not interested in this instance
|
||||||
|
|
||||||
ivl_scope_children(scope, draw_constant_drivers, scope);
|
ivl_scope_children(scope, draw_constant_drivers, scope);
|
||||||
|
|
||||||
if (ivl_scope_type(scope) == IVL_SCT_MODULE) {
|
if (ivl_scope_type(scope) == IVL_SCT_MODULE) {
|
||||||
vhdl_entity *ent = find_entity(scope);
|
vhdl_entity *ent = find_entity(scope);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
@ -1034,7 +1034,7 @@ extern "C" int draw_constant_drivers(ivl_scope_t scope, void *_parent)
|
||||||
int nsigs = ivl_scope_sigs(scope);
|
int nsigs = ivl_scope_sigs(scope);
|
||||||
for (int i = 0; i < nsigs; i++) {
|
for (int i = 0; i < nsigs; i++) {
|
||||||
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
ivl_signal_t sig = ivl_scope_sig(scope, i);
|
||||||
|
|
||||||
for (unsigned j = ivl_signal_array_base(sig);
|
for (unsigned j = ivl_signal_array_base(sig);
|
||||||
j < ivl_signal_array_count(sig);
|
j < ivl_signal_array_count(sig);
|
||||||
j++) {
|
j++) {
|
||||||
|
|
@ -1042,7 +1042,7 @@ extern "C" int draw_constant_drivers(ivl_scope_t scope, void *_parent)
|
||||||
ivl_nexus_t nex = ivl_signal_nex(sig, j);
|
ivl_nexus_t nex = ivl_signal_nex(sig, j);
|
||||||
if (!nex) continue; // skip virtual pins
|
if (!nex) continue; // skip virtual pins
|
||||||
seen_nexus(nex);
|
seen_nexus(nex);
|
||||||
|
|
||||||
nexus_private_t *priv =
|
nexus_private_t *priv =
|
||||||
static_cast<nexus_private_t*>(ivl_nexus_get_private(nex));
|
static_cast<nexus_private_t*>(ivl_nexus_get_private(nex));
|
||||||
assert(priv);
|
assert(priv);
|
||||||
|
|
@ -1052,11 +1052,11 @@ extern "C" int draw_constant_drivers(ivl_scope_t scope, void *_parent)
|
||||||
if (priv->const_driver
|
if (priv->const_driver
|
||||||
&& ivl_signal_port(sig) != IVL_SIP_INPUT) { // Don't drive inputs
|
&& ivl_signal_port(sig) != IVL_SIP_INPUT) { // Don't drive inputs
|
||||||
assert(j == 0); // TODO: Make work for more words
|
assert(j == 0); // TODO: Make work for more words
|
||||||
|
|
||||||
vhdl_var_ref *ref = nexus_to_var_ref(arch_scope, nex);
|
vhdl_var_ref *ref = nexus_to_var_ref(arch_scope, nex);
|
||||||
|
|
||||||
ent->get_arch()->add_stmt
|
ent->get_arch()->add_stmt
|
||||||
(new vhdl_cassign_stmt(ref, priv->const_driver));
|
(new vhdl_cassign_stmt(ref, priv->const_driver));
|
||||||
priv->const_driver = NULL;
|
priv->const_driver = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1065,7 +1065,7 @@ extern "C" int draw_constant_drivers(ivl_scope_t scope, void *_parent)
|
||||||
scope_nexus_t *sn = visible_nexus(priv, arch_scope);
|
scope_nexus_t *sn = visible_nexus(priv, arch_scope);
|
||||||
|
|
||||||
// Make sure we don't drive inputs
|
// Make sure we don't drive inputs
|
||||||
if (ivl_signal_port(sn->sig) != IVL_SIP_INPUT) {
|
if (ivl_signal_port(sn->sig) != IVL_SIP_INPUT) {
|
||||||
for (list<ivl_signal_t>::const_iterator it = sn->connect.begin();
|
for (list<ivl_signal_t>::const_iterator it = sn->connect.begin();
|
||||||
it != sn->connect.end();
|
it != sn->connect.end();
|
||||||
++it) {
|
++it) {
|
||||||
|
|
@ -1075,20 +1075,20 @@ extern "C" int draw_constant_drivers(ivl_scope_t scope, void *_parent)
|
||||||
vhdl_type* ltype =
|
vhdl_type* ltype =
|
||||||
vhdl_type::type_for(ivl_signal_width(*it),
|
vhdl_type::type_for(ivl_signal_width(*it),
|
||||||
ivl_signal_signed(*it));
|
ivl_signal_signed(*it));
|
||||||
|
|
||||||
vhdl_var_ref *rref =
|
vhdl_var_ref *rref =
|
||||||
new vhdl_var_ref(get_renamed_signal(sn->sig).c_str(), rtype);
|
new vhdl_var_ref(get_renamed_signal(sn->sig).c_str(), rtype);
|
||||||
vhdl_var_ref *lref =
|
vhdl_var_ref *lref =
|
||||||
new vhdl_var_ref(get_renamed_signal(*it).c_str(), ltype);
|
new vhdl_var_ref(get_renamed_signal(*it).c_str(), ltype);
|
||||||
|
|
||||||
// Make sure the LHS and RHS have the same type
|
// Make sure the LHS and RHS have the same type
|
||||||
vhdl_expr* rhs = rref->cast(lref->get_type());
|
vhdl_expr* rhs = rref->cast(lref->get_type());
|
||||||
|
|
||||||
ent->get_arch()->add_stmt(new vhdl_cassign_stmt(lref, rhs));
|
ent->get_arch()->add_stmt(new vhdl_cassign_stmt(lref, rhs));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sn->connect.clear();
|
sn->connect.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1099,7 +1099,7 @@ extern "C" int draw_all_logic_and_lpm(ivl_scope_t scope, void *_parent)
|
||||||
{
|
{
|
||||||
if (!is_default_scope_instance(scope))
|
if (!is_default_scope_instance(scope))
|
||||||
return 0; // Not interested in this instance
|
return 0; // Not interested in this instance
|
||||||
|
|
||||||
if (ivl_scope_type(scope) == IVL_SCT_MODULE) {
|
if (ivl_scope_type(scope) == IVL_SCT_MODULE) {
|
||||||
vhdl_entity *ent = find_entity(scope);
|
vhdl_entity *ent = find_entity(scope);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
@ -1110,40 +1110,40 @@ extern "C" int draw_all_logic_and_lpm(ivl_scope_t scope, void *_parent)
|
||||||
declare_lpm(ent->get_arch(), scope);
|
declare_lpm(ent->get_arch(), scope);
|
||||||
}
|
}
|
||||||
set_active_entity(NULL);
|
set_active_entity(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ivl_scope_children(scope, draw_all_logic_and_lpm, scope);
|
return ivl_scope_children(scope, draw_all_logic_and_lpm, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int draw_hierarchy(ivl_scope_t scope, void *_parent)
|
extern "C" int draw_hierarchy(ivl_scope_t scope, void *_parent)
|
||||||
{
|
{
|
||||||
if (ivl_scope_type(scope) == IVL_SCT_MODULE && _parent) {
|
if (ivl_scope_type(scope) == IVL_SCT_MODULE && _parent) {
|
||||||
ivl_scope_t parent = static_cast<ivl_scope_t>(_parent);
|
ivl_scope_t parent = static_cast<ivl_scope_t>(_parent);
|
||||||
|
|
||||||
// Skip over any containing generate scopes
|
// Skip over any containing generate scopes
|
||||||
while (ivl_scope_type(parent) == IVL_SCT_GENERATE)
|
while (ivl_scope_type(parent) == IVL_SCT_GENERATE)
|
||||||
parent = ivl_scope_parent(parent);
|
parent = ivl_scope_parent(parent);
|
||||||
|
|
||||||
if (!is_default_scope_instance(parent))
|
if (!is_default_scope_instance(parent))
|
||||||
return 0; // Not generating code for the parent instance so
|
return 0; // Not generating code for the parent instance so
|
||||||
// don't generate for the child
|
// don't generate for the child
|
||||||
|
|
||||||
vhdl_entity *ent = find_entity(scope);
|
vhdl_entity *ent = find_entity(scope);
|
||||||
assert(ent);
|
assert(ent);
|
||||||
|
|
||||||
vhdl_entity *parent_ent = find_entity(parent);
|
vhdl_entity *parent_ent = find_entity(parent);
|
||||||
assert(parent_ent);
|
assert(parent_ent);
|
||||||
|
|
||||||
vhdl_arch *parent_arch = parent_ent->get_arch();
|
vhdl_arch *parent_arch = parent_ent->get_arch();
|
||||||
assert(parent_arch != NULL);
|
assert(parent_arch != NULL);
|
||||||
|
|
||||||
// Create a forward declaration for it
|
// Create a forward declaration for it
|
||||||
vhdl_scope *parent_scope = parent_arch->get_scope();
|
vhdl_scope *parent_scope = parent_arch->get_scope();
|
||||||
if (!parent_scope->have_declared(ent->get_name())) {
|
if (!parent_scope->have_declared(ent->get_name())) {
|
||||||
vhdl_decl *comp_decl = vhdl_component_decl::component_decl_for(ent);
|
vhdl_decl *comp_decl = vhdl_component_decl::component_decl_for(ent);
|
||||||
parent_arch->get_scope()->add_decl(comp_decl);
|
parent_arch->get_scope()->add_decl(comp_decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
// And an instantiation statement
|
// And an instantiation statement
|
||||||
string inst_name(ivl_scope_basename(scope));
|
string inst_name(ivl_scope_basename(scope));
|
||||||
inst_name += genvar_unique_suffix(ivl_scope_parent(scope));
|
inst_name += genvar_unique_suffix(ivl_scope_parent(scope));
|
||||||
|
|
@ -1154,13 +1154,13 @@ extern "C" int draw_hierarchy(ivl_scope_t scope, void *_parent)
|
||||||
// Would produce an invalid instance name
|
// Would produce an invalid instance name
|
||||||
inst_name += "_inst";
|
inst_name += "_inst";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Need to replace any [ and ] characters that result
|
// Need to replace any [ and ] characters that result
|
||||||
// from generate statements
|
// from generate statements
|
||||||
string::size_type loc = inst_name.find('[', 0);
|
string::size_type loc = inst_name.find('[', 0);
|
||||||
if (loc != string::npos)
|
if (loc != string::npos)
|
||||||
inst_name.erase(loc, 1);
|
inst_name.erase(loc, 1);
|
||||||
|
|
||||||
loc = inst_name.find(']', 0);
|
loc = inst_name.find(']', 0);
|
||||||
if (loc != string::npos)
|
if (loc != string::npos)
|
||||||
inst_name.erase(loc, 1);
|
inst_name.erase(loc, 1);
|
||||||
|
|
@ -1177,7 +1177,7 @@ extern "C" int draw_hierarchy(ivl_scope_t scope, void *_parent)
|
||||||
// Make sure the name doesn't collide with anything we've
|
// Make sure the name doesn't collide with anything we've
|
||||||
// already declared
|
// already declared
|
||||||
avoid_name_collision(inst_name, parent_arch->get_scope());
|
avoid_name_collision(inst_name, parent_arch->get_scope());
|
||||||
|
|
||||||
vhdl_comp_inst *inst =
|
vhdl_comp_inst *inst =
|
||||||
new vhdl_comp_inst(inst_name.c_str(), ent->get_name().c_str());
|
new vhdl_comp_inst(inst_name.c_str(), ent->get_name().c_str());
|
||||||
port_map(scope, parent_ent, inst);
|
port_map(scope, parent_ent, inst);
|
||||||
|
|
@ -1186,15 +1186,15 @@ extern "C" int draw_hierarchy(ivl_scope_t scope, void *_parent)
|
||||||
ss << "Generated from instantiation at "
|
ss << "Generated from instantiation at "
|
||||||
<< ivl_scope_file(scope) << ":" << ivl_scope_lineno(scope);
|
<< ivl_scope_file(scope) << ":" << ivl_scope_lineno(scope);
|
||||||
inst->set_comment(ss.str().c_str());
|
inst->set_comment(ss.str().c_str());
|
||||||
|
|
||||||
parent_arch->add_stmt(inst);
|
parent_arch->add_stmt(inst);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ivl_scope_children(scope, draw_hierarchy, scope);
|
return ivl_scope_children(scope, draw_hierarchy, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
int draw_scope(ivl_scope_t scope, void *_parent)
|
int draw_scope(ivl_scope_t scope, void *_parent)
|
||||||
{
|
{
|
||||||
int rc = draw_skeleton_scope(scope, _parent);
|
int rc = draw_skeleton_scope(scope, _parent);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
@ -1205,7 +1205,7 @@ int draw_scope(ivl_scope_t scope, void *_parent)
|
||||||
|
|
||||||
rc = draw_all_logic_and_lpm(scope, _parent);
|
rc = draw_all_logic_and_lpm(scope, _parent);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
rc = draw_hierarchy(scope, _parent);
|
rc = draw_hierarchy(scope, _parent);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
|
|
@ -1218,7 +1218,7 @@ int draw_scope(ivl_scope_t scope, void *_parent)
|
||||||
rc = draw_constant_drivers(scope, _parent);
|
rc = draw_constant_drivers(scope, _parent);
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ using namespace std;
|
||||||
* provides a mechanism for renaming signals -- i.e. when
|
* provides a mechanism for renaming signals -- i.e. when
|
||||||
* an output has the same name as register: valid in Verilog
|
* an output has the same name as register: valid in Verilog
|
||||||
* but not in VHDL, so two separate signals need to be
|
* but not in VHDL, so two separate signals need to be
|
||||||
* defined.
|
* defined.
|
||||||
*/
|
*/
|
||||||
struct signal_defn_t {
|
struct signal_defn_t {
|
||||||
std::string renamed; // The name of the VHDL signal
|
std::string renamed; // The name of the VHDL signal
|
||||||
|
|
@ -64,7 +64,7 @@ struct signal_defn_t {
|
||||||
// These are stored in a list rather than a set so the first
|
// These are stored in a list rather than a set so the first
|
||||||
// entity added will correspond to the first (top) Verilog module
|
// entity added will correspond to the first (top) Verilog module
|
||||||
// encountered and hence it will appear first in the output file.
|
// encountered and hence it will appear first in the output file.
|
||||||
static entity_list_t g_entities;
|
static entity_list_t g_entities;
|
||||||
|
|
||||||
// Store the mapping of ivl scope names to entity names
|
// Store the mapping of ivl scope names to entity names
|
||||||
typedef map<string, string> scope_name_map_t;
|
typedef map<string, string> scope_name_map_t;
|
||||||
|
|
@ -145,7 +145,7 @@ ivl_signal_t find_signal_named(const std::string &name, const vhdl_scope *scope)
|
||||||
// Compare the name of an entity against a string
|
// Compare the name of an entity against a string
|
||||||
struct cmp_ent_name {
|
struct cmp_ent_name {
|
||||||
cmp_ent_name(const string& n) : name_(n) {}
|
cmp_ent_name(const string& n) : name_(n) {}
|
||||||
|
|
||||||
bool operator()(const vhdl_entity* ent) const
|
bool operator()(const vhdl_entity* ent) const
|
||||||
{
|
{
|
||||||
return ent->get_name() == name_;
|
return ent->get_name() == name_;
|
||||||
|
|
@ -156,7 +156,7 @@ struct cmp_ent_name {
|
||||||
|
|
||||||
// Find an entity given its name.
|
// Find an entity given its name.
|
||||||
vhdl_entity* find_entity(const string& name)
|
vhdl_entity* find_entity(const string& name)
|
||||||
{
|
{
|
||||||
entity_list_t::const_iterator it
|
entity_list_t::const_iterator it
|
||||||
= find_if(g_entities.begin(), g_entities.end(),
|
= find_if(g_entities.begin(), g_entities.end(),
|
||||||
cmp_ent_name(name));
|
cmp_ent_name(name));
|
||||||
|
|
@ -176,7 +176,7 @@ vhdl_entity* find_entity(ivl_scope_t scope)
|
||||||
// Skip over generate scopes
|
// Skip over generate scopes
|
||||||
while (ivl_scope_type(scope) == IVL_SCT_GENERATE)
|
while (ivl_scope_type(scope) == IVL_SCT_GENERATE)
|
||||||
scope = ivl_scope_parent(scope);
|
scope = ivl_scope_parent(scope);
|
||||||
|
|
||||||
assert(ivl_scope_type(scope) == IVL_SCT_MODULE);
|
assert(ivl_scope_type(scope) == IVL_SCT_MODULE);
|
||||||
|
|
||||||
scope_name_map_t::iterator it = g_scope_names.find(ivl_scope_tname(scope));
|
scope_name_map_t::iterator it = g_scope_names.find(ivl_scope_tname(scope));
|
||||||
|
|
@ -213,7 +213,7 @@ void free_all_vhdl_objects()
|
||||||
|
|
||||||
size_t total = vhdl_element::total_allocated();
|
size_t total = vhdl_element::total_allocated();
|
||||||
debug_msg("%d total bytes used for VHDL syntax objects", total);
|
debug_msg("%d total bytes used for VHDL syntax objects", total);
|
||||||
|
|
||||||
g_entities.clear();
|
g_entities.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
126
tgt-vhdl/stmt.cc
126
tgt-vhdl/stmt.cc
|
|
@ -40,7 +40,7 @@
|
||||||
* An alternative is to use the VHPI interface supported by
|
* An alternative is to use the VHPI interface supported by
|
||||||
* some VHDL simulators and implement the $finish functionality
|
* some VHDL simulators and implement the $finish functionality
|
||||||
* in C. This function can be enabled with the flag
|
* in C. This function can be enabled with the flag
|
||||||
* -puse-vhpi-finish=1.
|
* -puse-vhpi-finish=1.
|
||||||
*/
|
*/
|
||||||
static int draw_stask_finish(vhdl_procedural *proc, stmt_container *container,
|
static int draw_stask_finish(vhdl_procedural *proc, stmt_container *container,
|
||||||
ivl_statement_t stmt)
|
ivl_statement_t stmt)
|
||||||
|
|
@ -53,7 +53,7 @@ static int draw_stask_finish(vhdl_procedural *proc, stmt_container *container,
|
||||||
else {
|
else {
|
||||||
container->add_stmt(new vhdl_assert_stmt("SIMULATION FINISHED"));
|
container->add_stmt(new vhdl_assert_stmt("SIMULATION FINISHED"));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -93,7 +93,7 @@ static int draw_stask(vhdl_procedural *proc, stmt_container *container,
|
||||||
*
|
*
|
||||||
* If this block has its own scope with local variables then these
|
* If this block has its own scope with local variables then these
|
||||||
* are added to the process as local variables and the statements
|
* are added to the process as local variables and the statements
|
||||||
* are generated as above.
|
* are generated as above.
|
||||||
*/
|
*/
|
||||||
static int draw_block(vhdl_procedural *proc, stmt_container *container,
|
static int draw_block(vhdl_procedural *proc, stmt_container *container,
|
||||||
ivl_statement_t stmt, bool is_last)
|
ivl_statement_t stmt, bool is_last)
|
||||||
|
|
@ -111,7 +111,7 @@ static int draw_block(vhdl_procedural *proc, stmt_container *container,
|
||||||
(new vhdl_var_decl(make_safe_name(sig), type));
|
(new vhdl_var_decl(make_safe_name(sig), type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int count = ivl_stmt_block_count(stmt);
|
int count = ivl_stmt_block_count(stmt);
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
ivl_statement_t stmt_i = ivl_stmt_block_stmt(stmt, i);
|
ivl_statement_t stmt_i = ivl_stmt_block_stmt(stmt, i);
|
||||||
|
|
@ -138,7 +138,7 @@ static int draw_noop(vhdl_procedural *proc, stmt_container *container,
|
||||||
* we might as well not emit the first zero-time wait.
|
* we might as well not emit the first zero-time wait.
|
||||||
*/
|
*/
|
||||||
void prune_wait_for_0(stmt_container *container)
|
void prune_wait_for_0(stmt_container *container)
|
||||||
{
|
{
|
||||||
vhdl_wait_stmt *wait0;
|
vhdl_wait_stmt *wait0;
|
||||||
stmt_container::stmt_list_t &stmts = container->get_stmts();
|
stmt_container::stmt_list_t &stmts = container->get_stmts();
|
||||||
while (stmts.size() > 0
|
while (stmts.size() > 0
|
||||||
|
|
@ -167,13 +167,13 @@ static vhdl_var_ref *make_assign_lhs(ivl_lval_t lval, vhdl_scope *scope)
|
||||||
if (e_off) {
|
if (e_off) {
|
||||||
if ((base = translate_expr(e_off)) == NULL)
|
if ((base = translate_expr(e_off)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
vhdl_type integer(VHDL_TYPE_INTEGER);
|
vhdl_type integer(VHDL_TYPE_INTEGER);
|
||||||
base = base->cast(&integer);
|
base = base->cast(&integer);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned lval_width = ivl_lval_width(lval);
|
unsigned lval_width = ivl_lval_width(lval);
|
||||||
|
|
||||||
string signame(get_renamed_signal(sig));
|
string signame(get_renamed_signal(sig));
|
||||||
vhdl_decl *decl = scope->get_decl(signame);
|
vhdl_decl *decl = scope->get_decl(signame);
|
||||||
assert(decl);
|
assert(decl);
|
||||||
|
|
@ -197,7 +197,7 @@ static vhdl_var_ref *make_assign_lhs(ivl_lval_t lval, vhdl_scope *scope)
|
||||||
// ...and use this new variable as the assignment LHS
|
// ...and use this new variable as the assignment LHS
|
||||||
decl = shadow_decl;
|
decl = shadow_decl;
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_type *ltype = new vhdl_type(*decl->get_type());
|
vhdl_type *ltype = new vhdl_type(*decl->get_type());
|
||||||
vhdl_var_ref *lval_ref = new vhdl_var_ref(decl->get_name(), ltype);
|
vhdl_var_ref *lval_ref = new vhdl_var_ref(decl->get_name(), ltype);
|
||||||
if (base) {
|
if (base) {
|
||||||
|
|
@ -221,7 +221,7 @@ static bool assignment_lvals(ivl_statement_t stmt, vhdl_procedural *proc,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
lvals.push_back(lhs);
|
lvals.push_back(lhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -239,7 +239,7 @@ assign_for(vhdl_decl::assign_type_t atype, vhdl_var_ref *lhs, vhdl_expr *rhs)
|
||||||
return new vhdl_assign_stmt(lhs, rhs);
|
return new vhdl_assign_stmt(lhs, rhs);
|
||||||
case vhdl_decl::ASSIGN_NONBLOCK:
|
case vhdl_decl::ASSIGN_NONBLOCK:
|
||||||
return new vhdl_nbassign_stmt(lhs, rhs);
|
return new vhdl_nbassign_stmt(lhs, rhs);
|
||||||
}
|
}
|
||||||
assert(false);
|
assert(false);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -289,7 +289,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
if (lvals.size() == 1) {
|
if (lvals.size() == 1) {
|
||||||
vhdl_var_ref *lhs = lvals.front();
|
vhdl_var_ref *lhs = lvals.front();
|
||||||
rhs = rhs->cast(lhs->get_type());
|
rhs = rhs->cast(lhs->get_type());
|
||||||
|
|
||||||
ivl_expr_t i_delay;
|
ivl_expr_t i_delay;
|
||||||
vhdl_expr *after = NULL;
|
vhdl_expr *after = NULL;
|
||||||
if ((i_delay = ivl_stmt_delay_expr(stmt)) != NULL)
|
if ((i_delay = ivl_stmt_delay_expr(stmt)) != NULL)
|
||||||
|
|
@ -300,7 +300,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
// a variable, etc?)
|
// a variable, etc?)
|
||||||
vhdl_decl *decl = proc->get_scope()->get_decl(lhs->get_name());
|
vhdl_decl *decl = proc->get_scope()->get_decl(lhs->get_name());
|
||||||
assign_type = decl->assignment_type();
|
assign_type = decl->assignment_type();
|
||||||
|
|
||||||
// A small optimisation is to expand ternary RHSs into an
|
// A small optimisation is to expand ternary RHSs into an
|
||||||
// if statement (eliminates a function call and produces
|
// if statement (eliminates a function call and produces
|
||||||
// more idiomatic code)
|
// more idiomatic code)
|
||||||
|
|
@ -308,7 +308,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
rhs2 = rhs2->cast(lhs->get_type());
|
rhs2 = rhs2->cast(lhs->get_type());
|
||||||
vhdl_var_ref *lhs2 =
|
vhdl_var_ref *lhs2 =
|
||||||
make_assign_lhs(ivl_stmt_lval(stmt, 0), proc->get_scope());
|
make_assign_lhs(ivl_stmt_lval(stmt, 0), proc->get_scope());
|
||||||
|
|
||||||
vhdl_expr *test = translate_expr(ivl_expr_oper1(rval));
|
vhdl_expr *test = translate_expr(ivl_expr_oper1(rval));
|
||||||
if (NULL == test)
|
if (NULL == test)
|
||||||
return;
|
return;
|
||||||
|
|
@ -344,7 +344,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
// declaration as initialisers. This optimisation is only
|
// declaration as initialisers. This optimisation is only
|
||||||
// performed on assignments of constant values to prevent
|
// performed on assignments of constant values to prevent
|
||||||
// ordering problems.
|
// ordering problems.
|
||||||
|
|
||||||
// This also has another application: If this is an `initial'
|
// This also has another application: If this is an `initial'
|
||||||
// process and we haven't yet generated a `wait' statement then
|
// process and we haven't yet generated a `wait' statement then
|
||||||
// moving the assignment to the initialization preserves the
|
// moving the assignment to the initialization preserves the
|
||||||
|
|
@ -360,7 +360,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
&& !decl->has_initial()
|
&& !decl->has_initial()
|
||||||
&& rhs->constant()
|
&& rhs->constant()
|
||||||
&& decl->get_type()->get_name() != VHDL_TYPE_ARRAY) {
|
&& decl->get_type()->get_name() != VHDL_TYPE_ARRAY) {
|
||||||
|
|
||||||
// If this assignment is not in the top-level container
|
// If this assignment is not in the top-level container
|
||||||
// it will not be made on all paths through the code
|
// it will not be made on all paths through the code
|
||||||
// This precludes any future extraction of an initialiser
|
// This precludes any future extraction of an initialiser
|
||||||
|
|
@ -379,7 +379,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
vhdl_abstract_assign_stmt *a =
|
vhdl_abstract_assign_stmt *a =
|
||||||
assign_for(decl->assignment_type(), lhs, rhs);
|
assign_for(decl->assignment_type(), lhs, rhs);
|
||||||
container->add_stmt(a);
|
container->add_stmt(a);
|
||||||
|
|
||||||
if (after != NULL)
|
if (after != NULL)
|
||||||
a->set_after(after);
|
a->set_after(after);
|
||||||
}
|
}
|
||||||
|
|
@ -396,16 +396,16 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
proc->get_scope()->add_decl(tmp_decl);
|
proc->get_scope()->add_decl(tmp_decl);
|
||||||
|
|
||||||
container->add_stmt(new vhdl_assign_stmt(tmp_decl->make_ref(), rhs));
|
container->add_stmt(new vhdl_assign_stmt(tmp_decl->make_ref(), rhs));
|
||||||
|
|
||||||
list<vhdl_var_ref*>::iterator it;
|
list<vhdl_var_ref*>::iterator it;
|
||||||
int width_so_far = 0;
|
int width_so_far = 0;
|
||||||
for (it = lvals.begin(); it != lvals.end(); ++it) {
|
for (it = lvals.begin(); it != lvals.end(); ++it) {
|
||||||
vhdl_var_ref *tmp_rhs = tmp_decl->make_ref();
|
vhdl_var_ref *tmp_rhs = tmp_decl->make_ref();
|
||||||
|
|
||||||
int lval_width = (*it)->get_type()->get_width();
|
int lval_width = (*it)->get_type()->get_width();
|
||||||
vhdl_expr *slice_base = new vhdl_const_int(width_so_far);
|
vhdl_expr *slice_base = new vhdl_const_int(width_so_far);
|
||||||
tmp_rhs->set_slice(slice_base, lval_width - 1);
|
tmp_rhs->set_slice(slice_base, lval_width - 1);
|
||||||
|
|
||||||
ivl_expr_t i_delay;
|
ivl_expr_t i_delay;
|
||||||
vhdl_expr *after = NULL;
|
vhdl_expr *after = NULL;
|
||||||
if ((i_delay = ivl_stmt_delay_expr(stmt)) != NULL)
|
if ((i_delay = ivl_stmt_delay_expr(stmt)) != NULL)
|
||||||
|
|
@ -419,7 +419,7 @@ void make_assignment(vhdl_procedural *proc, stmt_container *container,
|
||||||
|
|
||||||
if (!check_valid_assignment(decl->assignment_type(), proc, stmt))
|
if (!check_valid_assignment(decl->assignment_type(), proc, stmt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vhdl_abstract_assign_stmt *a =
|
vhdl_abstract_assign_stmt *a =
|
||||||
assign_for(decl->assignment_type(), *it, tmp_rhs);
|
assign_for(decl->assignment_type(), *it, tmp_rhs);
|
||||||
if (after)
|
if (after)
|
||||||
|
|
@ -473,7 +473,7 @@ static int draw_assign(vhdl_procedural *proc, stmt_container *container,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
make_assignment(proc, container, stmt, true, assign_type);
|
make_assignment(proc, container, stmt, true, assign_type);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -511,7 +511,7 @@ static int draw_delay(vhdl_procedural *proc, stmt_container *container,
|
||||||
// Remember that we needed a wait statement so if this is
|
// Remember that we needed a wait statement so if this is
|
||||||
// a process it cannot have a sensitivity list
|
// a process it cannot have a sensitivity list
|
||||||
proc->added_wait_stmt();
|
proc->added_wait_stmt();
|
||||||
|
|
||||||
container->add_stmt(wait);
|
container->add_stmt(wait);
|
||||||
|
|
||||||
// Expand the sub-statement as well
|
// Expand the sub-statement as well
|
||||||
|
|
@ -519,12 +519,12 @@ static int draw_delay(vhdl_procedural *proc, stmt_container *container,
|
||||||
// is caught here instead
|
// is caught here instead
|
||||||
if (ivl_statement_type(sub_stmt) != IVL_ST_NOOP)
|
if (ivl_statement_type(sub_stmt) != IVL_ST_NOOP)
|
||||||
draw_stmt(proc, container, sub_stmt);
|
draw_stmt(proc, container, sub_stmt);
|
||||||
|
|
||||||
// Any further assignments occur after simulation time 0
|
// Any further assignments occur after simulation time 0
|
||||||
// so they cannot be used to initialise signal declarations
|
// so they cannot be used to initialise signal declarations
|
||||||
// (if this scope is an initial process)
|
// (if this scope is an initial process)
|
||||||
proc->get_scope()->set_initializing(false);
|
proc->get_scope()->set_initializing(false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -582,19 +582,19 @@ static bool draw_synthesisable_wait(vhdl_process *proc, stmt_container *containe
|
||||||
{
|
{
|
||||||
// At the moment this only detects FFs with an asynchronous reset
|
// At the moment this only detects FFs with an asynchronous reset
|
||||||
// All other code will fall back on the default draw_wait
|
// All other code will fall back on the default draw_wait
|
||||||
|
|
||||||
// Store a set of the edge triggered signals
|
// Store a set of the edge triggered signals
|
||||||
// The second item is true if this is positive-edge
|
// The second item is true if this is positive-edge
|
||||||
set<ivl_nexus_t> edge_triggered;
|
set<ivl_nexus_t> edge_triggered;
|
||||||
|
|
||||||
const int nevents = ivl_stmt_nevent(stmt);
|
const int nevents = ivl_stmt_nevent(stmt);
|
||||||
|
|
||||||
for (int i = 0; i < nevents; i++) {
|
for (int i = 0; i < nevents; i++) {
|
||||||
ivl_event_t event = ivl_stmt_events(stmt, i);
|
ivl_event_t event = ivl_stmt_events(stmt, i);
|
||||||
|
|
||||||
if (ivl_event_nany(event) > 0)
|
if (ivl_event_nany(event) > 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
int npos = ivl_event_npos(event);
|
int npos = ivl_event_npos(event);
|
||||||
for (int j = 0; j < npos; j++)
|
for (int j = 0; j < npos; j++)
|
||||||
edge_triggered.insert(ivl_event_pos(event, j));
|
edge_triggered.insert(ivl_event_pos(event, j));
|
||||||
|
|
@ -661,13 +661,13 @@ static bool draw_synthesisable_wait(vhdl_process *proc, stmt_container *containe
|
||||||
edge = new vhdl_fcall("falling_edge", vhdl_type::boolean());
|
edge = new vhdl_fcall("falling_edge", vhdl_type::boolean());
|
||||||
}
|
}
|
||||||
assert(edge);
|
assert(edge);
|
||||||
|
|
||||||
edge->add_expr(nexus_to_var_ref(proc->get_scope(), *clock_net.begin()));
|
edge->add_expr(nexus_to_var_ref(proc->get_scope(), *clock_net.begin()));
|
||||||
|
|
||||||
// Draw the clocked branch
|
// Draw the clocked branch
|
||||||
// For an asynchronous reset we just want this around the else branch,
|
// For an asynchronous reset we just want this around the else branch,
|
||||||
stmt_container *else_container = body->add_elsif(edge);
|
stmt_container *else_container = body->add_elsif(edge);
|
||||||
|
|
||||||
draw_stmt(proc, else_container, ivl_stmt_cond_false(sub_stmt));
|
draw_stmt(proc, else_container, ivl_stmt_cond_false(sub_stmt));
|
||||||
|
|
||||||
if (proc->contains_wait_stmt()) {
|
if (proc->contains_wait_stmt()) {
|
||||||
|
|
@ -707,7 +707,7 @@ static bool draw_synthesisable_wait(vhdl_process *proc, stmt_container *containe
|
||||||
* The difficulty stems from VHDL's restriction that a process with
|
* The difficulty stems from VHDL's restriction that a process with
|
||||||
* a sensitivity list may not contain any `wait' statements: we need
|
* a sensitivity list may not contain any `wait' statements: we need
|
||||||
* to generate these to accurately model some Verilog statements.
|
* to generate these to accurately model some Verilog statements.
|
||||||
*
|
*
|
||||||
* The steps followed are:
|
* The steps followed are:
|
||||||
* 1) Determine whether this is the top-level statement in the process
|
* 1) Determine whether this is the top-level statement in the process
|
||||||
* 2) If this is top-level, call draw_synthesisable_wait to see if the
|
* 2) If this is top-level, call draw_synthesisable_wait to see if the
|
||||||
|
|
@ -753,7 +753,7 @@ static int draw_wait(vhdl_procedural *_proc, stmt_container *container,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int nevents = ivl_stmt_nevent(stmt);
|
int nevents = ivl_stmt_nevent(stmt);
|
||||||
|
|
||||||
bool combinatorial = true; // True if no negedge/posedge events
|
bool combinatorial = true; // True if no negedge/posedge events
|
||||||
for (int i = 0; i < nevents; i++) {
|
for (int i = 0; i < nevents; i++) {
|
||||||
ivl_event_t event = ivl_stmt_events(stmt, i);
|
ivl_event_t event = ivl_stmt_events(stmt, i);
|
||||||
|
|
@ -770,11 +770,11 @@ static int draw_wait(vhdl_procedural *_proc, stmt_container *container,
|
||||||
|
|
||||||
vhdl_wait_stmt *wait = NULL;
|
vhdl_wait_stmt *wait = NULL;
|
||||||
if (proc->contains_wait_stmt() || !is_top_level)
|
if (proc->contains_wait_stmt() || !is_top_level)
|
||||||
wait = new vhdl_wait_stmt(VHDL_WAIT_ON);
|
wait = new vhdl_wait_stmt(VHDL_WAIT_ON);
|
||||||
|
|
||||||
for (int i = 0; i < nevents; i++) {
|
for (int i = 0; i < nevents; i++) {
|
||||||
ivl_event_t event = ivl_stmt_events(stmt, i);
|
ivl_event_t event = ivl_stmt_events(stmt, i);
|
||||||
|
|
||||||
int nany = ivl_event_nany(event);
|
int nany = ivl_event_nany(event);
|
||||||
for (int j = 0; j < nany; j++) {
|
for (int j = 0; j < nany; j++) {
|
||||||
ivl_nexus_t nexus = ivl_event_any(event, j);
|
ivl_nexus_t nexus = ivl_event_any(event, j);
|
||||||
|
|
@ -803,22 +803,22 @@ static int draw_wait(vhdl_procedural *_proc, stmt_container *container,
|
||||||
|
|
||||||
stmt_container tmp_container;
|
stmt_container tmp_container;
|
||||||
draw_stmt(proc, &tmp_container, ivl_stmt_sub_stmt(stmt), true);
|
draw_stmt(proc, &tmp_container, ivl_stmt_sub_stmt(stmt), true);
|
||||||
|
|
||||||
for (int i = 0; i < nevents; i++) {
|
for (int i = 0; i < nevents; i++) {
|
||||||
ivl_event_t event = ivl_stmt_events(stmt, i);
|
ivl_event_t event = ivl_stmt_events(stmt, i);
|
||||||
|
|
||||||
int nany = ivl_event_nany(event);
|
int nany = ivl_event_nany(event);
|
||||||
for (int j = 0; j < nany; j++) {
|
for (int j = 0; j < nany; j++) {
|
||||||
ivl_nexus_t nexus = ivl_event_any(event, j);
|
ivl_nexus_t nexus = ivl_event_any(event, j);
|
||||||
vhdl_var_ref *ref = nexus_to_var_ref(proc->get_scope(), nexus);
|
vhdl_var_ref *ref = nexus_to_var_ref(proc->get_scope(), nexus);
|
||||||
|
|
||||||
ref->set_name(ref->get_name() + "'Event");
|
ref->set_name(ref->get_name() + "'Event");
|
||||||
test->add_expr(ref);
|
test->add_expr(ref);
|
||||||
|
|
||||||
if (!proc->contains_wait_stmt() && is_top_level)
|
if (!proc->contains_wait_stmt() && is_top_level)
|
||||||
proc->add_sensitivity(ref->get_name());
|
proc->add_sensitivity(ref->get_name());
|
||||||
}
|
}
|
||||||
|
|
||||||
int nneg = ivl_event_nneg(event);
|
int nneg = ivl_event_nneg(event);
|
||||||
for (int j = 0; j < nneg; j++) {
|
for (int j = 0; j < nneg; j++) {
|
||||||
ivl_nexus_t nexus = ivl_event_neg(event, j);
|
ivl_nexus_t nexus = ivl_event_neg(event, j);
|
||||||
|
|
@ -826,13 +826,13 @@ static int draw_wait(vhdl_procedural *_proc, stmt_container *container,
|
||||||
vhdl_fcall *detect =
|
vhdl_fcall *detect =
|
||||||
new vhdl_fcall("falling_edge", vhdl_type::boolean());
|
new vhdl_fcall("falling_edge", vhdl_type::boolean());
|
||||||
detect->add_expr(ref);
|
detect->add_expr(ref);
|
||||||
|
|
||||||
test->add_expr(detect);
|
test->add_expr(detect);
|
||||||
|
|
||||||
if (!proc->contains_wait_stmt() && is_top_level)
|
if (!proc->contains_wait_stmt() && is_top_level)
|
||||||
proc->add_sensitivity(ref->get_name());
|
proc->add_sensitivity(ref->get_name());
|
||||||
}
|
}
|
||||||
|
|
||||||
int npos = ivl_event_npos(event);
|
int npos = ivl_event_npos(event);
|
||||||
for (int j = 0; j < npos; j++) {
|
for (int j = 0; j < npos; j++) {
|
||||||
ivl_nexus_t nexus = ivl_event_pos(event, j);
|
ivl_nexus_t nexus = ivl_event_pos(event, j);
|
||||||
|
|
@ -840,14 +840,14 @@ static int draw_wait(vhdl_procedural *_proc, stmt_container *container,
|
||||||
vhdl_fcall *detect =
|
vhdl_fcall *detect =
|
||||||
new vhdl_fcall("rising_edge", vhdl_type::boolean());
|
new vhdl_fcall("rising_edge", vhdl_type::boolean());
|
||||||
detect->add_expr(ref);
|
detect->add_expr(ref);
|
||||||
|
|
||||||
test->add_expr(detect);
|
test->add_expr(detect);
|
||||||
|
|
||||||
if (!proc->contains_wait_stmt() && is_top_level)
|
if (!proc->contains_wait_stmt() && is_top_level)
|
||||||
proc->add_sensitivity(ref->get_name());
|
proc->add_sensitivity(ref->get_name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (proc->contains_wait_stmt() || !is_top_level) {
|
if (proc->contains_wait_stmt() || !is_top_level) {
|
||||||
container->add_stmt(new vhdl_wait_stmt(VHDL_WAIT_UNTIL, test));
|
container->add_stmt(new vhdl_wait_stmt(VHDL_WAIT_UNTIL, test));
|
||||||
container->move_stmts_from(&tmp_container);
|
container->move_stmts_from(&tmp_container);
|
||||||
|
|
@ -863,9 +863,9 @@ static int draw_wait(vhdl_procedural *_proc, stmt_container *container,
|
||||||
|
|
||||||
container->add_stmt(edge_detect);
|
container->add_stmt(edge_detect);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -875,7 +875,7 @@ static int draw_if(vhdl_procedural *proc, stmt_container *container,
|
||||||
vhdl_expr *test = translate_expr(ivl_stmt_cond_expr(stmt));
|
vhdl_expr *test = translate_expr(ivl_stmt_cond_expr(stmt));
|
||||||
if (NULL == test)
|
if (NULL == test)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
vhdl_if_stmt *vhdif = new vhdl_if_stmt(test);
|
vhdl_if_stmt *vhdif = new vhdl_if_stmt(test);
|
||||||
|
|
||||||
ivl_statement_t cond_true_stmt = ivl_stmt_cond_true(stmt);
|
ivl_statement_t cond_true_stmt = ivl_stmt_cond_true(stmt);
|
||||||
|
|
@ -887,7 +887,7 @@ static int draw_if(vhdl_procedural *proc, stmt_container *container,
|
||||||
draw_stmt(proc, vhdif->get_else_container(), cond_false_stmt, is_last);
|
draw_stmt(proc, vhdif->get_else_container(), cond_false_stmt, is_last);
|
||||||
|
|
||||||
container->add_stmt(vhdif);
|
container->add_stmt(vhdif);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -904,7 +904,7 @@ static vhdl_var_ref *draw_case_test(vhdl_procedural *proc, stmt_container *conta
|
||||||
if (typeid(*test) != typeid(vhdl_var_ref)) {
|
if (typeid(*test) != typeid(vhdl_var_ref)) {
|
||||||
const char *tmp_name = "Verilog_Case_Ex";
|
const char *tmp_name = "Verilog_Case_Ex";
|
||||||
vhdl_type *test_type = new vhdl_type(*test->get_type());
|
vhdl_type *test_type = new vhdl_type(*test->get_type());
|
||||||
|
|
||||||
if (!proc->get_scope()->have_declared(tmp_name)) {
|
if (!proc->get_scope()->have_declared(tmp_name)) {
|
||||||
proc->get_scope()->add_decl
|
proc->get_scope()->add_decl
|
||||||
(new vhdl_var_decl(tmp_name, new vhdl_type(*test_type)));
|
(new vhdl_var_decl(tmp_name, new vhdl_type(*test_type)));
|
||||||
|
|
@ -925,7 +925,7 @@ static int draw_case(vhdl_procedural *proc, stmt_container *container,
|
||||||
vhdl_var_ref *test = draw_case_test(proc, container, stmt);
|
vhdl_var_ref *test = draw_case_test(proc, container, stmt);
|
||||||
if (NULL == test)
|
if (NULL == test)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
vhdl_case_stmt *vhdlcase = new vhdl_case_stmt(test);
|
vhdl_case_stmt *vhdlcase = new vhdl_case_stmt(test);
|
||||||
container->add_stmt(vhdlcase);
|
container->add_stmt(vhdlcase);
|
||||||
|
|
||||||
|
|
@ -933,7 +933,7 @@ static int draw_case(vhdl_procedural *proc, stmt_container *container,
|
||||||
// possible case. So make sure we add an 'others' branch
|
// possible case. So make sure we add an 'others' branch
|
||||||
// if there isn't a default one.
|
// if there isn't a default one.
|
||||||
bool have_others = false;
|
bool have_others = false;
|
||||||
|
|
||||||
int nbranches = ivl_stmt_case_count(stmt);
|
int nbranches = ivl_stmt_case_count(stmt);
|
||||||
for (int i = 0; i < nbranches; i++) {
|
for (int i = 0; i < nbranches; i++) {
|
||||||
vhdl_expr *when;
|
vhdl_expr *when;
|
||||||
|
|
@ -947,7 +947,7 @@ static int draw_case(vhdl_procedural *proc, stmt_container *container,
|
||||||
when = new vhdl_var_ref("others", NULL);
|
when = new vhdl_var_ref("others", NULL);
|
||||||
have_others = true;
|
have_others = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_case_branch *branch = new vhdl_case_branch(when);
|
vhdl_case_branch *branch = new vhdl_case_branch(when);
|
||||||
vhdlcase->add_branch(branch);
|
vhdlcase->add_branch(branch);
|
||||||
|
|
||||||
|
|
@ -960,8 +960,8 @@ static int draw_case(vhdl_procedural *proc, stmt_container *container,
|
||||||
new vhdl_case_branch(new vhdl_var_ref("others", NULL));
|
new vhdl_case_branch(new vhdl_var_ref("others", NULL));
|
||||||
others->get_container()->add_stmt(new vhdl_null_stmt());
|
others->get_container()->add_stmt(new vhdl_null_stmt());
|
||||||
vhdlcase->add_branch(others);
|
vhdlcase->add_branch(others);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1325,12 +1325,12 @@ int draw_casezx(vhdl_procedural *proc, stmt_container *container,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
vhdl_if_stmt *result = NULL;
|
vhdl_if_stmt *result = NULL;
|
||||||
|
|
||||||
int nbranches = ivl_stmt_case_count(stmt);
|
int nbranches = ivl_stmt_case_count(stmt);
|
||||||
bool is_casez = ivl_statement_type(stmt) == IVL_ST_CASEZ;
|
bool is_casez = ivl_statement_type(stmt) == IVL_ST_CASEZ;
|
||||||
for (int i = 0; i < nbranches; i++) {
|
for (int i = 0; i < nbranches; i++) {
|
||||||
stmt_container *where = NULL;
|
stmt_container *where = NULL;
|
||||||
|
|
||||||
ivl_expr_t net = ivl_stmt_case_expr(stmt, i);
|
ivl_expr_t net = ivl_stmt_case_expr(stmt, i);
|
||||||
if (net) {
|
if (net) {
|
||||||
vhdl_binop_expr *all =
|
vhdl_binop_expr *all =
|
||||||
|
|
@ -1377,7 +1377,7 @@ int draw_casezx(vhdl_procedural *proc, stmt_container *container,
|
||||||
|
|
||||||
// We don't actually use the generated `test' expression
|
// We don't actually use the generated `test' expression
|
||||||
delete test;
|
delete test;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1393,7 +1393,7 @@ int draw_while(vhdl_procedural *proc, stmt_container *container,
|
||||||
int rc = draw_stmt(proc, &tmp_container, ivl_stmt_sub_stmt(stmt));
|
int rc = draw_stmt(proc, &tmp_container, ivl_stmt_sub_stmt(stmt));
|
||||||
if (rc != 0)
|
if (rc != 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
vhdl_expr *test = translate_expr(ivl_stmt_cond_expr(stmt));
|
vhdl_expr *test = translate_expr(ivl_stmt_cond_expr(stmt));
|
||||||
if (NULL == test)
|
if (NULL == test)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
@ -1405,7 +1405,7 @@ int draw_while(vhdl_procedural *proc, stmt_container *container,
|
||||||
|
|
||||||
vhdl_while_stmt *loop = new vhdl_while_stmt(test);
|
vhdl_while_stmt *loop = new vhdl_while_stmt(test);
|
||||||
draw_stmt(proc, loop->get_container(), ivl_stmt_sub_stmt(stmt));
|
draw_stmt(proc, loop->get_container(), ivl_stmt_sub_stmt(stmt));
|
||||||
|
|
||||||
container->add_stmt(loop);
|
container->add_stmt(loop);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -1437,7 +1437,7 @@ int draw_repeat(vhdl_procedural *proc, stmt_container *container,
|
||||||
container->add_stmt(loop);
|
container->add_stmt(loop);
|
||||||
|
|
||||||
draw_stmt(proc, loop->get_container(), ivl_stmt_sub_stmt(stmt));
|
draw_stmt(proc, loop->get_container(), ivl_stmt_sub_stmt(stmt));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1455,7 +1455,7 @@ int draw_utask(vhdl_procedural *proc, stmt_container *container,
|
||||||
|
|
||||||
// TOOD: this completely ignores parameters!
|
// TOOD: this completely ignores parameters!
|
||||||
draw_stmt(proc, container, ivl_scope_def(tscope), false);
|
draw_stmt(proc, container, ivl_scope_def(tscope), false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1473,7 +1473,7 @@ int draw_stmt(vhdl_procedural *proc, stmt_container *container,
|
||||||
ivl_statement_t stmt, bool is_last)
|
ivl_statement_t stmt, bool is_last)
|
||||||
{
|
{
|
||||||
assert(stmt);
|
assert(stmt);
|
||||||
|
|
||||||
switch (ivl_statement_type(stmt)) {
|
switch (ivl_statement_type(stmt)) {
|
||||||
case IVL_ST_STASK:
|
case IVL_ST_STASK:
|
||||||
return draw_stask(proc, container, stmt);
|
return draw_stask(proc, container, stmt);
|
||||||
|
|
@ -1523,6 +1523,6 @@ int draw_stmt(vhdl_procedural *proc, stmt_container *container,
|
||||||
error("No VHDL translation for statement at %s:%d (type = %d)",
|
error("No VHDL translation for statement at %s:%d (type = %d)",
|
||||||
ivl_stmt_file(stmt), ivl_stmt_lineno(stmt),
|
ivl_stmt_file(stmt), ivl_stmt_lineno(stmt),
|
||||||
ivl_statement_type(stmt));
|
ivl_statement_type(stmt));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ void support_function::emit_reduction(std::ostream &of, int level,
|
||||||
// Emit a VHDL function emulating a Verilog reduction operator
|
// Emit a VHDL function emulating a Verilog reduction operator
|
||||||
// Where op is the corresponding VHDL operator and unit is the
|
// Where op is the corresponding VHDL operator and unit is the
|
||||||
// right-unit of the operator
|
// right-unit of the operator
|
||||||
|
|
||||||
of << "(X : std_logic_vector) return std_logic is"
|
of << "(X : std_logic_vector) return std_logic is"
|
||||||
<< nl_string(indent(level))
|
<< nl_string(indent(level))
|
||||||
<< "variable R : std_logic := '" << unit << "';" << nl_string(level)
|
<< "variable R : std_logic := '" << unit << "';" << nl_string(level)
|
||||||
|
|
@ -106,7 +106,7 @@ void support_function::emit_reduction(std::ostream &of, int level,
|
||||||
void support_function::emit(std::ostream &of, int level) const
|
void support_function::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << nl_string(level) << "function " << function_name(type_);
|
of << nl_string(level) << "function " << function_name(type_);
|
||||||
|
|
||||||
switch (type_) {
|
switch (type_) {
|
||||||
case SF_UNSIGNED_TO_BOOLEAN:
|
case SF_UNSIGNED_TO_BOOLEAN:
|
||||||
of << "(X : unsigned) return Boolean is" << nl_string(level)
|
of << "(X : unsigned) return Boolean is" << nl_string(level)
|
||||||
|
|
@ -169,6 +169,6 @@ void support_function::emit(std::ostream &of, int level) const
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << nl_string(level) << "end function;";
|
of << nl_string(level) << "end function;";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ private:
|
||||||
void emit_ternary(std::ostream &of, int level) const;
|
void emit_ternary(std::ostream &of, int level) const;
|
||||||
void emit_reduction(std::ostream &of, int level, const char *op,
|
void emit_reduction(std::ostream &of, int level, const char *op,
|
||||||
char unit) const;
|
char unit) const;
|
||||||
|
|
||||||
support_function_t type_;
|
support_function_t type_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ void debug_msg(const char *fmt, ...)
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
|
|
||||||
if (std::strcmp(ivl_design_flag(g_design, "debug"), "")) {
|
if (std::strcmp(ivl_design_flag(g_design, "debug"), "")) {
|
||||||
std::fputs("[DEBUG] ", stdout);
|
std::fputs("[DEBUG] ", stdout);
|
||||||
std::vprintf(fmt, args);
|
std::vprintf(fmt, args);
|
||||||
std::putchar('\n');
|
std::putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
@ -127,10 +127,10 @@ extern "C" int target_design(ivl_design_t des)
|
||||||
|
|
||||||
emit_all_entities(outfile, max_depth);
|
emit_all_entities(outfile, max_depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up
|
// Clean up
|
||||||
free_all_vhdl_objects();
|
free_all_vhdl_objects();
|
||||||
|
|
||||||
return g_errors;
|
return g_errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ std::string nl_string(int level)
|
||||||
{
|
{
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
newline(ss, level);
|
newline(ss, level);
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -98,7 +98,7 @@ void vhdl_element::print() const
|
||||||
// This records the pointer allocated in a static field of vhdl_element
|
// This records the pointer allocated in a static field of vhdl_element
|
||||||
// so we can delete it just before the code generator exits.
|
// so we can delete it just before the code generator exits.
|
||||||
void* vhdl_element::operator new(size_t size) throw (bad_alloc)
|
void* vhdl_element::operator new(size_t size) throw (bad_alloc)
|
||||||
{
|
{
|
||||||
// Let the default new handle the allocation
|
// Let the default new handle the allocation
|
||||||
void* ptr = ::operator new(size);
|
void* ptr = ::operator new(size);
|
||||||
|
|
||||||
|
|
@ -115,7 +115,7 @@ void* vhdl_element::operator new(size_t size) throw (bad_alloc)
|
||||||
// This just sets the corresponding pointer in vhdl_element::allocated_
|
// This just sets the corresponding pointer in vhdl_element::allocated_
|
||||||
// to NULL (since it's safe to delete a NULL pointer).
|
// to NULL (since it's safe to delete a NULL pointer).
|
||||||
void vhdl_element::operator delete(void* ptr)
|
void vhdl_element::operator delete(void* ptr)
|
||||||
{
|
{
|
||||||
// Let the default delete handle the deallocation
|
// Let the default delete handle the deallocation
|
||||||
::operator delete(ptr);
|
::operator delete(ptr);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ public:
|
||||||
|
|
||||||
void* operator new(size_t size) throw (std::bad_alloc);
|
void* operator new(size_t size) throw (std::bad_alloc);
|
||||||
void operator delete(void* ptr);
|
void operator delete(void* ptr);
|
||||||
|
|
||||||
virtual void emit(std::ostream &of, int level=0) const = 0;
|
virtual void emit(std::ostream &of, int level=0) const = 0;
|
||||||
void print() const;
|
void print() const;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,8 @@ template <class T>
|
||||||
void emit_children(std::ostream &of,
|
void emit_children(std::ostream &of,
|
||||||
const std::list<T*> &children,
|
const std::list<T*> &children,
|
||||||
int level, const char *delim = "",
|
int level, const char *delim = "",
|
||||||
bool trailing_newline = true)
|
bool trailing_newline = true)
|
||||||
{
|
{
|
||||||
// Don't indent if there are no children
|
// Don't indent if there are no children
|
||||||
if (children.empty())
|
if (children.empty())
|
||||||
newline(of, level);
|
newline(of, level);
|
||||||
|
|
|
||||||
|
|
@ -33,12 +33,12 @@ using namespace std;
|
||||||
vhdl_scope::vhdl_scope()
|
vhdl_scope::vhdl_scope()
|
||||||
: parent_(NULL), init_(false), sig_assign_(true)
|
: parent_(NULL), init_(false), sig_assign_(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_scope::~vhdl_scope()
|
vhdl_scope::~vhdl_scope()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_scope::set_initializing(bool i)
|
void vhdl_scope::set_initializing(bool i)
|
||||||
|
|
@ -109,7 +109,7 @@ vhdl_entity::vhdl_entity(const string& name, vhdl_arch *arch, int depth__)
|
||||||
|
|
||||||
vhdl_entity::~vhdl_entity()
|
vhdl_entity::~vhdl_entity()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_entity::add_port(vhdl_port_decl *decl)
|
void vhdl_entity::add_port(vhdl_port_decl *decl)
|
||||||
|
|
@ -126,7 +126,7 @@ void vhdl_entity::emit(std::ostream &of, int level) const
|
||||||
of << "use ieee.numeric_std.all;" << std::endl;
|
of << "use ieee.numeric_std.all;" << std::endl;
|
||||||
of << "use std.textio.all;" << std::endl;
|
of << "use std.textio.all;" << std::endl;
|
||||||
of << std::endl;
|
of << std::endl;
|
||||||
|
|
||||||
emit_comment(of, level);
|
emit_comment(of, level);
|
||||||
of << "entity " << name_ << " is";
|
of << "entity " << name_ << " is";
|
||||||
|
|
||||||
|
|
@ -136,7 +136,7 @@ void vhdl_entity::emit(std::ostream &of, int level) const
|
||||||
emit_children<vhdl_decl>(of, ports_.get_decls(), indent(level), ";");
|
emit_children<vhdl_decl>(of, ports_.get_decls(), indent(level), ";");
|
||||||
of << ");";
|
of << ");";
|
||||||
}
|
}
|
||||||
|
|
||||||
newline(of, level);
|
newline(of, level);
|
||||||
of << "end entity; ";
|
of << "end entity; ";
|
||||||
blank_line(of, level); // Extra blank line after entities
|
blank_line(of, level); // Extra blank line after entities
|
||||||
|
|
@ -154,7 +154,7 @@ vhdl_const_time* scale_time(const vhdl_entity* ent, uint64_t t)
|
||||||
void vhdl_entity::set_time_units(int units, int precision)
|
void vhdl_entity::set_time_units(int units, int precision)
|
||||||
{
|
{
|
||||||
int vhdl_units = std::min(units, precision);
|
int vhdl_units = std::min(units, precision);
|
||||||
|
|
||||||
if (vhdl_units >= -3)
|
if (vhdl_units >= -3)
|
||||||
time_unit_ = TIME_UNIT_MS;
|
time_unit_ = TIME_UNIT_MS;
|
||||||
else if (vhdl_units >= -6)
|
else if (vhdl_units >= -6)
|
||||||
|
|
@ -167,7 +167,7 @@ void vhdl_entity::set_time_units(int units, int precision)
|
||||||
|
|
||||||
vhdl_arch::~vhdl_arch()
|
vhdl_arch::~vhdl_arch()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_arch::add_stmt(vhdl_process *proc)
|
void vhdl_arch::add_stmt(vhdl_process *proc)
|
||||||
|
|
@ -213,7 +213,7 @@ void vhdl_process::emit(std::ostream &of, int level) const
|
||||||
if (name_.size() > 0)
|
if (name_.size() > 0)
|
||||||
of << name_ << ": ";
|
of << name_ << ": ";
|
||||||
of << "process ";
|
of << "process ";
|
||||||
|
|
||||||
int num_sens = sens_.size();
|
int num_sens = sens_.size();
|
||||||
if (num_sens > 0) {
|
if (num_sens > 0) {
|
||||||
of << "(";
|
of << "(";
|
||||||
|
|
@ -235,7 +235,7 @@ void vhdl_process::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
stmt_container::~stmt_container()
|
stmt_container::~stmt_container()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void stmt_container::add_stmt(vhdl_seq_stmt *stmt)
|
void stmt_container::add_stmt(vhdl_seq_stmt *stmt)
|
||||||
|
|
@ -257,18 +257,18 @@ void stmt_container::move_stmts_from(stmt_container *other)
|
||||||
|
|
||||||
void stmt_container::emit(std::ostream &of, int level, bool newline) const
|
void stmt_container::emit(std::ostream &of, int level, bool newline) const
|
||||||
{
|
{
|
||||||
emit_children<vhdl_seq_stmt>(of, stmts_, level, "", newline);
|
emit_children<vhdl_seq_stmt>(of, stmts_, level, "", newline);
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_comp_inst::vhdl_comp_inst(const char *inst_name, const char *comp_name)
|
vhdl_comp_inst::vhdl_comp_inst(const char *inst_name, const char *comp_name)
|
||||||
: comp_name_(comp_name), inst_name_(inst_name)
|
: comp_name_(comp_name), inst_name_(inst_name)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_comp_inst::~vhdl_comp_inst()
|
vhdl_comp_inst::~vhdl_comp_inst()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_comp_inst::map_port(const string& name, vhdl_expr *expr)
|
void vhdl_comp_inst::map_port(const string& name, vhdl_expr *expr)
|
||||||
|
|
@ -300,7 +300,7 @@ void vhdl_comp_inst::emit(std::ostream &of, int level) const
|
||||||
newline(of, indent(level));
|
newline(of, indent(level));
|
||||||
of << ")";
|
of << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ";";
|
of << ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -321,7 +321,7 @@ vhdl_component_decl *vhdl_component_decl::component_decl_for(vhdl_entity *ent)
|
||||||
(ent->get_name().c_str());
|
(ent->get_name().c_str());
|
||||||
|
|
||||||
decl->ports_ = ent->get_scope()->get_decls();
|
decl->ports_ = ent->get_scope()->get_decls();
|
||||||
|
|
||||||
return decl;
|
return decl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -337,14 +337,14 @@ void vhdl_component_decl::emit(std::ostream &of, int level) const
|
||||||
emit_children<vhdl_decl>(of, ports_, indent(level), ";");
|
emit_children<vhdl_decl>(of, ports_, indent(level), ";");
|
||||||
of << ");";
|
of << ");";
|
||||||
}
|
}
|
||||||
|
|
||||||
newline(of, level);
|
newline(of, level);
|
||||||
of << "end component;";
|
of << "end component;";
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_wait_stmt::~vhdl_wait_stmt()
|
vhdl_wait_stmt::~vhdl_wait_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_wait_stmt::emit(std::ostream &of, int level) const
|
void vhdl_wait_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -379,13 +379,13 @@ void vhdl_wait_stmt::emit(std::ostream &of, int level) const
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ";";
|
of << ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_decl::~vhdl_decl()
|
vhdl_decl::~vhdl_decl()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make a reference object to this declaration
|
// Make a reference object to this declaration
|
||||||
|
|
@ -401,7 +401,7 @@ const vhdl_type *vhdl_decl::get_type() const
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_decl::set_initial(vhdl_expr *initial)
|
void vhdl_decl::set_initial(vhdl_expr *initial)
|
||||||
{
|
{
|
||||||
if (!has_initial_) {
|
if (!has_initial_) {
|
||||||
assert(initial_ == NULL);
|
assert(initial_ == NULL);
|
||||||
initial_ = initial;
|
initial_ = initial;
|
||||||
|
|
@ -412,7 +412,7 @@ void vhdl_decl::set_initial(vhdl_expr *initial)
|
||||||
void vhdl_port_decl::emit(std::ostream &of, int level) const
|
void vhdl_port_decl::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << name_ << " : ";
|
of << name_ << " : ";
|
||||||
|
|
||||||
switch (mode_) {
|
switch (mode_) {
|
||||||
case VHDL_PORT_IN:
|
case VHDL_PORT_IN:
|
||||||
of << "in ";
|
of << "in ";
|
||||||
|
|
@ -427,7 +427,7 @@ void vhdl_port_decl::emit(std::ostream &of, int level) const
|
||||||
of << "buffer ";
|
of << "buffer ";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
type_->emit(of, level);
|
type_->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -451,12 +451,12 @@ void vhdl_var_decl::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << "variable " << name_ << " : ";
|
of << "variable " << name_ << " : ";
|
||||||
type_->emit(of, level);
|
type_->emit(of, level);
|
||||||
|
|
||||||
if (initial_) {
|
if (initial_) {
|
||||||
of << " := ";
|
of << " := ";
|
||||||
initial_->emit(of, level);
|
initial_->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ";";
|
of << ";";
|
||||||
emit_comment(of, level, true);
|
emit_comment(of, level, true);
|
||||||
}
|
}
|
||||||
|
|
@ -465,12 +465,12 @@ void vhdl_signal_decl::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << "signal " << name_ << " : ";
|
of << "signal " << name_ << " : ";
|
||||||
type_->emit(of, level);
|
type_->emit(of, level);
|
||||||
|
|
||||||
if (initial_) {
|
if (initial_) {
|
||||||
of << " := ";
|
of << " := ";
|
||||||
initial_->emit(of, level);
|
initial_->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ";";
|
of << ";";
|
||||||
emit_comment(of, level, true);
|
emit_comment(of, level, true);
|
||||||
}
|
}
|
||||||
|
|
@ -484,7 +484,7 @@ void vhdl_type_decl::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_expr::~vhdl_expr()
|
vhdl_expr::~vhdl_expr()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_expr_list::add_expr(vhdl_expr *e)
|
void vhdl_expr_list::add_expr(vhdl_expr *e)
|
||||||
|
|
@ -494,13 +494,13 @@ void vhdl_expr_list::add_expr(vhdl_expr *e)
|
||||||
|
|
||||||
vhdl_expr_list::~vhdl_expr_list()
|
vhdl_expr_list::~vhdl_expr_list()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_expr_list::emit(std::ostream &of, int level) const
|
void vhdl_expr_list::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << "(";
|
of << "(";
|
||||||
|
|
||||||
int size = exprs_.size();
|
int size = exprs_.size();
|
||||||
std::list<vhdl_expr*>::const_iterator it;
|
std::list<vhdl_expr*>::const_iterator it;
|
||||||
for (it = exprs_.begin(); it != exprs_.end(); ++it) {
|
for (it = exprs_.begin(); it != exprs_.end(); ++it) {
|
||||||
|
|
@ -522,7 +522,7 @@ void vhdl_pcall_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_var_ref::~vhdl_var_ref()
|
vhdl_var_ref::~vhdl_var_ref()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_var_ref::set_slice(vhdl_expr *s, int w)
|
void vhdl_var_ref::set_slice(vhdl_expr *s, int w)
|
||||||
|
|
@ -531,21 +531,21 @@ void vhdl_var_ref::set_slice(vhdl_expr *s, int w)
|
||||||
|
|
||||||
slice_ = s;
|
slice_ = s;
|
||||||
slice_width_ = w;
|
slice_width_ = w;
|
||||||
|
|
||||||
vhdl_type_name_t tname = type_->get_name();
|
vhdl_type_name_t tname = type_->get_name();
|
||||||
if (tname == VHDL_TYPE_ARRAY) {
|
if (tname == VHDL_TYPE_ARRAY) {
|
||||||
type_ = type_->get_base();
|
type_ = type_->get_base();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert(tname == VHDL_TYPE_UNSIGNED || tname == VHDL_TYPE_SIGNED);
|
assert(tname == VHDL_TYPE_UNSIGNED || tname == VHDL_TYPE_SIGNED);
|
||||||
|
|
||||||
if (w > 0)
|
if (w > 0)
|
||||||
type_ = new vhdl_type(tname, w);
|
type_ = new vhdl_type(tname, w);
|
||||||
else
|
else
|
||||||
type_ = vhdl_type::std_logic();
|
type_ = vhdl_type::std_logic();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_var_ref::emit(std::ostream &of, int level) const
|
void vhdl_var_ref::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << name_;
|
of << name_;
|
||||||
|
|
@ -565,7 +565,7 @@ void vhdl_const_string::emit(std::ostream &of, int level) const
|
||||||
// In some instances a string literal can be ambiguous between
|
// In some instances a string literal can be ambiguous between
|
||||||
// a String type and some other types (e.g. std_logic_vector)
|
// a String type and some other types (e.g. std_logic_vector)
|
||||||
// The explicit cast to String removes this ambiguity (although
|
// The explicit cast to String removes this ambiguity (although
|
||||||
// isn't always strictly necessary)
|
// isn't always strictly necessary)
|
||||||
of << "String'(\"" << value_ << "\")";
|
of << "String'(\"" << value_ << "\")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -583,7 +583,7 @@ void vhdl_fcall::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_abstract_assign_stmt::~vhdl_abstract_assign_stmt()
|
vhdl_abstract_assign_stmt::~vhdl_abstract_assign_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_nbassign_stmt::emit(std::ostream &of, int level) const
|
void vhdl_nbassign_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -596,7 +596,7 @@ void vhdl_nbassign_stmt::emit(std::ostream &of, int level) const
|
||||||
of << " after ";
|
of << " after ";
|
||||||
after_->emit(of, level);
|
after_->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ";";
|
of << ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -609,12 +609,12 @@ void vhdl_assign_stmt::emit(std::ostream &of, int level) const
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_const_bits::vhdl_const_bits(const char *value, int width, bool issigned,
|
vhdl_const_bits::vhdl_const_bits(const char *value, int width, bool issigned,
|
||||||
bool qualify)
|
bool qualify)
|
||||||
: vhdl_expr(issigned ? vhdl_type::nsigned(width)
|
: vhdl_expr(issigned ? vhdl_type::nsigned(width)
|
||||||
: vhdl_type::nunsigned(width), true),
|
: vhdl_type::nunsigned(width), true),
|
||||||
qualified_(qualify),
|
qualified_(qualify),
|
||||||
signed_(issigned)
|
signed_(issigned)
|
||||||
{
|
{
|
||||||
// Can't rely on value being NULL-terminated
|
// Can't rely on value being NULL-terminated
|
||||||
while (width--)
|
while (width--)
|
||||||
value_.push_back(*value++);
|
value_.push_back(*value++);
|
||||||
|
|
@ -644,9 +644,9 @@ void vhdl_const_bits::emit(std::ostream &of, int level) const
|
||||||
&& !has_meta_bits() && bits <= 64 && bits % 4 == 0) {
|
&& !has_meta_bits() && bits <= 64 && bits % 4 == 0) {
|
||||||
of << "X\"" << hex << setfill('0') << setw(bits / 4) << ival;
|
of << "X\"" << hex << setfill('0') << setw(bits / 4) << ival;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
of << "\"";
|
of << "\"";
|
||||||
|
|
||||||
std::string::const_reverse_iterator it;
|
std::string::const_reverse_iterator it;
|
||||||
for (it = value_.rbegin(); it != value_.rend(); ++it)
|
for (it = value_.rbegin(); it != value_.rend(); ++it)
|
||||||
of << vl_to_vhdl_bit(*it);
|
of << vl_to_vhdl_bit(*it);
|
||||||
|
|
@ -684,7 +684,7 @@ void vhdl_const_time::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_cassign_stmt::~vhdl_cassign_stmt()
|
vhdl_cassign_stmt::~vhdl_cassign_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_cassign_stmt::add_condition(vhdl_expr *value, vhdl_expr *cond)
|
void vhdl_cassign_stmt::add_condition(vhdl_expr *value, vhdl_expr *cond)
|
||||||
|
|
@ -709,18 +709,18 @@ void vhdl_cassign_stmt::emit(std::ostream &of, int level) const
|
||||||
of << "else ";
|
of << "else ";
|
||||||
}
|
}
|
||||||
rhs_->emit(of, level);
|
rhs_->emit(of, level);
|
||||||
|
|
||||||
if (after_) {
|
if (after_) {
|
||||||
of << " after ";
|
of << " after ";
|
||||||
after_->emit(of, level);
|
after_->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ";";
|
of << ";";
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_assert_stmt::emit(std::ostream &of, int level) const
|
void vhdl_assert_stmt::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << "assert false"; // TODO: Allow arbitrary expression
|
of << "assert false"; // TODO: Allow arbitrary expression
|
||||||
of << " report \"" << reason_ << "\" severity failure;";
|
of << " report \"" << reason_ << "\" severity failure;";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -733,7 +733,7 @@ vhdl_if_stmt::vhdl_if_stmt(vhdl_expr *test)
|
||||||
|
|
||||||
vhdl_if_stmt::~vhdl_if_stmt()
|
vhdl_if_stmt::~vhdl_if_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt_container *vhdl_if_stmt::add_elsif(vhdl_expr *test)
|
stmt_container *vhdl_if_stmt::add_elsif(vhdl_expr *test)
|
||||||
|
|
@ -746,7 +746,7 @@ stmt_container *vhdl_if_stmt::add_elsif(vhdl_expr *test)
|
||||||
void vhdl_if_stmt::emit(std::ostream &of, int level) const
|
void vhdl_if_stmt::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
emit_comment(of, level);
|
emit_comment(of, level);
|
||||||
|
|
||||||
of << "if ";
|
of << "if ";
|
||||||
test_->emit(of, level);
|
test_->emit(of, level);
|
||||||
of << " then";
|
of << " then";
|
||||||
|
|
@ -759,7 +759,7 @@ void vhdl_if_stmt::emit(std::ostream &of, int level) const
|
||||||
of << " then";
|
of << " then";
|
||||||
(*it).container->emit(of, level);
|
(*it).container->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!else_part_.empty()) {
|
if (!else_part_.empty()) {
|
||||||
of << "else";
|
of << "else";
|
||||||
else_part_.emit(of, level);
|
else_part_.emit(of, level);
|
||||||
|
|
@ -769,7 +769,7 @@ void vhdl_if_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_unaryop_expr::~vhdl_unaryop_expr()
|
vhdl_unaryop_expr::~vhdl_unaryop_expr()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_unaryop_expr::emit(std::ostream &of, int level) const
|
void vhdl_unaryop_expr::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -797,7 +797,7 @@ vhdl_binop_expr::vhdl_binop_expr(vhdl_expr *left, vhdl_binop_t op,
|
||||||
|
|
||||||
vhdl_binop_expr::~vhdl_binop_expr()
|
vhdl_binop_expr::~vhdl_binop_expr()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_binop_expr::add_expr(vhdl_expr *e)
|
void vhdl_binop_expr::add_expr(vhdl_expr *e)
|
||||||
|
|
@ -812,7 +812,7 @@ void vhdl_binop_expr::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
of << "(";
|
of << "(";
|
||||||
|
|
||||||
assert(operands_.size() > 0);
|
assert(operands_.size() > 0);
|
||||||
std::list<vhdl_expr*>::const_iterator it = operands_.begin();
|
std::list<vhdl_expr*>::const_iterator it = operands_.begin();
|
||||||
|
|
||||||
(*it)->emit(of, level);
|
(*it)->emit(of, level);
|
||||||
|
|
@ -826,14 +826,14 @@ void vhdl_binop_expr::emit(std::ostream &of, int level) const
|
||||||
of << " " << ops[op_] << " ";
|
of << " " << ops[op_] << " ";
|
||||||
|
|
||||||
(*it)->emit(of, level);
|
(*it)->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ")";
|
of << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_bit_spec_expr::~vhdl_bit_spec_expr()
|
vhdl_bit_spec_expr::~vhdl_bit_spec_expr()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_bit_spec_expr::add_bit(int bit, vhdl_expr *e)
|
void vhdl_bit_spec_expr::add_bit(int bit, vhdl_expr *e)
|
||||||
|
|
@ -845,7 +845,7 @@ void vhdl_bit_spec_expr::add_bit(int bit, vhdl_expr *e)
|
||||||
void vhdl_bit_spec_expr::emit(std::ostream &of, int level) const
|
void vhdl_bit_spec_expr::emit(std::ostream &of, int level) const
|
||||||
{
|
{
|
||||||
of << "(";
|
of << "(";
|
||||||
|
|
||||||
std::list<bit_map>::const_iterator it;
|
std::list<bit_map>::const_iterator it;
|
||||||
it = bits_.begin();
|
it = bits_.begin();
|
||||||
while (it != bits_.end()) {
|
while (it != bits_.end()) {
|
||||||
|
|
@ -859,13 +859,13 @@ void vhdl_bit_spec_expr::emit(std::ostream &of, int level) const
|
||||||
of << (bits_.empty() ? "" : ", ") << "others => ";
|
of << (bits_.empty() ? "" : ", ") << "others => ";
|
||||||
others_->emit(of, level);
|
others_->emit(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << ")";
|
of << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_case_branch::~vhdl_case_branch()
|
vhdl_case_branch::~vhdl_case_branch()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_case_branch::emit(std::ostream &of, int level) const
|
void vhdl_case_branch::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -878,7 +878,7 @@ void vhdl_case_branch::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_case_stmt::~vhdl_case_stmt()
|
vhdl_case_stmt::~vhdl_case_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_case_stmt::emit(std::ostream &of, int level) const
|
void vhdl_case_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -897,13 +897,13 @@ void vhdl_case_stmt::emit(std::ostream &of, int level) const
|
||||||
else
|
else
|
||||||
newline(of, level);
|
newline(of, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
of << "end case;";
|
of << "end case;";
|
||||||
}
|
}
|
||||||
|
|
||||||
vhdl_while_stmt::~vhdl_while_stmt()
|
vhdl_while_stmt::~vhdl_while_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_while_stmt::emit(std::ostream &of, int level) const
|
void vhdl_while_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -923,7 +923,7 @@ void vhdl_loop_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_for_stmt::~vhdl_for_stmt()
|
vhdl_for_stmt::~vhdl_for_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_for_stmt::emit(std::ostream &of, int level) const
|
void vhdl_for_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -981,7 +981,7 @@ void vhdl_param_decl::emit(std::ostream &of, int level) const
|
||||||
|
|
||||||
vhdl_with_select_stmt::~vhdl_with_select_stmt()
|
vhdl_with_select_stmt::~vhdl_with_select_stmt()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vhdl_with_select_stmt::emit(std::ostream &of, int level) const
|
void vhdl_with_select_stmt::emit(std::ostream &of, int level) const
|
||||||
|
|
@ -989,12 +989,12 @@ void vhdl_with_select_stmt::emit(std::ostream &of, int level) const
|
||||||
of << "with ";
|
of << "with ";
|
||||||
test_->emit(of, level);
|
test_->emit(of, level);
|
||||||
of << " select";
|
of << " select";
|
||||||
emit_comment(of, level, true);
|
emit_comment(of, level, true);
|
||||||
newline(of, indent(level));
|
newline(of, indent(level));
|
||||||
|
|
||||||
out_->emit(of, level);
|
out_->emit(of, level);
|
||||||
of << " <= ";
|
of << " <= ";
|
||||||
|
|
||||||
when_list_t::const_iterator it = whens_.begin();
|
when_list_t::const_iterator it = whens_.begin();
|
||||||
while (it != whens_.end()) {
|
while (it != whens_.end()) {
|
||||||
(*it).value->emit(of, level);
|
(*it).value->emit(of, level);
|
||||||
|
|
@ -1004,7 +1004,7 @@ void vhdl_with_select_stmt::emit(std::ostream &of, int level) const
|
||||||
}
|
}
|
||||||
of << " when ";
|
of << " when ";
|
||||||
(*it).cond->emit(of, level);
|
(*it).cond->emit(of, level);
|
||||||
|
|
||||||
if (++it != whens_.end() || others_ != NULL) {
|
if (++it != whens_.end() || others_ != NULL) {
|
||||||
of << ",";
|
of << ",";
|
||||||
newline(of, indent(level));
|
newline(of, indent(level));
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ public:
|
||||||
|
|
||||||
const vhdl_type *get_type() const { return type_; }
|
const vhdl_type *get_type() const { return type_; }
|
||||||
bool constant() const { return isconst_; }
|
bool constant() const { return isconst_; }
|
||||||
|
|
||||||
vhdl_expr *cast(const vhdl_type *to);
|
vhdl_expr *cast(const vhdl_type *to);
|
||||||
virtual vhdl_expr *resize(int newwidth);
|
virtual vhdl_expr *resize(int newwidth);
|
||||||
virtual vhdl_expr *to_boolean();
|
virtual vhdl_expr *to_boolean();
|
||||||
|
|
@ -63,7 +63,7 @@ public:
|
||||||
vhdl_expr *slice = NULL)
|
vhdl_expr *slice = NULL)
|
||||||
: vhdl_expr(type), name_(name), slice_(slice), slice_width_(0) {}
|
: vhdl_expr(type), name_(name), slice_(slice), slice_width_(0) {}
|
||||||
~vhdl_var_ref();
|
~vhdl_var_ref();
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
const std::string &get_name() const { return name_; }
|
const std::string &get_name() const { return name_; }
|
||||||
void set_name(const std::string &name) { name_ = name; }
|
void set_name(const std::string &name) { name_ = name; }
|
||||||
|
|
@ -186,7 +186,7 @@ private:
|
||||||
int64_t bits_to_int() const;
|
int64_t bits_to_int() const;
|
||||||
char sign_bit() const;
|
char sign_bit() const;
|
||||||
bool has_meta_bits() const;
|
bool has_meta_bits() const;
|
||||||
|
|
||||||
std::string value_;
|
std::string value_;
|
||||||
bool qualified_, signed_;
|
bool qualified_, signed_;
|
||||||
};
|
};
|
||||||
|
|
@ -243,7 +243,7 @@ private:
|
||||||
class vhdl_expr_list : public vhdl_element {
|
class vhdl_expr_list : public vhdl_element {
|
||||||
public:
|
public:
|
||||||
~vhdl_expr_list();
|
~vhdl_expr_list();
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
bool empty() const { return exprs_.empty(); }
|
bool empty() const { return exprs_.empty(); }
|
||||||
void add_expr(vhdl_expr *e);
|
void add_expr(vhdl_expr *e);
|
||||||
|
|
@ -315,7 +315,7 @@ public:
|
||||||
vhdl_with_select_stmt(vhdl_expr *test, vhdl_var_ref *out)
|
vhdl_with_select_stmt(vhdl_expr *test, vhdl_var_ref *out)
|
||||||
: test_(test), out_(out), others_(NULL) {}
|
: test_(test), out_(out), others_(NULL) {}
|
||||||
~vhdl_with_select_stmt();
|
~vhdl_with_select_stmt();
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
void add_condition(vhdl_expr *value, vhdl_expr *cond, vhdl_expr *delay=NULL);
|
void add_condition(vhdl_expr *value, vhdl_expr *cond, vhdl_expr *delay=NULL);
|
||||||
void add_default(vhdl_expr* value);
|
void add_default(vhdl_expr* value);
|
||||||
|
|
@ -343,7 +343,7 @@ public:
|
||||||
class stmt_container {
|
class stmt_container {
|
||||||
public:
|
public:
|
||||||
~stmt_container();
|
~stmt_container();
|
||||||
|
|
||||||
void add_stmt(vhdl_seq_stmt *stmt);
|
void add_stmt(vhdl_seq_stmt *stmt);
|
||||||
void move_stmts_from(stmt_container *other);
|
void move_stmts_from(stmt_container *other);
|
||||||
void emit(std::ostream &of, int level, bool newline=true) const;
|
void emit(std::ostream &of, int level, bool newline=true) const;
|
||||||
|
|
@ -369,7 +369,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
vhdl_var_ref *lhs_;
|
vhdl_var_ref *lhs_;
|
||||||
vhdl_expr *rhs_, *after_;
|
vhdl_expr *rhs_, *after_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -380,7 +380,7 @@ class vhdl_nbassign_stmt : public vhdl_abstract_assign_stmt {
|
||||||
public:
|
public:
|
||||||
vhdl_nbassign_stmt(vhdl_var_ref *lhs, vhdl_expr *rhs)
|
vhdl_nbassign_stmt(vhdl_var_ref *lhs, vhdl_expr *rhs)
|
||||||
: vhdl_abstract_assign_stmt(lhs, rhs) {}
|
: vhdl_abstract_assign_stmt(lhs, rhs) {}
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -412,7 +412,7 @@ public:
|
||||||
vhdl_expr *expr = NULL)
|
vhdl_expr *expr = NULL)
|
||||||
: type_(type), expr_(expr) {}
|
: type_(type), expr_(expr) {}
|
||||||
~vhdl_wait_stmt();
|
~vhdl_wait_stmt();
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
void add_sensitivity(const std::string &s) { sensitivity_.push_back(s); }
|
void add_sensitivity(const std::string &s) { sensitivity_.push_back(s); }
|
||||||
vhdl_wait_type_t get_type() const { return type_; }
|
vhdl_wait_type_t get_type() const { return type_; }
|
||||||
|
|
@ -454,7 +454,7 @@ private:
|
||||||
vhdl_expr *test;
|
vhdl_expr *test;
|
||||||
stmt_container *container;
|
stmt_container *container;
|
||||||
};
|
};
|
||||||
|
|
||||||
vhdl_expr *test_;
|
vhdl_expr *test_;
|
||||||
stmt_container then_part_, else_part_;
|
stmt_container then_part_, else_part_;
|
||||||
std::list<elsif> elsif_parts_;
|
std::list<elsif> elsif_parts_;
|
||||||
|
|
@ -495,7 +495,7 @@ private:
|
||||||
class vhdl_loop_stmt : public vhdl_seq_stmt {
|
class vhdl_loop_stmt : public vhdl_seq_stmt {
|
||||||
public:
|
public:
|
||||||
virtual ~vhdl_loop_stmt() {}
|
virtual ~vhdl_loop_stmt() {}
|
||||||
|
|
||||||
stmt_container *get_container() { return &stmts_; }
|
stmt_container *get_container() { return &stmts_; }
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
private:
|
private:
|
||||||
|
|
@ -519,7 +519,7 @@ public:
|
||||||
vhdl_for_stmt(const char *lname, vhdl_expr *from, vhdl_expr *to)
|
vhdl_for_stmt(const char *lname, vhdl_expr *from, vhdl_expr *to)
|
||||||
: lname_(lname), from_(from), to_(to) {}
|
: lname_(lname), from_(from), to_(to) {}
|
||||||
~vhdl_for_stmt();
|
~vhdl_for_stmt();
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
private:
|
private:
|
||||||
const char *lname_;
|
const char *lname_;
|
||||||
|
|
@ -534,7 +534,7 @@ private:
|
||||||
class vhdl_pcall_stmt : public vhdl_seq_stmt {
|
class vhdl_pcall_stmt : public vhdl_seq_stmt {
|
||||||
public:
|
public:
|
||||||
vhdl_pcall_stmt(const char *name) : name_(name) {}
|
vhdl_pcall_stmt(const char *name) : name_(name) {}
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
void add_expr(vhdl_expr *e) { exprs_.add_expr(e); }
|
void add_expr(vhdl_expr *e) { exprs_.add_expr(e); }
|
||||||
private:
|
private:
|
||||||
|
|
@ -564,12 +564,12 @@ public:
|
||||||
|
|
||||||
// Return a new reference to this declaration
|
// Return a new reference to this declaration
|
||||||
vhdl_var_ref* make_ref() const;
|
vhdl_var_ref* make_ref() const;
|
||||||
|
|
||||||
// The different sorts of assignment statement
|
// The different sorts of assignment statement
|
||||||
// ASSIGN_CONST is used to generate a variable to shadow a
|
// ASSIGN_CONST is used to generate a variable to shadow a
|
||||||
// constant that cannot be assigned to (e.g. a function parameter)
|
// constant that cannot be assigned to (e.g. a function parameter)
|
||||||
enum assign_type_t { ASSIGN_BLOCK, ASSIGN_NONBLOCK, ASSIGN_CONST };
|
enum assign_type_t { ASSIGN_BLOCK, ASSIGN_NONBLOCK, ASSIGN_CONST };
|
||||||
|
|
||||||
// Get the sort of assignment statement to generate for
|
// Get the sort of assignment statement to generate for
|
||||||
// assignemnts to this declaration
|
// assignemnts to this declaration
|
||||||
// For some sorts of declarations it doesn't make sense
|
// For some sorts of declarations it doesn't make sense
|
||||||
|
|
@ -580,7 +580,7 @@ public:
|
||||||
|
|
||||||
// True if this declaration can be read from
|
// True if this declaration can be read from
|
||||||
virtual bool is_readable() const { return true; }
|
virtual bool is_readable() const { return true; }
|
||||||
|
|
||||||
// Modify this declaration so it can be read from
|
// Modify this declaration so it can be read from
|
||||||
// This does nothing for most declaration types
|
// This does nothing for most declaration types
|
||||||
virtual void ensure_readable() {}
|
virtual void ensure_readable() {}
|
||||||
|
|
@ -592,7 +592,7 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::list<vhdl_decl*> decl_list_t;
|
typedef std::list<vhdl_decl*> decl_list_t;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A forward declaration of a component. At the moment it is assumed
|
* A forward declaration of a component. At the moment it is assumed
|
||||||
|
|
@ -722,7 +722,7 @@ class vhdl_scope {
|
||||||
public:
|
public:
|
||||||
vhdl_scope();
|
vhdl_scope();
|
||||||
~vhdl_scope();
|
~vhdl_scope();
|
||||||
|
|
||||||
void add_decl(vhdl_decl *decl);
|
void add_decl(vhdl_decl *decl);
|
||||||
void add_forward_decl(vhdl_decl *decl);
|
void add_forward_decl(vhdl_decl *decl);
|
||||||
vhdl_decl *get_decl(const std::string &name) const;
|
vhdl_decl *get_decl(const std::string &name) const;
|
||||||
|
|
@ -730,7 +730,7 @@ public:
|
||||||
bool name_collides(const string& name) const;
|
bool name_collides(const string& name) const;
|
||||||
bool contained_within(const vhdl_scope *other) const;
|
bool contained_within(const vhdl_scope *other) const;
|
||||||
vhdl_scope *get_parent() const;
|
vhdl_scope *get_parent() const;
|
||||||
|
|
||||||
bool empty() const { return decls_.empty(); }
|
bool empty() const { return decls_.empty(); }
|
||||||
const decl_list_t &get_decls() const { return decls_; }
|
const decl_list_t &get_decls() const { return decls_; }
|
||||||
void set_parent(vhdl_scope *p) { parent_ = p; }
|
void set_parent(vhdl_scope *p) { parent_ = p; }
|
||||||
|
|
@ -756,7 +756,7 @@ class vhdl_procedural {
|
||||||
public:
|
public:
|
||||||
vhdl_procedural() : contains_wait_stmt_(false) {}
|
vhdl_procedural() : contains_wait_stmt_(false) {}
|
||||||
virtual ~vhdl_procedural() {}
|
virtual ~vhdl_procedural() {}
|
||||||
|
|
||||||
virtual stmt_container *get_container() { return &stmts_; }
|
virtual stmt_container *get_container() { return &stmts_; }
|
||||||
virtual vhdl_scope *get_scope() { return &scope_; }
|
virtual vhdl_scope *get_scope() { return &scope_; }
|
||||||
|
|
||||||
|
|
@ -778,7 +778,7 @@ class vhdl_function : public vhdl_decl, public vhdl_procedural {
|
||||||
friend class vhdl_forward_fdecl;
|
friend class vhdl_forward_fdecl;
|
||||||
public:
|
public:
|
||||||
vhdl_function(const char *name, vhdl_type *ret_type);
|
vhdl_function(const char *name, vhdl_type *ret_type);
|
||||||
|
|
||||||
virtual void emit(std::ostream &of, int level) const;
|
virtual void emit(std::ostream &of, int level) const;
|
||||||
vhdl_scope *get_scope() { return &variables_; }
|
vhdl_scope *get_scope() { return &variables_; }
|
||||||
void add_param(vhdl_param_decl *p) { scope_.add_decl(p); }
|
void add_param(vhdl_param_decl *p) { scope_.add_decl(p); }
|
||||||
|
|
@ -848,7 +848,7 @@ public:
|
||||||
|
|
||||||
void set_time_units(int units, int precision);
|
void set_time_units(int units, int precision);
|
||||||
friend vhdl_const_time* scale_time(const vhdl_entity* ent, uint64_t t);
|
friend vhdl_const_time* scale_time(const vhdl_entity* ent, uint64_t t);
|
||||||
|
|
||||||
// Each entity has an associated depth which is how deep in
|
// Each entity has an associated depth which is how deep in
|
||||||
// the Verilog module hierarchy it was found
|
// the Verilog module hierarchy it was found
|
||||||
// This is used to limit the maximum depth of modules emitted
|
// This is used to limit the maximum depth of modules emitted
|
||||||
|
|
@ -857,7 +857,7 @@ private:
|
||||||
std::string name_;
|
std::string name_;
|
||||||
vhdl_arch *arch_; // Entity may only have a single architecture
|
vhdl_arch *arch_; // Entity may only have a single architecture
|
||||||
vhdl_scope ports_;
|
vhdl_scope ports_;
|
||||||
|
|
||||||
// Entities have an associated VHDL time unit
|
// Entities have an associated VHDL time unit
|
||||||
// This is used to implement the Verilog timescale directive
|
// This is used to implement the Verilog timescale directive
|
||||||
time_unit_t time_unit_;
|
time_unit_t time_unit_;
|
||||||
|
|
|
||||||
|
|
@ -28,11 +28,10 @@ ivl_design_t get_vhdl_design();
|
||||||
vhdl_var_ref *nexus_to_var_ref(vhdl_scope *arch_scope, ivl_nexus_t nexus);
|
vhdl_var_ref *nexus_to_var_ref(vhdl_scope *arch_scope, ivl_nexus_t nexus);
|
||||||
vhdl_var_ref* readable_ref(vhdl_scope* scope, ivl_nexus_t nex);
|
vhdl_var_ref* readable_ref(vhdl_scope* scope, ivl_nexus_t nex);
|
||||||
string make_safe_name(ivl_signal_t sig);
|
string make_safe_name(ivl_signal_t sig);
|
||||||
|
|
||||||
int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
int draw_stask_display(vhdl_procedural *proc, stmt_container *container,
|
||||||
ivl_statement_t stmt, bool newline = true);
|
ivl_statement_t stmt, bool newline = true);
|
||||||
void prune_wait_for_0(stmt_container *container);
|
void prune_wait_for_0(stmt_container *container);
|
||||||
void require_support_function(support_function_t f);
|
void require_support_function(support_function_t f);
|
||||||
|
|
||||||
#endif /* #ifndef INC_VHDL_TARGET_H */
|
#endif /* #ifndef INC_VHDL_TARGET_H */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ std::string vhdl_type::get_string() const
|
||||||
case VHDL_TYPE_STD_ULOGIC:
|
case VHDL_TYPE_STD_ULOGIC:
|
||||||
return std::string("std_ulogic");
|
return std::string("std_ulogic");
|
||||||
case VHDL_TYPE_STD_LOGIC_VECTOR:
|
case VHDL_TYPE_STD_LOGIC_VECTOR:
|
||||||
return std::string("std_logic_vector");
|
return std::string("std_logic_vector");
|
||||||
case VHDL_TYPE_STRING:
|
case VHDL_TYPE_STRING:
|
||||||
return std::string("String");
|
return std::string("String");
|
||||||
case VHDL_TYPE_LINE:
|
case VHDL_TYPE_LINE:
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ public:
|
||||||
|
|
||||||
// Copy constructor
|
// Copy constructor
|
||||||
vhdl_type(const vhdl_type &other);
|
vhdl_type(const vhdl_type &other);
|
||||||
|
|
||||||
virtual ~vhdl_type();
|
virtual ~vhdl_type();
|
||||||
|
|
||||||
void emit(std::ostream &of, int level) const;
|
void emit(std::ostream &of, int level) const;
|
||||||
|
|
@ -69,7 +69,7 @@ public:
|
||||||
int get_width() const { return msb_ - lsb_ + 1; }
|
int get_width() const { return msb_ - lsb_ + 1; }
|
||||||
int get_msb() const { return msb_; }
|
int get_msb() const { return msb_; }
|
||||||
int get_lsb() const { return lsb_; }
|
int get_lsb() const { return lsb_; }
|
||||||
|
|
||||||
// Common types
|
// Common types
|
||||||
static vhdl_type *std_logic();
|
static vhdl_type *std_logic();
|
||||||
static vhdl_type *std_ulogic();
|
static vhdl_type *std_ulogic();
|
||||||
|
|
|
||||||
|
|
@ -2589,7 +2589,7 @@ static struct vector_info draw_select_unsized_literal(ivl_expr_t expr,
|
||||||
/* If we have an undefined index then just produce a 'bx result. */
|
/* If we have an undefined index then just produce a 'bx result. */
|
||||||
fprintf(vvp_out, " %%jmp/1 T_%d.%d, 4;\n", thread_count, lab_x);
|
fprintf(vvp_out, " %%jmp/1 T_%d.%d, 4;\n", thread_count, lab_x);
|
||||||
|
|
||||||
/* If the subv result is a magic constant, then make a copy in
|
/* If the subv result is a magic constant, then make a copy in
|
||||||
writable vector space and work from there instead. */
|
writable vector space and work from there instead. */
|
||||||
if (subv.base < 4) {
|
if (subv.base < 4) {
|
||||||
res.base = allocate_vector(subv.wid);
|
res.base = allocate_vector(subv.wid);
|
||||||
|
|
|
||||||
|
|
@ -769,7 +769,7 @@ static unsigned vpi_array_is_real(vvp_array_t arr)
|
||||||
assert(arr->array_count > 0);
|
assert(arr->array_count > 0);
|
||||||
struct __vpiRealVar*rsig = vpip_realvar_from_handle(arr->nets[0]);
|
struct __vpiRealVar*rsig = vpip_realvar_from_handle(arr->nets[0]);
|
||||||
if (rsig) {
|
if (rsig) {
|
||||||
struct __vpiSignal*vsig = vpip_signal_from_handle(arr->nets[0]);
|
struct __vpiSignal*vsig = vpip_signal_from_handle(arr->nets[0]);
|
||||||
assert(vsig == 0);
|
assert(vsig == 0);
|
||||||
return 1U;
|
return 1U;
|
||||||
}
|
}
|
||||||
|
|
@ -1503,7 +1503,6 @@ void vpip_array_word_change(struct __vpiCallback*cb, vpiHandle obj)
|
||||||
|
|
||||||
void vpip_array_change(struct __vpiCallback*cb, vpiHandle obj)
|
void vpip_array_change(struct __vpiCallback*cb, vpiHandle obj)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct __vpiArray*arr = ARRAY_HANDLE(obj);
|
struct __vpiArray*arr = ARRAY_HANDLE(obj);
|
||||||
cb->extra_data = -1; // This is a callback for every element.
|
cb->extra_data = -1; // This is a callback for every element.
|
||||||
cb->next = arr->vpi_callbacks;
|
cb->next = arr->vpi_callbacks;
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ void vvp_fun_concat::recv_vec4_pv(vvp_net_ptr_t port, const vvp_vector4_t&bit,
|
||||||
vvp_context_t)
|
vvp_context_t)
|
||||||
{
|
{
|
||||||
assert(bit.size() == wid);
|
assert(bit.size() == wid);
|
||||||
|
|
||||||
unsigned pdx = port.port();
|
unsigned pdx = port.port();
|
||||||
|
|
||||||
if (vwid != wid_[pdx]) {
|
if (vwid != wid_[pdx]) {
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ void waitable_hooks_s::run_waiting_threads_(vthread_t&threads)
|
||||||
vthread_t tmp = threads;
|
vthread_t tmp = threads;
|
||||||
if (tmp == 0) return;
|
if (tmp == 0) return;
|
||||||
threads = 0;
|
threads = 0;
|
||||||
|
|
||||||
vthread_schedule_list(tmp);
|
vthread_schedule_list(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
main .scope module, "main";
|
main .scope module, "main";
|
||||||
|
|
||||||
T0 %vpi_call 0 0 "$display", "Display the number: %b", 5'b0zx1;
|
T0 %vpi_call 0 0 "$display", "Display the number: %b", 5'b0zx1;
|
||||||
%end;
|
%end;
|
||||||
.thread T0;
|
.thread T0;
|
||||||
:file_names 2;
|
:file_names 2;
|
||||||
|
|
|
||||||
|
|
@ -65,9 +65,9 @@ extern void schedule_assign_array_word(vvp_array_t mem,
|
||||||
* Create an event to propagate the output of a net.
|
* Create an event to propagate the output of a net.
|
||||||
*/
|
*/
|
||||||
extern void schedule_propagate_plucked_vector(vvp_net_t*ptr,
|
extern void schedule_propagate_plucked_vector(vvp_net_t*ptr,
|
||||||
vvp_time64_t delay,
|
vvp_time64_t delay,
|
||||||
const vvp_vector4_t&val,
|
const vvp_vector4_t&val,
|
||||||
unsigned adr, unsigned wid);
|
unsigned adr, unsigned wid);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is very similar to schedule_assign_vector, but generates an
|
* This is very similar to schedule_assign_vector, but generates an
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ void vpip_mcd_init(FILE *log)
|
||||||
fd_table[idx].fp = NULL;
|
fd_table[idx].fp = NULL;
|
||||||
fd_table[idx].filename = NULL;
|
fd_table[idx].filename = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mcd_table[0].fp = stdout;
|
mcd_table[0].fp = stdout;
|
||||||
mcd_table[0].filename = strdup("stdout");
|
mcd_table[0].filename = strdup("stdout");
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -318,7 +318,7 @@ static void vthr_vec_get_value(vpiHandle ref, s_vpi_value*vp)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case vpiObjTypeVal:
|
case vpiObjTypeVal:
|
||||||
vp->format = vpiVectorVal;
|
vp->format = vpiVectorVal;
|
||||||
case vpiVectorVal:
|
case vpiVectorVal:
|
||||||
vp->value.vector = (s_vpi_vecval*)
|
vp->value.vector = (s_vpi_vecval*)
|
||||||
need_result_buf((wid+31)/32*sizeof(s_vpi_vecval), RBUF_VAL);
|
need_result_buf((wid+31)/32*sizeof(s_vpi_vecval), RBUF_VAL);
|
||||||
|
|
|
||||||
|
|
@ -1870,8 +1870,8 @@ void vvp_vector4array_aa::reset_instance(vvp_context_t context)
|
||||||
for (unsigned idx = 0 ; idx < words_ ; idx += 1) {
|
for (unsigned idx = 0 ; idx < words_ ; idx += 1) {
|
||||||
if (cell->abits_ptr_) {
|
if (cell->abits_ptr_) {
|
||||||
for (unsigned n = 0 ; n < cnt ; n += 1) {
|
for (unsigned n = 0 ; n < cnt ; n += 1) {
|
||||||
cell->abits_ptr_[n] = vvp_vector4_t::WORD_X_ABITS;
|
cell->abits_ptr_[n] = vvp_vector4_t::WORD_X_ABITS;
|
||||||
cell->bbits_ptr_[n] = vvp_vector4_t::WORD_X_BBITS;
|
cell->bbits_ptr_[n] = vvp_vector4_t::WORD_X_BBITS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cell++;
|
cell++;
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,6 @@ typedef void*vvp_context_item_t;
|
||||||
|
|
||||||
inline vvp_context_t vvp_allocate_context(unsigned nitem)
|
inline vvp_context_t vvp_allocate_context(unsigned nitem)
|
||||||
{
|
{
|
||||||
|
|
||||||
return (vvp_context_t)malloc((2 + nitem) * sizeof(void*));
|
return (vvp_context_t)malloc((2 + nitem) * sizeof(void*));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -394,7 +394,7 @@ static void __compile_real_net2(vvp_net_t*node, vvp_array_t array,
|
||||||
obj = vpip_make_real_var(name, node);
|
obj = vpip_make_real_var(name, node);
|
||||||
compile_vpi_symbol(my_label, obj);
|
compile_vpi_symbol(my_label, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
// REMOVE ME! Giving the net a label is a legacy of the times
|
// REMOVE ME! Giving the net a label is a legacy of the times
|
||||||
// when the .net was a functor of its own. In the long run, we
|
// when the .net was a functor of its own. In the long run, we
|
||||||
// must fix the code generator to not rely on the label of the
|
// must fix the code generator to not rely on the label of the
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue