Removed tests/xsthammer

This test is now available as 'vloghammer' in a seperate repository:
https://github.com/cliffordwolf/VlogHammer
This commit is contained in:
Clifford Wolf 2013-07-07 13:01:15 +02:00
parent cf885c4a28
commit 52d21a63ca
13 changed files with 0 additions and 1748 deletions

View File

@ -1,15 +0,0 @@
generate
generate.lst
rtl
xst
xst_temp
vivado
vivado_temp
quartus
quartus_temp
report
report_temp
check
check_temp
check_vivado
check_quartus

View File

@ -1,61 +0,0 @@
include generate.lst
test: $(TARGETS)
vivado: $(addprefix check_vivado/,$(notdir $(TARGETS)))
quartus: $(addprefix check_quartus/,$(notdir $(TARGETS)))
report:
ls check check_quartus/ check_vivado | grep '\.err$$' | sort -u | cut -f1 -d. | gawk '{ print "report/" $$0 ".html"; }' | xargs -r $(MAKE)
report/%.html:
bash report.sh $(notdir $(basename $@))
check/%.log: rtl/%.v xst/%.v
bash run-check.sh $(notdir $(basename $<))
check_vivado/%.log: rtl/%.v vivado/%.v
bash run-check.sh -vivado $(notdir $(basename $<))
check_quartus/%.log: rtl/%.v quartus/%.v
bash run-check.sh -quartus $(notdir $(basename $<))
xst/%.v: rtl/%.v
bash run-xst.sh $(notdir $(basename $<))
vivado/%.v: rtl/%.v
bash run-vivado.sh $(notdir $(basename $<))
quartus/%.v: rtl/%.v
bash run-quartus.sh $(notdir $(basename $<))
generate.lst: generate.cc
clang -Wall -o generate generate.cc -lstdc++
./generate
{ echo -n "TARGETS := "; ls rtl/ | sed 's,\.v$$,.log,; s,^,check/,;' | tr '\n' ' '; } > generate.lst
check_xl_cells:
../../yosys xl_cells_tb.ys
clean:
rm -rf generate generate.lst check_temp xst_temp
mrproper: clean
rm -rf rtl xst check
backup:
mkdir -p ~/.yosys/xhammer
tar cvzf ~/.yosys/xhammer/xst_files.tar.gz xst
tar cvzf ~/.yosys/xhammer/vivado_files.tar.gz vivado
tar cvzf ~/.yosys/xhammer/quartus_files.tar.gz quartus
restore:
tar xvzf ~/.yosys/xhammer/xst_files.tar.gz
tar xvzf ~/.yosys/xhammer/vivado_files.tar.gz
tar xvzf ~/.yosys/xhammer/quartus_files.tar.gz
.PHONY: test vivado quartus report check_xl_cells clean mrproper backup restore
.PRECIOUS: check/%.log xst/%.v vivado/%.v quartus/%.v rtl/%.v generate.lst

View File

@ -1,14 +0,0 @@
================================
This is work under construction!
================================
This is going to be a collection of auto-generated test cases. The goal is
to synthesize them with Yosys and Xilinx XST and perform formal equivialence
checks using the Yosys SAT-based equivialence checker. This will hopefully
reveal some bugs in both applications.. ;-)
Simply run 'make' to generate all test cases and run all the tests.
(Use 'make -j N' to use N parallel cores.)

View File

