mirror of https://github.com/YosysHQ/yosys.git
157 lines
3.7 KiB
Plaintext
157 lines
3.7 KiB
Plaintext
|
read_verilog -icells <<EOF
|
||
|
module test();
|
||
|
`define CELL_AY(typ) \
|
||
|
wire typ``_a, typ``_y; \
|
||
|
$``typ typ(.A(typ``_a), .Y(typ``_y));
|
||
|
`define CELL_ABY(typ) \
|
||
|
wire typ``_a, typ``_b, typ``_y; \
|
||
|
$``typ typ(.A(typ``_a), .B(typ``_b), .Y(typ``_y));
|
||
|
`define CELL_SABY(typ) \
|
||
|
wire typ``_a, typ``_b, typ``_y, typ``_s; \
|
||
|
$``typ typ(.A(typ``_a), .B(typ``_b), .Y(typ``_y), .S(typ``_s));
|
||
|
`define CELL_ABCY(typ) \
|
||
|
wire typ``_a, typ``_b, typ``_c, typ``_y; \
|
||
|
$``typ typ(.A(typ``_a), .B(typ``_b), .C(typ``_c), .Y(typ``_y));
|
||
|
`define CELL_ABCDY(typ) \
|
||
|
wire typ``_a, typ``_b, typ``_c, typ``_d, typ``_y; \
|
||
|
$``typ typ(.A(typ``_a), .B(typ``_b), .C(typ``_c), .D(typ``_d), .Y(typ``_y));
|
||
|
|
||
|
`CELL_AY(_BUF_)
|
||
|
`CELL_AY(_NOT_)
|
||
|
`CELL_ABY(_AND_)
|
||
|
`CELL_ABY(_NAND_)
|
||
|
`CELL_ABY(_OR_)
|
||
|
`CELL_ABY(_NOR_)
|
||
|
`CELL_ABY(_XOR_)
|
||
|
`CELL_ABY(_XNOR_)
|
||
|
`CELL_ABY(_ANDNOT_)
|
||
|
`CELL_ABY(_ORNOT_)
|
||
|
`CELL_SABY(_MUX_)
|
||
|
`CELL_SABY(_NMUX_)
|
||
|
`CELL_ABCY(_AOI3_)
|
||
|
`CELL_ABCY(_OAI3_)
|
||
|
`CELL_ABCDY(_AOI4_)
|
||
|
`CELL_ABCDY(_OAI4_)
|
||
|
endmodule
|
||
|
EOF
|
||
|
|
||
|
expose -input c:* %ci* w:* %i
|
||
|
expose c:* %co* w:* %i
|
||
|
copy test gold
|
||
|
select test
|
||
|
write_aiger2 aiger2_gates.aig
|
||
|
select -clear
|
||
|
delete test
|
||
|
read_aiger -module_name test aiger2_gates.aig
|
||
|
select -assert-none test/t:$_AND_ test/t:$_NOT_ %% test/c:* %D
|
||
|
miter -equiv -make_outcmp -flatten gold test miter
|
||
|
sat -verify -show-ports -prove trigger 0 miter
|
||
|
|
||
|
design -reset
|
||
|
read_verilog -icells <<EOF
|
||
|
module test();
|
||
|
|
||
|
`define BIOP(name,op,w1,w2,wy) \
|
||
|
wire [w1-1:0] name``_a1; \
|
||
|
wire [w2-1:0] name``_b1; \
|
||
|
wire [wy-1:0] name``_y1; \
|
||
|
assign name``_y1 = name``_a1 op name``_b1; \
|
||
|
wire signed [w1-1:0] name``_a2; \
|
||
|
wire signed [w2-1:0] name``_b2; \
|
||
|
wire [wy-1:0] name``_y2; \
|
||
|
assign name``_y2 = name``_a2 op name``_b2;
|
||
|
|
||
|
`define UNOP(name,op,w1) \
|
||
|
wire signed [w1-1:0] name``_a1; \
|
||
|
wire signed [w1-1:0] name``_y1; \
|
||
|
assign name``_y1 = op name``_a1; \
|
||
|
wire [w1-1:0] name``_a2; \
|
||
|
wire [w1-1:0] name``_y2; \
|
||
|
assign name``_y2 = op name``_a2;
|
||
|
|
||
|
`define UNOP_REDUCE(name,op,w1) \
|
||
|
wire signed [w1-1:0] name``_a1; \
|
||
|
wire name``_y1; \
|
||
|
assign name``_y1 = op name``_a1; \
|
||
|
wire [w1-1:0] name``_a2; \
|
||
|
wire name``_y2; \
|
||
|
assign name``_y2 = op name``_a2;
|
||
|
|
||
|
`BIOP(and, &, 3, 4, 5)
|
||
|
`BIOP(or, |, 4, 3, 2)
|
||
|
`BIOP(xor, ^, 3, 3, 3)
|
||
|
`BIOP(xnor, ~^, 3, 3, 3)
|
||
|
`BIOP(logic_and, &&, 4, 3, 1)
|
||
|
`BIOP(logic_or, ||, 3, 3, 2)
|
||
|
`UNOP(not, ~, 3)
|
||
|
`UNOP_REDUCE(logic_not, !, 3)
|
||
|
`UNOP_REDUCE(reduce_and, &, 3)
|
||
|
`UNOP_REDUCE(reduce_or, |, 3)
|
||
|
`UNOP_REDUCE(reduce_xor, ^, 3)
|
||
|
`UNOP_REDUCE(reduce_xnor, ~^, 3)
|
||
|
|
||
|
wire [3:0] mux_a, mux_b, mux_s, mux_y;
|
||
|
assign mux_y = mux_s ? mux_b : mux_a;
|
||
|
|
||
|
wire [1:0] fa_a, fa_b, fa_c, fa_x, fa_y;
|
||
|
\$fa #(
|
||
|
.WIDTH(2)
|
||
|
) fa(.A(fa_a), .B(fa_b), .C(fa_c), .X(fa_x), .Y(fa_y));
|
||
|
endmodule
|
||
|
EOF
|
||
|
|
||
|
expose -input c:* %ci* w:* %i
|
||
|
expose c:* %co* w:* %i
|
||
|
splitnets -ports
|
||
|
copy test gold
|
||
|
select test
|
||
|
write_aiger2 aiger2_ops.aig
|
||
|
select -clear
|
||
|
delete test
|
||
|
read_aiger -module_name test aiger2_ops.aig
|
||
|
select -assert-none test/t:$_AND_ test/t:$_NOT_ %% test/c:* %D
|
||
|
miter -equiv -flatten gold test miter
|
||
|
sat -verify -prove trigger 0 miter
|
||
|
|
||
|
design -reset
|
||
|
read_verilog -icells <<EOF
|
||
|
module submodule1(a, y1, y2);
|
||
|
input wire [2:0] a;
|
||
|
output wire [2:0] y1 = a + 1;
|
||
|
output wire [2:0] y2 = a + 2;
|
||
|
endmodule
|
||
|
|
||
|
module submodule2(a, y1);
|
||
|
input wire [2:0] a;
|
||
|
output wire [2:0] y1 = ~a;
|
||
|
endmodule
|
||
|
|
||
|
module test(a, y1, y2);
|
||
|
input wire [2:0] a;
|
||
|
output wire [2:0] y1;
|
||
|
output wire [2:0] y2;
|
||
|
|
||
|
wire [2:0] m1;
|
||
|
wire [2:0] m2;
|
||
|
|
||
|
submodule2 s1(.a(a), .y1(m1));
|
||
|
submodule1 s2(.a(m1), .y1(y1), .y2(m2));
|
||
|
submodule2 s3(.a(m2), .y1(y2));
|
||
|
endmodule
|
||
|
EOF
|
||
|
|
||
|
expose -input c:* %ci* w:* %i
|
||
|
expose c:* %co* w:* %i
|
||
|
splitnets -ports
|
||
|
copy test gold
|
||
|
flatten gold
|
||
|
techmap submodule1
|
||
|
select test
|
||
|
write_aiger2 aiger2_ops.aig
|
||
|
select -clear
|
||
|
delete test
|
||
|
read_aiger -module_name test aiger2_ops.aig
|
||
|
select -assert-none test/t:$_AND_ test/t:$_NOT_ %% test/c:* %D
|
||
|
miter -equiv -flatten gold test miter
|
||
|
sat -verify -prove trigger 0 miter
|