@ -1,569 +0,0 @@
// Based on the simulation models from /opt/altera/13.0/quartus/eda/sim_lib/cycloneiii_atoms.v
module cycloneiii_lcell_comb (dataa, datab, datac, datad, cin, combout, cout);
input dataa, datab, datac, datad, cin;
output combout, cout;
parameter lut_mask = 16'hFFFF;
parameter sum_lutc_input = "datac";
parameter dont_touch = "off";
parameter lpm_type = "cycloneiii_lcell_comb";
reg cout_tmp, combout_tmp;
reg [1:0] isum_lutc_input;
// 4-input LUT function
function lut4;
input [15:0] mask;
input dataa, datab, datac, datad;
begin
lut4 = datad ? ( datac ? ( datab ? ( dataa ? mask[15] : mask[14])
: ( dataa ? mask[13] : mask[12]))
: ( datab ? ( dataa ? mask[11] : mask[10])
: ( dataa ? mask[ 9] : mask[ 8])))
: ( datac ? ( datab ? ( dataa ? mask[ 7] : mask[ 6])
: ( dataa ? mask[ 5] : mask[ 4]))
: ( datab ? ( dataa ? mask[ 3] : mask[ 2])
: ( dataa ? mask[ 1] : mask[ 0])));
end
endfunction
initial
if (sum_lutc_input == "datac")
isum_lutc_input = 0;
else if (sum_lutc_input == "cin")
isum_lutc_input = 1;
else
isum_lutc_input = 2;
always @* begin
if (isum_lutc_input == 0) // datac
combout_tmp = lut4(lut_mask, dataa, datab, datac, datad);
else if (isum_lutc_input == 1) // cin
combout_tmp = lut4(lut_mask, dataa, datab, cin, datad);
cout_tmp = lut4(lut_mask, dataa, datab, cin, 'b0);
end
assign combout = combout_tmp;
assign cout = cout_tmp;
endmodule
// ----------------------------------------------------------------------
module cycloneiii_io_ibuf (i, ibar, o);
parameter differential_mode = "false";
parameter bus_hold = "false";
parameter simulate_z_as = "Z";
parameter lpm_type = "cycloneiii_io_ibuf";
input i, ibar;
output o;
assign o = i;
endmodule
// ----------------------------------------------------------------------
module cycloneiii_io_obuf (i, oe, seriesterminationcontrol, devoe, o, obar);
parameter open_drain_output = "false";
parameter bus_hold = "false";
parameter lpm_type = "cycloneiii_io_obuf";
input i, oe, devoe;
input [15:0] seriesterminationcontrol;
output o, obar;
assign o = i;
assign obar = ~i;
endmodule
// ----------------------------------------------------------------------
module cycloneiii_mac_data_reg (clk,
data,
ena,
aclr,
dataout
);
parameter data_width = 18;
// INPUT PORTS
input clk;
input [17 : 0] data;
input ena;
input aclr;
// OUTPUT PORTS
output [17:0] dataout;
// INTERNAL VARIABLES AND NETS
reg clk_last_value;
reg [17:0] dataout_tmp;
wire [17:0] dataout_wire;
// INTERNAL VARIABLES
wire [17:0] data_ipd;
wire enable;
wire no_clr;
reg d_viol;
reg ena_viol;
wire clk_ipd;
wire ena_ipd;
wire aclr_ipd;
// BUFFER INPUTS
buf (clk_ipd, clk);
buf (ena_ipd, ena);
buf (aclr_ipd, aclr);
buf (data_ipd[0], data[0]);
buf (data_ipd[1], data[1]);
buf (data_ipd[2], data[2]);
buf (data_ipd[3], data[3]);
buf (data_ipd[4], data[4]);
buf (data_ipd[5], data[5]);
buf (data_ipd[6], data[6]);
buf (data_ipd[7], data[7]);
buf (data_ipd[8], data[8]);
buf (data_ipd[9], data[9]);
buf (data_ipd[10], data[10]);
buf (data_ipd[11], data[11]);
buf (data_ipd[12], data[12]);
buf (data_ipd[13], data[13]);
buf (data_ipd[14], data[14]);
buf (data_ipd[15], data[15]);
buf (data_ipd[16], data[16]);
buf (data_ipd[17], data[17]);
assign enable = (!aclr_ipd) && (ena_ipd);
assign no_clr = (!aclr_ipd);
initial
begin
clk_last_value <= 'b0;
dataout_tmp <= 18'b0;
end
always @(clk_ipd or aclr_ipd)
begin
if (d_viol == 1'b1 || ena_viol == 1'b1)
begin
dataout_tmp <= 'bX;
end
else if (aclr_ipd == 1'b1)
begin
dataout_tmp <= 'b0;
end
else
begin
if ((clk_ipd === 1'b1) && (clk_last_value == 1'b0))
if (ena_ipd === 1'b1)
dataout_tmp <= data_ipd;
end
clk_last_value <= clk_ipd;
end // always
assign dataout_wire = dataout_tmp;
and (dataout[0], dataout_wire[0], 1'b1);
and (dataout[1], dataout_wire[1], 1'b1);
and (dataout[2], dataout_wire[2], 1'b1);
and (dataout[3], dataout_wire[3], 1'b1);
and (dataout[4], dataout_wire[4], 1'b1);
and (dataout[5], dataout_wire[5], 1'b1);
and (dataout[6], dataout_wire[6], 1'b1);
and (dataout[7], dataout_wire[7], 1'b1);
and (dataout[8], dataout_wire[8], 1'b1);
and (dataout[9], dataout_wire[9], 1'b1);
and (dataout[10], dataout_wire[10], 1'b1);
and (dataout[11], dataout_wire[11], 1'b1);
and (dataout[12], dataout_wire[12], 1'b1);
and (dataout[13], dataout_wire[13], 1'b1);
and (dataout[14], dataout_wire[14], 1'b1);
and (dataout[15], dataout_wire[15], 1'b1);
and (dataout[16], dataout_wire[16], 1'b1);
and (dataout[17], dataout_wire[17], 1'b1);
endmodule //cycloneiii_mac_data_reg
module cycloneiii_mac_sign_reg (
clk,
d,
ena,
aclr,
q
);
// INPUT PORTS
input clk;
input d;
input ena;
input aclr;
// OUTPUT PORTS
output q;
// INTERNAL VARIABLES
reg clk_last_value;
reg q_tmp;
reg ena_viol;
reg d_viol;
wire enable;
// DEFAULT VALUES THRO' PULLUPs
// tri1 aclr, ena;
wire d_ipd;
wire clk_ipd;
wire ena_ipd;
wire aclr_ipd;
buf (d_ipd, d);
buf (clk_ipd, clk);
buf (ena_ipd, ena);
buf (aclr_ipd, aclr);
assign enable = (!aclr_ipd) && (ena_ipd);
initial
begin
clk_last_value <= 'b0;
q_tmp <= 'b0;
end
always @ (clk_ipd or aclr_ipd)
begin
if (d_viol == 1'b1 || ena_viol == 1'b1)
begin
q_tmp <= 'bX;
end
else
begin
if (aclr_ipd == 1'b1)
q_tmp <= 0;
else if ((clk_ipd == 1'b1) && (clk_last_value == 1'b0))
if (ena_ipd == 1'b1)
q_tmp <= d_ipd;
end
clk_last_value <= clk_ipd;
end
and (q, q_tmp, 'b1);
endmodule // cycloneiii_mac_sign_reg
module cycloneiii_mac_mult_internal
(
dataa,
datab,
signa,
signb,
dataout
);
parameter dataa_width = 18;
parameter datab_width = 18;
parameter dataout_width = dataa_width + datab_width;
// INPUT
input [dataa_width-1:0] dataa;
input [datab_width-1:0] datab;
input signa;
input signb;
// OUTPUT
output [dataout_width-1:0] dataout;
// Internal variables
wire [17:0] dataa_ipd;
wire [17:0] datab_ipd;
wire signa_ipd;
wire signb_ipd;
wire [dataout_width-1:0] dataout_tmp;
wire ia_is_positive;
wire ib_is_positive;
wire [17:0] iabsa; // absolute value (i.e. positive) form of dataa input
wire [17:0] iabsb; // absolute value (i.e. positive) form of datab input
wire [35:0] iabsresult; // absolute value (i.e. positive) form of product (a * b)
reg [17:0] i_ones; // padding with 1's for input negation
// Input buffers
buf (signa_ipd, signa);
buf (signb_ipd, signb);
// buf dataa_buf [dataa_width-1:0] (dataa_ipd[dataa_width-1:0], dataa);
// buf datab_buf [datab_width-1:0] (datab_ipd[datab_width-1:0], datab);
assign dataa_ipd[dataa_width-1:0] = dataa;
assign datab_ipd[datab_width-1:0] = datab;
initial
begin
// 1's padding for 18-bit wide inputs
i_ones = ~0;
end
// get signs of a and b, and get absolute values since Verilog '*' operator
// is an unsigned multiplication
assign ia_is_positive = ~signa_ipd | ~dataa_ipd[dataa_width-1];
assign ib_is_positive = ~signb_ipd | ~datab_ipd[datab_width-1];
assign iabsa = ia_is_positive == 1 ? dataa_ipd[dataa_width-1:0] : -(dataa_ipd | (i_ones << dataa_width));
assign iabsb = ib_is_positive == 1 ? datab_ipd[datab_width-1:0] : -(datab_ipd | (i_ones << datab_width));
// multiply a * b
assign iabsresult = iabsa * iabsb;
assign dataout_tmp = (ia_is_positive ^ ib_is_positive) == 1 ? -iabsresult : iabsresult;
// buf dataout_buf [dataout_width-1:0] (dataout, dataout_tmp);
assign dataout = dataout_tmp;
endmodule
module cycloneiii_mac_mult
(
dataa,
datab,
signa,
signb,
clk,
aclr,
ena,
dataout,
devclrn,
devpor
);
parameter dataa_width = 18;
parameter datab_width = 18;
parameter dataa_clock = "none";
parameter datab_clock = "none";
parameter signa_clock = "none";
parameter signb_clock = "none";
parameter lpm_hint = "true";
parameter lpm_type = "cycloneiii_mac_mult";
// SIMULATION_ONLY_PARAMETERS_BEGIN
parameter dataout_width = dataa_width + datab_width;
// SIMULATION_ONLY_PARAMETERS_END
input [dataa_width-1:0] dataa;
input [datab_width-1:0] datab;
input signa;
input signb;
input clk;
input aclr;
input ena;
input devclrn;
input devpor;
output [dataout_width-1:0] dataout;
// tri1 devclrn;
// tri1 devpor;
wire [dataout_width-1:0] dataout_tmp;
wire [17:0] idataa_reg; // optional register for dataa input
wire [17:0] idatab_reg; // optional register for datab input
wire [17:0] dataa_pad; // padded dataa input
wire [17:0] datab_pad; // padded datab input
wire isigna_reg; // optional register for signa input
wire isignb_reg; // optional register for signb input
wire [17:0] idataa_int; // dataa as seen by the multiplier input
wire [17:0] idatab_int; // datab as seen by the multiplier input
wire isigna_int; // signa as seen by the multiplier input
wire isignb_int; // signb as seen by the multiplier input
wire ia_is_positive;
wire ib_is_positive;
wire [17:0] iabsa; // absolute value (i.e. positive) form of dataa input
wire [17:0] iabsb; // absolute value (i.e. positive) form of datab input
wire [35:0] iabsresult; // absolute value (i.e. positive) form of product (a * b)
wire dataa_use_reg; // equivalent to dataa_clock parameter
wire datab_use_reg; // equivalent to datab_clock parameter
wire signa_use_reg; // equivalent to signa_clock parameter
wire signb_use_reg; // equivalent to signb_clock parameter
reg [17:0] i_ones; // padding with 1's for input negation
wire reg_aclr;
assign reg_aclr = (!devpor) || (!devclrn) || (aclr);
// optional registering parameters
assign dataa_use_reg = (dataa_clock != "none") ? 1'b1 : 1'b0;
assign datab_use_reg = (datab_clock != "none") ? 1'b1 : 1'b0;
assign signa_use_reg = (signa_clock != "none") ? 1'b1 : 1'b0;
assign signb_use_reg = (signb_clock != "none") ? 1'b1 : 1'b0;
assign dataa_pad = ((18-dataa_width) == 0) ? dataa : {{(18-dataa_width){1'b0}},dataa};
assign datab_pad = ((18-datab_width) == 0) ? datab : {{(18-datab_width){1'b0}},datab};
initial
begin
// 1's padding for 18-bit wide inputs
i_ones = ~0;
end
// Optional input registers for dataa,b and signa,b
cycloneiii_mac_data_reg dataa_reg (
.clk(clk),
.data(dataa_pad),
.ena(ena),
.aclr(reg_aclr),
.dataout(idataa_reg)
);
defparam dataa_reg.data_width = dataa_width;
cycloneiii_mac_data_reg datab_reg (
.clk(clk),
.data(datab_pad),
.ena(ena),
.aclr(reg_aclr),
.dataout(idatab_reg)
);
defparam datab_reg.data_width = datab_width;
cycloneiii_mac_sign_reg signa_reg (
.clk(clk),
.d(signa),
.ena(ena),
.aclr(reg_aclr),
.q(isigna_reg)
);
cycloneiii_mac_sign_reg signb_reg (
.clk(clk),
.d(signb),
.ena(ena),
.aclr(reg_aclr),
.q(isignb_reg)
);
// mux input sources from direct inputs or optional registers
assign idataa_int = dataa_use_reg == 1'b1 ? idataa_reg : dataa;
assign idatab_int = datab_use_reg == 1'b1 ? idatab_reg : datab;
assign isigna_int = signa_use_reg == 1'b1 ? isigna_reg : signa;
assign isignb_int = signb_use_reg == 1'b1 ? isignb_reg : signb;
cycloneiii_mac_mult_internal mac_multiply (
.dataa(idataa_int[dataa_width-1:0]),
.datab(idatab_int[datab_width-1:0]),
.signa(isigna_int),
.signb(isignb_int),
.dataout(dataout)
);
defparam mac_multiply.dataa_width = dataa_width;
defparam mac_multiply.datab_width = datab_width;
defparam mac_multiply.dataout_width = dataout_width;
endmodule
module cycloneiii_mac_out
(
dataa,
clk,
aclr,
ena,
dataout,
devclrn,
devpor
);
parameter dataa_width = 1;
parameter output_clock = "none";
parameter lpm_hint = "true";
parameter lpm_type = "cycloneiii_mac_out";
// SIMULATION_ONLY_PARAMETERS_BEGIN
parameter dataout_width = dataa_width;
// SIMULATION_ONLY_PARAMETERS_END
input [dataa_width-1:0] dataa;
input clk;
input aclr;
input ena;
input devclrn;
input devpor;
output [dataout_width-1:0] dataout;
// tri1 devclrn;
// tri1 devpor;
wire [dataa_width-1:0] dataa_ipd; // internal dataa
wire clk_ipd; // internal clk
wire aclr_ipd; // internal aclr
wire ena_ipd; // internal ena
// internal variable
wire [dataout_width-1:0] dataout_tmp;
reg [dataa_width-1:0] idataout_reg; // optional register for dataout output
wire use_reg; // equivalent to dataout_clock parameter
wire enable;
wire no_aclr;
// Input buffers
buf (clk_ipd, clk);
buf (aclr_ipd, aclr);
buf (ena_ipd, ena);
// buf dataa_buf [dataa_width-1:0] (dataa_ipd, dataa);
assign dataa_ipd = dataa;
// optional registering parameter
assign use_reg = (output_clock != "none") ? 1 : 0;
assign enable = (!aclr) && (ena) && use_reg;
assign no_aclr = (!aclr) && use_reg;
initial
begin
// initial values for optional register
idataout_reg = 0;
end
// Optional input registers for dataa,b and signa,b
always @* // (posedge clk_ipd or posedge aclr_ipd or negedge devclrn or negedge devpor)
begin
if (devclrn == 0 || devpor == 0 || aclr_ipd == 1)
begin
idataout_reg <= 0;
end
else if (ena_ipd == 1)
begin
idataout_reg <= dataa_ipd;
end
end
// mux input sources from direct inputs or optional registers
assign dataout_tmp = use_reg == 1 ? idataout_reg : dataa_ipd;
// accelerate outputs
// buf dataout_buf [dataout_width-1:0] (dataout, dataout_tmp);
assign dataout = dataout_tmp;
endmodule

View File

@ -1,449 +0,0 @@
#define GENERATE_BINARY_OPS
#define GENERATE_UNARY_OPS
#define GENERATE_TERNARY_OPS
#define GENERATE_CONCAT_OPS
#undef GENERATE_REPEAT_OPS // disabled because of XST bug
#define GENERATE_EXPRESSIONS
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <string>
const char *arg_types[][3] = {
{ "{dir} [3:0] {name}", "{name}", "4" }, // 00
{ "{dir} [4:0] {name}", "{name}", "5" }, // 01
{ "{dir} [5:0] {name}", "{name}", "6" }, // 02
{ "{dir} signed [3:0] {name}", "{name}", "4" }, // 03
{ "{dir} signed [4:0] {name}", "{name}", "5" }, // 04
{ "{dir} signed [5:0] {name}", "{name}", "6" } // 05
};
const char *small_arg_types[][3] = {
{ "{dir} [0:0] {name}", "{name}", "1" }, // 00
{ "{dir} [1:0] {name}", "{name}", "2" }, // 01
{ "{dir} [2:0] {name}", "{name}", "3" }, // 02
{ "{dir} signed [0:0] {name}", "{name}", "1" }, // 03
{ "{dir} signed [1:0] {name}", "{name}", "2" }, // 04
{ "{dir} signed [2:0] {name}", "{name}", "3" }, // 05
};
// See Table 5-1 (page 42) in IEEE Std 1364-2005
// for a list of all Verilog oprators.
const char *binary_ops[] = {
"+", // 00
"-", // 01
"*", // 02
// "/",
// "%",
// "**",
">", // 03
">=", // 04
"<", // 05
"<=", // 06
"&&", // 07
"||", // 08
"==", // 09
"!=", // 10
"===", // 11
"!==", // 12
"&", // 13
"|", // 14
"^", // 15
"^~", // 16
"<<", // 17
">>", // 18
"<<<", // 19
">>>", // 20
};
const char *unary_ops[] = {
"+", // 00
"-", // 01
"!", // 02
"~", // 03
"&", // 04
"~&", // 05
"|", // 06
"~|", // 07
"^", // 08
"~^", // 09
};
void strsubst(std::string &str, const std::string &match, const std::string &replace)
{
size_t pos;
while ((pos = str.find(match)) != std::string::npos)
str.replace(pos, match.size(), replace);
}
uint32_t xorshift32(uint32_t seed = 0) {
static uint32_t x = 314159265;
if (seed)
x = seed;
x ^= x << 13;
x ^= x >> 17;
x ^= x << 5;
return x;
}
void print_expression(FILE *f, int budget, uint32_t mask = 0)
{
size_t num_binary_ops = sizeof(binary_ops)/sizeof(*binary_ops);
size_t num_unary_ops = sizeof(unary_ops)/sizeof(*unary_ops);
size_t num_arg_types = sizeof(arg_types)/sizeof(*arg_types);
int i, j, k, mode;
if (budget == 0) {
fprintf(f, "%c%d", 'a' + char(xorshift32() % 2), int(xorshift32() % num_arg_types));
return;
}
int num_modes = 4;
while ((mask & ~((~0) << num_modes)) == 0)
mask = xorshift32();
do {
mode = xorshift32() % num_modes;
} while (((1 << mode) & mask) == 0);
// fprintf(f, "/* %d */", mode);
budget--;
switch (mode)
{
case 0:
fprintf(f, "(");
print_expression(f, budget, mask);
fprintf(f, ")");
break;
case 1:
fprintf(f, "(");
print_expression(f, budget/2, mask);
#if 1
// FIXME: relational operators disabled because there is an xst bug..
do k = xorshift32() % num_binary_ops; while ((k >= 9 && k <= 12) || (k >= 3 && k <= 6));
fprintf(f, "%s", binary_ops[k]);
#else
fprintf(f, "%s", binary_ops[xorshift32() % num_binary_ops]);
#endif
print_expression(f, budget/2, mask);
fprintf(f, ")");
break;
case 2:
fprintf(f, "(%s", unary_ops[xorshift32() % num_unary_ops]);
print_expression(f, budget, mask);
fprintf(f, ")");
break;
case 3:
i = 1 + xorshift32() % 3;
fprintf(f, "{");
for (j = 0; j < i; j++) {
if (j)
fprintf(f, ",");
print_expression(f, budget / i, mask);
}
fprintf(f, "}");
break;
#if 0
// FIXME: disabled because there is an xst bug..
case 4:
i = xorshift32() % 4;
fprintf(f, "{%d{", i);
print_expression(f, budget, mask);
fprintf(f, "}}");
break;
#endif
}
}
int main()
{
mkdir("rtl", 0777);
#ifdef GENERATE_BINARY_OPS
for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++)
for (int bi = 0; bi < sizeof(arg_types)/sizeof(arg_types[0]); bi++)
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
for (int oi = 0; oi < sizeof(binary_ops)/sizeof(binary_ops[0]); oi++)
{
std::string a_decl = arg_types[ai][0];
strsubst(a_decl, "{dir}", "input");
strsubst(a_decl, "{name}", "a");
std::string b_decl = arg_types[bi][0];
strsubst(b_decl, "{dir}", "input");
strsubst(b_decl, "{name}", "b");
std::string y_decl = arg_types[yi][0];
strsubst(y_decl, "{dir}", "output");
strsubst(y_decl, "{name}", "y");
std::string a_ref = arg_types[ai][1];
strsubst(a_ref, "{dir}", "input");
strsubst(a_ref, "{name}", "a");
std::string b_ref = arg_types[bi][1];
strsubst(b_ref, "{dir}", "input");
strsubst(b_ref, "{name}", "b");
std::string y_ref = arg_types[yi][1];
strsubst(y_ref, "{dir}", "output");
strsubst(y_ref, "{name}", "y");
char buffer[1024];
snprintf(buffer, 1024, "rtl/binary_ops_%02d%02d%02d%02d.v", ai, bi, yi, oi);
FILE *f = fopen(buffer, "w");
fprintf(f, "module binary_ops_%02d%02d%02d%02d(a, b, y);\n", ai, bi, yi, oi);
fprintf(f, "%s;\n", a_decl.c_str());
fprintf(f, "%s;\n", b_decl.c_str());
fprintf(f, "%s;\n", y_decl.c_str());
fprintf(f, "assign %s = %s %s %s;\n", y_ref.c_str(),
a_ref.c_str(), binary_ops[oi], b_ref.c_str());
fprintf(f, "endmodule\n");
fclose(f);
}
#endif
#ifdef GENERATE_UNARY_OPS
for (int ai = 0; ai < sizeof(arg_types)/sizeof(arg_types[0]); ai++)
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
for (int oi = 0; oi < sizeof(unary_ops)/sizeof(unary_ops[0]); oi++)
{
std::string a_decl = arg_types[ai][0];
strsubst(a_decl, "{dir}", "input");
strsubst(a_decl, "{name}", "a");
std::string y_decl = arg_types[yi][0];
strsubst(y_decl, "{dir}", "output");
strsubst(y_decl, "{name}", "y");
std::string a_ref = arg_types[ai][1];
strsubst(a_ref, "{dir}", "input");
strsubst(a_ref, "{name}", "a");
std::string y_ref = arg_types[yi][1];
strsubst(y_ref, "{dir}", "output");
strsubst(y_ref, "{name}", "y");
char buffer[1024];
snprintf(buffer, 1024, "rtl/unary_ops_%02d%02d%02d.v", ai, yi, oi);
FILE *f = fopen(buffer, "w");
fprintf(f, "module unary_ops_%02d%02d%02d(a, b, y);\n", ai, yi, oi);
fprintf(f, "%s;\n", a_decl.c_str());
fprintf(f, "input b;\n");
fprintf(f, "%s;\n", y_decl.c_str());
fprintf(f, "assign %s = %s %s;\n", y_ref.c_str(),
unary_ops[oi], a_ref.c_str());
fprintf(f, "endmodule\n");
fclose(f);
}
#endif
#ifdef GENERATE_TERNARY_OPS
for (int ai = 0; ai < sizeof(small_arg_types)/sizeof(small_arg_types[0]); ai++)
for (int bi = 0; bi < sizeof(arg_types)/sizeof(arg_types[0]); bi++)
for (int ci = 0; ci < sizeof(arg_types)/sizeof(arg_types[0]); ci++)
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
{
if (!strcmp(small_arg_types[ai][2], "3"))
continue;
if (!strcmp(arg_types[bi][2], "6"))
continue;
if (!strcmp(arg_types[ci][2], "6"))
continue;
std::string a_decl = small_arg_types[ai][0];
strsubst(a_decl, "{dir}", "input");
strsubst(a_decl, "{name}", "a");
std::string b1_decl = arg_types[bi][0];
strsubst(b1_decl, "{dir}", "wire");
strsubst(b1_decl, "{name}", "b1");
std::string b2_decl = arg_types[ci][0];
strsubst(b2_decl, "{dir}", "wire");
strsubst(b2_decl, "{name}", "b2");
std::string y_decl = arg_types[yi][0];
strsubst(y_decl, "{dir}", "output");
strsubst(y_decl, "{name}", "y");
std::string a_ref = small_arg_types[ai][1];
strsubst(a_ref, "{dir}", "input");
strsubst(a_ref, "{name}", "a");
std::string b1_ref = arg_types[bi][1];
strsubst(b1_ref, "{dir}", "wire");
strsubst(b1_ref, "{name}", "b1");
std::string b2_ref = arg_types[ci][1];
strsubst(b2_ref, "{dir}", "wire");
strsubst(b2_ref, "{name}", "b2");
std::string y_ref = arg_types[yi][1];
strsubst(y_ref, "{dir}", "output");
strsubst(y_ref, "{name}", "y");
char buffer[1024];
snprintf(buffer, 1024, "rtl/ternary_ops_%02d%02d%02d%02d.v", ai, bi, ci, yi);
FILE *f = fopen(buffer, "w");
fprintf(f, "module ternary_ops_%02d%02d%02d%02d(a, b, y);\n", ai, bi, ci, yi);
fprintf(f, "%s;\n", a_decl.c_str());
fprintf(f, "input [%s+%s-1:0] b;\n", arg_types[bi][2], arg_types[ci][2]);
fprintf(f, "%s = b[%s+%s-1:%s];\n", b1_decl.c_str(), arg_types[bi][2], arg_types[ci][2], arg_types[ci][2]);
fprintf(f, "%s = b[%s-1:0];\n", b2_decl.c_str(), arg_types[ci][2]);
fprintf(f, "%s;\n", y_decl.c_str());
fprintf(f, "assign %s = %s ? %s : %s;\n", y_ref.c_str(),
a_ref.c_str(), b1_ref.c_str(), b2_ref.c_str());
fprintf(f, "endmodule\n");
fclose(f);
}
#endif
#ifdef GENERATE_CONCAT_OPS
for (int ai = 0; ai < sizeof(small_arg_types)/sizeof(small_arg_types[0]); ai++)
for (int bi = 0; bi < sizeof(small_arg_types)/sizeof(small_arg_types[0]); bi++)
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
{
std::string a_decl = small_arg_types[ai][0];
strsubst(a_decl, "{dir}", "input");
strsubst(a_decl, "{name}", "a");
std::string b_decl = small_arg_types[bi][0];
strsubst(b_decl, "{dir}", "input");
strsubst(b_decl, "{name}", "b");
std::string y_decl = arg_types[yi][0];
strsubst(y_decl, "{dir}", "output");
strsubst(y_decl, "{name}", "y");
std::string a_ref = small_arg_types[ai][1];
strsubst(a_ref, "{dir}", "input");
strsubst(a_ref, "{name}", "a");
std::string b_ref = small_arg_types[bi][1];
strsubst(b_ref, "{dir}", "input");
strsubst(b_ref, "{name}", "b");
std::string y_ref = arg_types[yi][1];
strsubst(y_ref, "{dir}", "output");
strsubst(y_ref, "{name}", "y");
char buffer[1024];
snprintf(buffer, 1024, "rtl/concat_ops_%02d%02d%02d.v", ai, bi, yi);
FILE *f = fopen(buffer, "w");
fprintf(f, "module concat_ops_%02d%02d%02d(a, b, y);\n", ai, bi, yi);
fprintf(f, "%s;\n", a_decl.c_str());
fprintf(f, "%s;\n", b_decl.c_str());
fprintf(f, "%s;\n", y_decl.c_str());
fprintf(f, "assign %s = {%s, %s};\n", y_ref.c_str(), a_ref.c_str(), b_ref.c_str());
fprintf(f, "endmodule\n");
fclose(f);
}
#endif
#ifdef GENERATE_REPEAT_OPS
for (int a = 0; a < 4; a++)
for (int bi = 0; bi < sizeof(small_arg_types)/sizeof(small_arg_types[0]); bi++)
for (int yi = 0; yi < sizeof(arg_types)/sizeof(arg_types[0]); yi++)
{
std::string b_decl = small_arg_types[bi][0];
strsubst(b_decl, "{dir}", "input");
strsubst(b_decl, "{name}", "b");
std::string y_decl = arg_types[yi][0];
strsubst(y_decl, "{dir}", "output");
strsubst(y_decl, "{name}", "y");
std::string b_ref = small_arg_types[bi][1];
strsubst(b_ref, "{dir}", "input");
strsubst(b_ref, "{name}", "b");
std::string y_ref = arg_types[yi][1];
strsubst(y_ref, "{dir}", "output");
strsubst(y_ref, "{name}", "y");
char buffer[1024];
snprintf(buffer, 1024, "rtl/repeat_ops_%02d%02d%02d.v", a, bi, yi);
FILE *f = fopen(buffer, "w");
fprintf(f, "module repeat_ops_%02d%02d%02d(a, b, y);\n", a, bi, yi);
fprintf(f, "input a;\n");
fprintf(f, "%s;\n", b_decl.c_str());
fprintf(f, "%s;\n", y_decl.c_str());
fprintf(f, "assign %s = {%d{%s}};\n", y_ref.c_str(), a, b_ref.c_str());
fprintf(f, "endmodule\n");
fclose(f);
}
#endif
#ifdef GENERATE_EXPRESSIONS
for (int i = 0; i < 1000; i++)
{
xorshift32(1234 + i);
xorshift32();
xorshift32();
xorshift32();
char buffer[1024];
snprintf(buffer, 1024, "rtl/expression_%05d.v", i);
FILE *f = fopen(buffer, "w");
fprintf(f, "module expression_%05d(a, b, y);\n", i);
for (char var = 'a'; var <= 'y'; var++)
{
fprintf(f, "%s [", var != 'y' ? "input" : "output");
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++)
fprintf(f, "%s%s", j ? "+" : "", arg_types[j][2]);
fprintf(f, "-1:0] %c;\n", var);
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++)
{
std::string decl = arg_types[j][0];
strsubst(decl, "{dir}", "wire");
snprintf(buffer, 1024, "%c%d", var, j);
strsubst(decl, "{name}", buffer);
if (var != 'y') {
fprintf(f, "%s = %c[", decl.c_str(), var);
for (int k = 0; k <= j; k++)
fprintf(f, "%s%s", k ? "+" : "", arg_types[k][2]);
fprintf(f, "-1:");
for (int k = 0; k < j; k++)
fprintf(f, "%s%s", k ? "+" : "", arg_types[k][2]);
fprintf(f, "%s];\n", j ? "" : "0");
} else
fprintf(f, "%s;\n", decl.c_str());
}
if (var == 'b')
var = 'x';
}
fprintf(f, "assign y = {");
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++)
fprintf(f, "%sy%d", j ? "," : "", j);
fprintf(f, "};\n");
for (int j = 0; j < sizeof(arg_types)/sizeof(arg_types[0]); j++) {
fprintf(f, "assign y%d = ", j);
print_expression(f, 1 + xorshift32() % 20);
fprintf(f, ";\n");
}
fprintf(f, "endmodule\n");
fclose(f);
}
#endif
return 0;
}

View File

@ -1,160 +0,0 @@
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <job_id>" >&2
exit 1
fi
job="$1"
set --
set -ex
rm -rf report_temp/$job
mkdir -p report report_temp/$job
cd report_temp/$job
cp ../../vivado/$job.v syn_vivado.v
cp ../../quartus/$job.v syn_quartus.v
cp ../../xst/$job.v syn_xst.v
cp ../../rtl/$job.v rtl.v
yosys -p 'hierarchy; proc; opt; techmap; abc; opt' -b 'verilog -noattr' -o syn_yosys.v ../../rtl/$job.v
cat ../../xl_cells.v ../../cy_cells.v > cells.v
{
echo "module ${job}_test(a, b, y1, y2);"
sed -r '/^(input|output) / !d; /output/ { s/ y;/ y1;/; p; }; s/ y1;/ y2;/;' rtl.v
echo "${job}_1 uut1 (.a(a), .b(b), .y(y1));"
echo "${job}_2 uut2 (.a(a), .b(b), .y(y2));"
echo "endmodule"
} > test.v
echo -n > fail_patterns.txt
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
for q in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
if test -f result.${q}.${p}.txt; then
cp result.${q}.${p}.txt result.${p}.${q}.txt
continue
fi
{
echo "read_verilog -DGLBL $p.v"
echo "rename $job ${job}_1"
echo "read_verilog -DGLBL $q.v"
echo "rename $job ${job}_2"
echo "read_verilog cells.v test.v"
echo "hierarchy -top ${job}_test"
echo "proc; opt; flatten ${job}_test"
echo "hierarchy -check -top ${job}_test"
echo "! touch test.$p.$q.input_ok"
echo "sat -timeout 10 -verify-no-timeout -show a,b,y1,y2 -prove y1 y2 ${job}_test"
} > test.$p.$q.ys
if yosys -l test.$p.$q.log test.$p.$q.ys; then
if grep TIMEOUT test.$p.$q.log; then
echo TIMEOUT > result.${p}.${q}.txt
else
echo PASS > result.${p}.${q}.txt
fi
else
echo $( grep '^ *\\[ab] ' test.$p.$q.log | gawk '{ print $4; }' | tr -d '\n' ) >> fail_patterns.txt
echo FAIL > result.${p}.${q}.txt
fi
# this fails if an error was encountered before the 'sat' command
rm test.$p.$q.input_ok
done; done
{
echo "module testbench;"
sed -r '/^input / !d; s/^input/reg/;' rtl.v
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
sed -r "/^output / !d; s/^output/wire/; s/ y;/ ${p}_y;/;" rtl.v
echo "${job}_${p} uut_${p} (.a(a), .b(b), .y(${p}_y));"
done
echo "initial begin"
extra_patterns=""
bits=$( echo $( grep '^input' rtl.v | cut -f2 -d'[' | cut -f1 -d: | tr '\n' '+' )2 | bc; )
for x in 1 2 3 4 5 6 7 8 9 0; do
extra_patterns="$extra_patterns $( echo $job$x | sha1sum | gawk "{ print \"160'h\" \$1; }" )"
done
for pattern in $bits\'b0 ~$bits\'b0 $( sed "s/^/$bits'b/;" < fail_patterns.txt ) $extra_patterns; do
echo " { a, b } <= $pattern; #1;"
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
echo " \$display(\"++RPT++ %b $p\", ${p}_y);"
done
echo " \$display(\"++RPT++ ----\");"
done
echo "end"
echo "endmodule"
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
sed "s/^module ${job}/module ${job}_${p}/; /^\`timescale/ d;" < $p.v
done
cat cells.v
} > testbench.v
/opt/altera/13.0/modelsim_ase/bin/vlib work
/opt/altera/13.0/modelsim_ase/bin/vlog testbench.v
/opt/altera/13.0/modelsim_ase/bin/vsim -c -do "run; exit" work.testbench | tee sim_modelsim.log
. /opt/Xilinx/14.5/ISE_DS/settings64.sh
vlogcomp testbench.v
fuse -o testbench testbench
{ echo "run all"; echo "exit"; } > run-all.tcl
./testbench -tclbatch run-all.tcl | tee sim_isim.log
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
for q in isim modelsim; do
echo $( grep '++RPT++' sim_$q.log | sed 's,.*++RPT++ ,,' | grep " $p\$" | gawk '{ print $1; }' | md5sum | gawk '{ print $1; }' ) > result.${p}.${q}.txt
done; done
echo "#00ff00" > color_PASS.txt
echo "#ff0000" > color_FAIL.txt
if cmp result.rtl.isim.txt result.rtl.modelsim.txt; then
echo "#00ff00" > color_$( cat result.rtl.isim.txt ).txt
else
echo "#00ff00" > color_NO_SIM_COMMON.txt
fi
{
echo "<h3>Hammer Report: $job</h3>"
echo "<table border>"
echo "<tr><th width=\"100\"></th>"
for q in syn_vivado syn_quartus syn_xst syn_yosys rtl isim modelsim; do
echo "<th width=\"100\">$q</th>"
done
echo "</tr>"
for p in syn_vivado syn_quartus syn_xst syn_yosys rtl; do
echo "<tr><th>$p</th>"
for q in syn_vivado syn_quartus syn_xst syn_yosys rtl isim modelsim; do
read result < result.${p}.${q}.txt
if ! test -f color_$result.txt; then
case $( ls color_*.txt | wc -l ) in
3) echo "#ffff00" > color_$result.txt ;;
4) echo "#ff00ff" > color_$result.txt ;;
5) echo "#00ffff" > color_$result.txt ;;
*) echo "#888888" > color_$result.txt ;;
esac
fi
echo "<td align=\"center\" bgcolor=\"$( cat color_$result.txt )\">$( echo $result | cut -c1-8 )</td>"
done
echo "</tr>"
done
echo "<tr><td colspan=\"8\"><pre>$( perl -pe 's/([<>&])/"&#".ord($1).";"/eg;' rtl.v |
perl -pe 's!([^\w#]|^)(\w+)\b!$x = $1; $y = $2; sprintf("%s<span style=\"color: %s;\">%s</span>", $x, $y =~ /module|input|wire|output|assign|signed|endmodule/ ? "#008800;" : "#000088;", $y)!eg' )</pre></td></tr>"
#perl -pe 's,\b(module|input|wire|output|assign|signed|endmodule)\b,<span style="color: #008800;">$1</span>,g' )</pre></td></tr>"
echo "</table>"
} > ../../report/$job.html
sync
echo READY.

View File

@ -1,100 +0,0 @@
#!/bin/bash
use_vivado=false
use_quartus=false
checkdir="check"
if [ "$1" = "-vivado" ]; then
use_vivado=true
checkdir="check_vivado"
shift
fi
if [ "$1" = "-quartus" ]; then
use_quartus=true
checkdir="check_quartus"
shift
fi
if [ $# -eq 0 ]; then
echo "Usage: $0 <job_id>" >&2
exit 1
fi
job="$1"
set --
set -e
mkdir -p $checkdir check_temp/$job
cd check_temp/$job
{
echo "module ${job}_top(a, b, y_rtl, y_syn);"
sed -r '/^(input|output) / !d; /output/ { s/ y;/ y_rtl;/; p; }; s/ y_rtl;/ y_syn;/;' ../../rtl/$job.v
echo "${job}_rtl rtl_variant (.a(a), .b(b), .y(y_rtl));"
echo "${job}_syn syn_variant (.a(a), .b(b), .y(y_syn));"
echo "endmodule"
} > ${job}_top.v
for mode in nomap techmap; do
{
if $use_quartus; then
echo "read_verilog ../../quartus/$job.v"
elif $use_vivado; then
echo "read_verilog ../../vivado/$job.v"
else
echo "read_verilog -DGLBL ../../xst/$job.v"
fi
echo "rename $job ${job}_syn"
echo "read_verilog ../../rtl/$job.v"
echo "rename $job ${job}_rtl"
if [ $mode = techmap ]; then
echo "techmap ${job}_rtl"
fi
echo "read_verilog ${job}_top.v"
if $use_quartus; then
echo "read_verilog ../../cy_cells.v"
else
echo "read_verilog ../../xl_cells.v"
fi
echo "hierarchy -top ${job}_top"
echo "proc"
echo "flatten ${job}_syn"
echo "flatten ${job}_rtl"
echo "flatten ${job}_top"
echo "opt_clean"
echo "rename ${job}_syn ${job}_syn_${mode}"
echo "rename ${job}_rtl ${job}_rtl_${mode}"
echo "rename ${job}_top ${job}_top_${mode}"
echo "dump -outfile ${job}_top_${mode}.il ${job}_syn_${mode} ${job}_rtl_${mode} ${job}_top_${mode}"
} > ${job}_top_${mode}.ys
../../../../yosys -q ${job}_top_${mode}.ys
done
{
echo "read_ilang ${job}_top_nomap.il"
echo "read_ilang ${job}_top_techmap.il"
echo "sat -timeout 60 -verify-no-timeout -show a,b,y_rtl,y_syn -prove y_rtl y_syn ${job}_top_nomap"
echo "sat -timeout 60 -verify-no-timeout -show a,b,y_rtl,y_syn -prove y_rtl y_syn ${job}_top_techmap"
if [[ $job != expression_* ]] && ! $use_quartus && ! $use_vivado; then
echo "eval -brute_force_equiv_checker ${job}_rtl_nomap ${job}_syn_nomap"
echo "eval -brute_force_equiv_checker ${job}_rtl_techmap ${job}_syn_techmap"
fi
} > ${job}_cmp.ys
if ../../../../yosys -l ${job}.log ${job}_cmp.ys; then
mv ${job}.log ../../$checkdir/${job}.log
rm -f ../../$checkdir/${job}.err
touch ../../$checkdir/${job}.log
else
mv ${job}.log ../../$checkdir/${job}.err
rm -f ../../$checkdir/${job}.log
fi
exit 0

View File

@ -1,24 +0,0 @@
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <job_id>" >&2
exit 1
fi
job="$1"
set --
set -e
mkdir -p quartus quartus_temp/$job
cd quartus_temp/$job
rm -rf *
cp ../../rtl/$job.v .
/opt/altera/13.0/quartus/bin/quartus_map $job --source=$job.v --family="Cyclone III"
/opt/altera/13.0/quartus/bin/quartus_fit $job
/opt/altera/13.0/quartus/bin/quartus_eda $job --formal_verification --tool=conformal
cp -v fv/conformal/$job.vo ../../quartus/$job.v
sync
exit 0

View File

@ -1,26 +0,0 @@
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <job_id>" >&2
exit 1
fi
job="$1"
set --
set -e
mkdir -p vivado vivado_temp/$job
cd vivado_temp/$job
sed 's/^module/(* use_dsp48="no" *) module/;' < ../../rtl/$job.v > rtl.v
cat > $job.tcl <<- EOT
read_verilog rtl.v
synth_design -part xc7k70t -top $job
write_verilog -force ../../vivado/$job.v
EOT
/opt/Xilinx/Vivado/2013.2/bin/vivado -mode batch -source $job.tcl
sync
exit 0

View File

@ -1,34 +0,0 @@
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <job_id>" >&2
exit 1
fi
job="$1"
set --
set -e
mkdir -p xst xst_temp/$job
cd xst_temp/$job
cat > $job.xst <<- EOT
run
-ifn $job.prj -ofn $job -p artix7 -top $job
-iobuf NO -ram_extract NO -rom_extract NO -use_dsp48 NO
-fsm_extract YES -fsm_encoding Auto
EOT
cat > $job.prj <<- EOT
verilog work "../../rtl/$job.v"
EOT
. /opt/Xilinx/14.5/ISE_DS/settings64.sh
xst -ifn $job.xst
netgen -w -ofmt verilog $job.ngc $job
cp $job.v ../../xst/$job.v
sync
exit 0

View File

@ -1,120 +0,0 @@
module IBUF(O, I);
output O;
input I;
assign O = I;
endmodule
module OBUF(O, I);
output O;
input I;
assign O = I;
endmodule
module GND(G);
output G;
assign G = 0;
endmodule
module INV(O, I);
input I;
output O;
assign O = !I;
endmodule
module LUT1(O, I0);
parameter INIT = 0;
input I0;
wire [1:0] lutdata = INIT;
wire [0:0] idx = { I0 };
output O;
assign O = lutdata[idx];
endmodule
module LUT2(O, I0, I1);
parameter INIT = 0;
input I0, I1;
wire [3:0] lutdata = INIT;
wire [1:0] idx = { I1, I0 };
output O;
assign O = lutdata[idx];
endmodule
module LUT3(O, I0, I1, I2);
parameter INIT = 0;
input I0, I1, I2;
wire [7:0] lutdata = INIT;
wire [2:0] idx = { I2, I1, I0 };
output O;
assign O = lutdata[idx];
endmodule
module LUT4(O, I0, I1, I2, I3);
parameter INIT = 0;
input I0, I1, I2, I3;
wire [15:0] lutdata = INIT;
wire [3:0] idx = { I3, I2, I1, I0 };
output O;
assign O = lutdata[idx];
endmodule
module LUT5(O, I0, I1, I2, I3, I4);
parameter INIT = 0;
input I0, I1, I2, I3, I4;
wire [31:0] lutdata = INIT;
wire [4:0] idx = { I4, I3, I2, I1, I0 };
output O;
assign O = lutdata[idx];
endmodule
module LUT6(O, I0, I1, I2, I3, I4, I5);
parameter INIT = 0;
input I0, I1, I2, I3, I4, I5;
wire [63:0] lutdata = INIT;
wire [5:0] idx = { I5, I4, I3, I2, I1, I0 };
output O;
assign O = lutdata[idx];
endmodule
module MUXCY(O, CI, DI, S);
input CI, DI, S;
output O;
assign O = S ? CI : DI;
endmodule
module MUXF7(O, I0, I1, S);
input I0, I1, S;
output O;
assign O = S ? I1 : I0;
endmodule
module MUXF8(O, I0, I1, S);
input I0, I1, S;
output O;
assign O = S ? I1 : I0;
endmodule
module VCC(P);
output P;
assign P = 1;
endmodule
module XORCY(O, CI, LI);
input CI, LI;
output O;
assign O = CI ^ LI;
endmodule
module CARRY4(CO, O, CI, CYINIT, DI, S);
output [3:0] CO, O;
input CI, CYINIT;
input [3:0] DI, S;
wire ci_or_cyinit;
assign O = S ^ {CO[2:0], ci_or_cyinit};
assign CO[0] = S[0] ? ci_or_cyinit : DI[0];
assign CO[1] = S[1] ? CO[0] : DI[1];
assign CO[2] = S[2] ? CO[1] : DI[2];
assign CO[3] = S[3] ? CO[2] : DI[3];
assign ci_or_cyinit = CI | CYINIT;
endmodule

View File

@ -1,113 +0,0 @@
module TB_GND(ok);
wire MY_G, XL_G;
MY_GND MY(.G(MY_G));
XL_GND XL(.G(XL_G));
output ok = MY_G == XL_G;
endmodule
module TB_INV(ok, I);
input I;
wire MY_O, XL_O;
MY_INV MY(.O(MY_O), .I(I));
XL_INV XL(.O(XL_O), .I(I));
output ok = MY_O == XL_O;
endmodule
module TB_LUT1(ok, I0);
input I0;
wire [1:0] MY_O, XL_O;
genvar i;
generate for (i=0; i<2; i=i+1) begin:V
MY_LUT1 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0));
XL_LUT1 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0));
end endgenerate
output ok = MY_O == XL_O;
endmodule
module TB_LUT2(ok, I0, I1);
input I0, I1;
wire [3:0] MY_O, XL_O;
genvar i;
generate for (i=0; i<4; i=i+1) begin:V
MY_LUT2 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1));
XL_LUT2 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1));
end endgenerate
output ok = MY_O == XL_O;
endmodule
module TB_LUT3(ok, I0, I1, I2);
input I0, I1, I2;
wire [7:0] MY_O, XL_O;
genvar i;
generate for (i=0; i<8; i=i+1) begin:V
MY_LUT3 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2));
XL_LUT3 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2));
end endgenerate
output ok = MY_O == XL_O;
endmodule
module TB_LUT4(ok, I0, I1, I2, I3);
input I0, I1, I2, I3;
wire [15:0] MY_O, XL_O;
genvar i;
generate for (i=0; i<16; i=i+1) begin:V
MY_LUT4 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3));
XL_LUT4 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3));
end endgenerate
output ok = MY_O == XL_O;
endmodule
module TB_LUT5(ok, I0, I1, I2, I3, I4);
input I0, I1, I2, I3, I4;
wire [31:0] MY_O, XL_O;
genvar i;
generate for (i=0; i<32; i=i+1) begin:V
MY_LUT5 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4));
XL_LUT5 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4));
end endgenerate
output ok = MY_O == XL_O;
endmodule
module TB_LUT6(ok, I0, I1, I2, I3, I4, I5);
input I0, I1, I2, I3, I4, I5;
wire [63:0] MY_O, XL_O;
genvar i;
generate for (i=0; i<64; i=i+1) begin:V
MY_LUT6 #(.INIT(i)) MY(.O(MY_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4), .I5(I5));
XL_LUT6 #(.INIT(i)) XL(.O(XL_O[i]), .I0(I0), .I1(I1), .I2(I2), .I3(I3), .I4(I4), .I5(I5));
end endgenerate
output ok = MY_O == XL_O;
endmodule
module TB_MUXCY(ok, CI, DI, S);
input CI, DI, S;
wire MY_O, XL_O;
MY_MUXCY MY(.O(MY_O), .CI(CI), .DI(DI), .S(S));
XL_MUXCY XL(.O(XL_O), .CI(CI), .DI(DI), .S(S));
output ok = MY_O == XL_O;
endmodule
module TB_MUXF7(ok, I0, I1, S);
input I0, I1, S;
wire MY_O, XL_O;
MY_MUXF7 MY(.O(MY_O), .I0(I0), .I1(I1), .S(S));
XL_MUXF7 XL(.O(XL_O), .I0(I0), .I1(I1), .S(S));
output ok = MY_O == XL_O;
endmodule
module TB_VCC(ok);
wire MY_P, XL_P;
MY_VCC MY(.P(MY_P));
XL_VCC XL(.P(XL_P));
output ok = MY_P == XL_P;
endmodule
module TB_XORCY(ok, CI, LI);
input CI, LI;
wire MY_O, XL_O;
MY_XORCY MY(.O(MY_O), .CI(CI), .LI(LI));
XL_XORCY XL(.O(XL_O), .CI(CI), .LI(LI));
output ok = MY_O == XL_O;
endmodule

View File

@ -1,63 +0,0 @@
# Verify xilinx cell models
read_verilog xl_cells.v
read_verilog xl_cells_tb.v
rename GND MY_GND
rename INV MY_INV
rename LUT1 MY_LUT1
rename LUT2 MY_LUT2
rename LUT3 MY_LUT3
rename LUT4 MY_LUT4
rename LUT5 MY_LUT5
rename LUT6 MY_LUT6
rename MUXCY MY_MUXCY
rename MUXF7 MY_MUXF7
rename VCC MY_VCC
rename XORCY MY_XORCY
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/GND.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/INV.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT1.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT2.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT3.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT4.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT5.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/LUT6.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/MUXCY.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/MUXF7.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/VCC.v
read_verilog /opt/Xilinx/14.5/ISE_DS/ISE/verilog/src/unisims/XORCY.v
rename GND XL_GND
rename INV XL_INV
rename LUT1 XL_LUT1
rename LUT2 XL_LUT2
rename LUT3 XL_LUT3
rename LUT4 XL_LUT4
rename LUT5 XL_LUT5
rename LUT6 XL_LUT6
rename MUXCY XL_MUXCY
rename MUXF7 XL_MUXF7
rename VCC XL_VCC
rename XORCY XL_XORCY
hierarchy
proc
flatten TB_*
opt_clean
sat -verify -prove ok 1'b1 TB_GND
sat -verify -prove ok 1'b1 TB_INV
sat -verify -prove ok 1'b1 TB_LUT1
sat -verify -prove ok 1'b1 TB_LUT2
sat -verify -prove ok 1'b1 TB_LUT3
sat -verify -prove ok 1'b1 TB_LUT4
sat -verify -prove ok 1'b1 TB_LUT5
sat -verify -prove ok 1'b1 TB_LUT6
sat -verify -prove ok 1'b1 TB_MUXCY
sat -verify -prove ok 1'b1 TB_MUXF7
sat -verify -prove ok 1'b1 TB_VCC
sat -verify -prove ok 1'b1 TB_XORCY