/* "p2lib for symbolic" verilog description $Header: /home00/kobayashi/repository/ST/examples/verilog/symbolic.v,v 1.1 2002/06/10 08:59:22 kobayasi Exp $ */ `timescale 100ps/100ps `celldefine module inv1(y,a); input a; output y; specify (a => y) = ( 1: 1: 2, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=10; specparam area=2; `endif endspecify not(y, a); // assign o_int = ~a; endmodule `endcelldefine `celldefine module inv2(y,a); input a; output y; specify (a => y) = ( 0: 1: 1, 0: 0: 1); `ifdef SYNTH specparam maxfanout$y=10; specparam area=3; `endif endspecify not(y, a); // assign o_int = ~a; endmodule `endcelldefine `celldefine module inv4(y,a); input a; output y; specify (a => y) = ( 0: 0: 1, 0: 0: 0); `ifdef SYNTH specparam maxfanout$y=10; specparam area=4; `endif endspecify not(y, a); // assign o_int = ~a; endmodule `endcelldefine `celldefine module buf1(y,a); input a; output y; specify (a => y) = ( 1: 1: 2, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=10; specparam area=3; `endif endspecify buf(y, a); endmodule `endcelldefine `celldefine module buf2(y,a); input a; output y; specify (a => y) = ( 1: 1: 2, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=10; specparam area=3; `endif endspecify buf(y, a); endmodule `endcelldefine `celldefine module buf4(y,a); input a; output y; specify (a => y) = ( 1: 1: 1, 0: 1: 1); `ifdef SYNTH specparam maxfanout$y=10; specparam area=4; `endif endspecify buf(y, a); endmodule `endcelldefine `celldefine module nand2(y,a,b); input a; input b; output y; nand(y,a,b); // assign o_int =~(a&b); specify (a => y) = ( 1: 2: 2, 1: 1: 2); (b => y) = ( 1: 2: 3, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=11; specparam area=3; `endif endspecify endmodule `endcelldefine `celldefine module nand3(y,a,b,c); input a; input b; input c; output y; nand(y, a,b,c); specify (a => y) = ( 1: 2: 3, 1: 2: 4); (b => y) = ( 2: 3: 4, 1: 2: 4); (c => y) = ( 2: 3: 5, 2: 2: 4); `ifdef SYNTH specparam maxfanout$y=11; specparam area=4; `endif endspecify endmodule `endcelldefine `celldefine module nand2p(y,a,b); input a; input b; output y; nand(y, a,b); specify (a => y) = ( 2: 2: 3, 1: 2: 3); (b => y) = ( 3: 4: 5, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine `celldefine module nand3p(y,a,b,c); input a; input b; input c; output y; nand(y, a,b,c); specify (a => y) = ( 1: 2: 2, 1: 2: 3); (b => y) = ( 1: 2: 3, 1: 2: 3); (c => y) = ( 2: 3: 4, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine `celldefine module nand4(y,a,b,c,d); input a; input b; input c; input d; output y; nand(y,a,b,c,d); specify (a => y) = ( 2: 3: 4, 1: 2: 3); (b => y) = ( 3: 4: 6, 1: 2: 3); (c => y) = ( 4: 5: 7, 1: 2: 3); (d => y) = ( 5: 7: 9, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=6; `endif endspecify endmodule `endcelldefine `celldefine module zbuf1(y,a,en); input a; input en; output y; bufif1(y, a,en); specify (a => y) = ( 1: 1: 2, 1: 1: 2); (en => y) = ( 1: 1: 2, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=11; specparam area=8; `endif endspecify endmodule `endcelldefine `celldefine module zbuf2(y,a,en); input a; input en; output y; bufif1(y, a,en); specify (a => y) = ( 1: 2: 3, 1: 1: 2); (en => y) = ( 1: 2: 2, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=22; specparam area=10; `endif endspecify endmodule `endcelldefine `celldefine module zbuf4(y,a,en); input a; input en; output y; bufif1(y, a,en); specify (a => y) = ( 2: 3: 4, 2: 2: 3); (en => y) = ( 2: 2: 4, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=44; specparam area=14; `endif endspecify endmodule `endcelldefine `celldefine module nor2(y,a,b); input a; input b; output y; nor(y,a,b); specify (a => y) = ( 1: 2: 3, 1: 1: 2); (b => y) = ( 1: 2: 3, 2: 2: 4); `ifdef SYNTH specparam maxfanout$y=11; specparam area=4; `endif endspecify endmodule `endcelldefine `celldefine module nor3(y,a,b,c); input a; input b; input c; output y; nor(y, a,b,c); specify (a => y) = ( 3: 4: 6, 3: 4: 6); (b => y) = ( 3: 4: 6, 2: 3: 4); (c => y) = ( 2: 4: 5, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine `celldefine module nor4(y,a,b,c,d); input a; input b; input c; input d; output y; nor(y, a,b,c,d); specify (a => y) = ( 4: 6: 9, 4: 5: 8); (b => y) = ( 4: 6: 9, 3: 4: 6); (c => y) = ( 4: 6: 9, 2: 3: 4); (d => y) = ( 4: 5: 8, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=6; `endif endspecify endmodule `endcelldefine `celldefine module or2(y,a,b); input a; input b; output y; or(y, a,b); specify (a => y) = ( 1: 2: 2, 1: 1: 2); (b => y) = ( 1: 2: 3, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=11; specparam area=4; `endif endspecify endmodule `endcelldefine `celldefine module or3(y,a,b,c); input a; input b; input c; output y; or(y, a,b,c); specify (a => y) = ( 1: 2: 3, 1: 2: 3); (b => y) = ( 1: 2: 3, 1: 2: 3); (c => y) = ( 1: 2: 2, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine `celldefine module or4(y,a,b,c,d); input a; input b; input c; input d; output y; or(y, a,b,c,d); specify (a => y) = ( 2: 2: 3, 2: 2: 4); (b => y) = ( 1: 2: 3, 2: 2: 4); (c => y) = ( 1: 2: 3, 2: 2: 4); (d => y) = ( 1: 2: 3, 2: 2: 3); `ifdef SYNTH specparam maxfanout$y=11; specparam area=6; `endif endspecify endmodule `endcelldefine `celldefine module and2(y,a,b); input a; input b; output y; and(y, a,b); specify (a => y) = ( 1: 2: 2, 1: 2: 2); (b => y) = ( 1: 2: 2, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=13; specparam area=4; `endif endspecify endmodule `endcelldefine `celldefine module and3(y,a,b,c); input a; input b; input c; output y; and(y, a,b,c); specify (a => y) = ( 1: 2: 3, 1: 2: 3); (b => y) = ( 1: 2: 3, 1: 2: 3); (c => y) = ( 1: 2: 3, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=13; specparam area=5; `endif endspecify endmodule `endcelldefine `celldefine module and4(y,a,b,c,d); input a; input b; input c; input d; output y; and(y, a,b,c,d); specify (a => y) = ( 1: 2: 3, 1: 2: 3); (b => y) = ( 1: 2: 3, 1: 2: 3); (c => y) = ( 1: 2: 3, 2: 2: 3); (d => y) = ( 1: 2: 3, 2: 2: 4); `ifdef SYNTH specparam maxfanout$y=13; specparam area=6; `endif endspecify endmodule `endcelldefine `celldefine module xor2(y,a,b); input a; input b; output y; xor(y, a,b); specify (a => y) = ( 2: 3: 4, 1: 2: 3); (b => y) = ( 2: 3: 4, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=13; specparam area=8; `endif endspecify endmodule `endcelldefine `celldefine module xnor2(y,a,b); input a; input b; output y; xnor(y, a,b); specify (a => y) = ( 3: 4: 6, 1: 2: 3); (b => y) = ( 3: 4: 6, 2: 3: 4); `ifdef SYNTH specparam maxfanout$y=13; specparam area=7; `endif endspecify endmodule `endcelldefine primitive udp_aoi21(y,a1,a2,b); output y; input a1,a2,b; table // a1 a2 b: y; ? ? 1 : 0; 1 1 ? : 0; 0 ? 0 : 1; ? 0 0 : 1; endtable endprimitive `celldefine module aoi21(y,a,b,c); input a; input b; input c; output y; udp_aoi21(y, a,b,c); specify (a => y) = ( 2: 3: 4, 2: 3: 5); (b => y) = ( 3: 4: 5, 2: 3: 5); (c => y) = ( 2: 4: 5, 2: 3: 5); `ifdef SYNTH specparam maxfanout$y=11; specparam area=4; `endif endspecify endmodule `endcelldefine primitive udp_aoi22(y,a1,a2,b1,b2); output y; input a1,a2,b1,b2; table // a1 a2 b1 b2 : y; ? ? 1 1 : 0; 1 1 ? ? : 0; 0 ? 0 ? : 1; ? 0 0 ? : 1; 0 ? ? 0 : 1; ? 0 ? 0 : 1; endtable endprimitive `celldefine module aoi22(y,a,b,c,d); input a; input b; input c; input d; output y; udp_aoi22(y, a,b,c,d); // assign o_int=~(a&b|c&d); specify (a => y) = ( 2: 4: 5, 2: 2: 4); (b => y) = ( 3: 4: 6, 2: 2: 4); (c => y) = ( 2: 4: 5, 3: 4: 6); (d => y) = ( 3: 4: 6, 3: 4: 6); `ifdef SYNTH specparam maxfanout$y=11; specparam area=6; `endif endspecify endmodule `endcelldefine primitive udp_aoi23(y,a1,a2,b,c); output y; input a1,a2,b,c; table // a1 a2 b c : y; ? ? 1 ? : 0; ? ? ? 1 : 0; 1 1 0 0 : 0; ? 0 0 0 : 1; 0 ? 0 0 : 1; endtable endprimitive `celldefine module aoi23(y,a,b,c,d); input a; input b; input c; input d; output y; udp_aoi23(y, a,b,c,d); // assign o_int=~(a&b|c|d); specify (a => y) = ( 4: 6: 8, 3: 4: 7); (b => y) = ( 5: 7: 9, 3: 4: 7); (c => y) = ( 5: 7: 9, 1: 2: 3); (d => y) = ( 4: 7: 9, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine primitive udp_aoi2x3(y,a1,a2,b1,b2,c1,c2); output y; input a1,a2,b1,b2,c1,c2; table // a1 a2 b1 b2 c1 c2 : y; ? ? ? ? 1 1 : 0; ? ? 1 1 ? ? : 0; 1 1 ? ? ? ? : 0; 0 ? 0 ? 0 ? : 1; 0 ? 0 ? ? 0 : 1; ? 0 0 ? 0 ? : 1; ? 0 0 ? ? 0 : 1; 0 ? ? 0 0 ? : 1; 0 ? ? 0 ? 0 : 1; ? 0 ? 0 0 ? : 1; ? 0 ? 0 ? 0 : 1; endtable endprimitive `celldefine module aoi2x3(y,a,b,c,d,e,f); input a; input b; input c; input d; input e; input f; output y; udp_aoi2x3(y, a,b,c,d,e,f); // assign o_int=~(a&b|c&d|e&f); specify (a => y) = ( 5: 7: 10, 2: 3: 5); (b => y) = ( 6: 8: 12, 2: 3: 5); (c => y) = ( 6: 9: 12, 3: 5: 8); (d => y) = ( 5: 8: 11, 3: 5: 8); (e => y) = ( 5: 8: 11, 5: 6: 11); (f => y) = ( 6: 9: 12, 5: 6: 11); `ifdef SYNTH specparam maxfanout$y=11; specparam area=9; `endif endspecify endmodule `endcelldefine primitive udp_aoi31(y,a,b,c,d); output y; input a,b,c,d; table // a b c d : y; ? ? ? 1 : 0; 1 1 1 0 : 0; 0 ? ? 0 : 1; ? 0 ? 0 : 1; ? ? 0 0 : 1; endtable endprimitive `celldefine module aoi31(y,a,b,c,d); input a; input b; input c; input d; output y; udp_aoi31(y, a,b,c,d); // assign o_int=~(a&b&c|d); specify (a => y) = ( 2: 2: 4, 2: 3: 5); (b => y) = ( 2: 3: 5, 2: 3: 5); (c => y) = ( 3: 4: 6, 2: 3: 5); (d => y) = ( 3: 4: 6, 3: 4: 6); `ifdef SYNTH specparam maxfanout$y=11; specparam area=6; `endif endspecify endmodule `endcelldefine primitive udp_aoi33(y,a1,a2,a3,b1,b2,b3); output y; input a1,a2,a3,b1,b2,b3; table // a1 a2 a3 b1 b2 b3: y; ? ? ? 1 1 1 : 0; 1 1 1 ? ? ? : 0; 0 ? ? 0 ? ? : 1; 0 ? ? ? 0 ? : 1; 0 ? ? ? ? 0 : 1; ? 0 ? 0 ? ? : 1; ? 0 ? ? 0 ? : 1; ? 0 ? ? ? 0 : 1; ? ? 0 0 ? ? : 1; ? ? 0 ? 0 ? : 1; ? ? 0 ? ? 0 : 1; endtable endprimitive `celldefine module aoi33(y,a,b,c,d,e,f); input a; input b; input c; input d; input e; input f; output y; udp_aoi33(y, a,b,c,d,e,f); // assign o_int=~(a&b&c|d&e&f); specify (a => y) = ( 3: 5: 7, 2: 3: 5); (b => y) = ( 3: 4: 6, 2: 3: 5); (c => y) = ( 2: 3: 5, 2: 3: 5); (d => y) = ( 2: 4: 5, 4: 6: 9); (e => y) = ( 3: 4: 6, 4: 6: 9); (f => y) = ( 3: 5: 7, 4: 6: 9); `ifdef SYNTH specparam maxfanout$y=11; specparam area=8; `endif endspecify endmodule `endcelldefine primitive udp_oai21(y,a1,a2,b); output y; input a1,a2,b; table // a1 a2 b : y; ? ? 0 : 1; 0 0 ? : 1; 1 ? 1 : 0; ? 1 1 : 0; endtable endprimitive `celldefine module oai21(y,a,b,c); input a; input b; input c; output y; udp_oai21(y, a,b,c); // assign o_int=~((a|b)&c); specify (a => y) = ( 2: 3: 5, 1: 1: 2); (b => y) = ( 2: 3: 5, 2: 2: 4); (c => y) = ( 1: 2: 3, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=11; specparam area=4; `endif endspecify endmodule `endcelldefine primitive udp_oai22(y,a1,a2,b1,b2); output y; input a1,a2,b1,b2; table // a1 a2 b1 b2 : y; ? ? 0 0 : 1; 0 0 ? ? : 1; 1 ? 1 ? : 0; ? 1 1 ? : 0; 1 ? ? 1 : 0; ? 1 ? 1 : 0; endtable endprimitive `celldefine module oai22(y,a,b,c,d); input a; input b; input c; input d; output y; udp_oai22(y, a,b,c,d); // assign o_int=~((a|b)&(c|d)); specify (a => y) = ( 4: 6: 8, 2: 2: 4); (b => y) = ( 4: 6: 8, 1: 2: 3); (c => y) = ( 3: 4: 6, 1: 2: 3); (d => y) = ( 3: 4: 6, 2: 2: 4); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine primitive udp_oai23(y,a1,a2,b,c); output y; input a1,a2,b,c; table // a1 a2 b c : y; ? ? ? 0 : 1; ? ? 0 ? : 1; 0 0 ? ? : 1; 1 ? 1 1 : 0; ? 1 1 1 : 0; endtable endprimitive `celldefine module oai23(y,a,b,c,d); input a; input b; input c; input d; output y; udp_oai23(y, a,b,c,d); // assign o_int=~((a|b)&c&d); specify (a => y) = ( 3: 4: 6, 3: 4: 7); (b => y) = ( 3: 4: 6, 2: 3: 4); (c => y) = ( 2: 3: 4, 2: 3: 4); (d => y) = ( 1: 2: 3, 2: 3: 4); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine primitive udp_oai2x3(y,a1,a2,b1,b2,c1,c2); output y; input a1,a2,b1,b2,c1,c2; table // a1 a2 b1 b2 c1 c2 : y; ? ? ? ? 0 0 : 1; ? ? 0 0 ? ? : 1; 0 0 ? ? ? ? : 1; 1 ? 1 ? 1 ? : 0; 1 ? 1 ? ? 1 : 0; ? 1 1 ? 1 ? : 0; ? 1 1 ? ? 1 : 0; 1 ? ? 1 1 ? : 0; 1 ? ? 1 ? 1 : 0; ? 1 ? 1 1 ? : 0; ? 1 ? 1 ? 1 : 0; endtable endprimitive `celldefine module oai2x3(y,a,b,c,d,e,f); input a; input b; input c; input d; input e; input f; output y; udp_oai2x3(y,a,b,c,d,e,f); // assign o_int=~((a|b)&(c|d)&(e|f)); specify (a => y) = ( 6: 9: 12, 3: 4: 6); (b => y) = ( 6: 9: 12, 3: 5: 7); (c => y) = ( 5: 7: 9, 3: 5: 7); (d => y) = ( 5: 7: 9, 3: 4: 6); (e => y) = ( 3: 5: 7, 2: 4: 6); (f => y) = ( 3: 5: 7, 3: 5: 7); `ifdef SYNTH specparam maxfanout$y=11; specparam area=8; `endif endspecify endmodule `endcelldefine primitive udp_oai31(y,a1,a2,a3,b); output y; input a1,a2,a3,b; table // a1 a2 a2 a3: y; ? ? ? 0 : 1; 0 0 0 ? : 1; 1 ? ? 1 : 0; ? 1 ? 1 : 0; ? ? 1 1 : 0; endtable endprimitive `celldefine module oai31(y,a,b,c,d); input a; input b; input c; input d; output y; udp_oai31(y, a,b,c,d); // assign o_int=~((a|b|c)&d); specify (a => y) = ( 4: 6: 8, 2: 3: 5); (b => y) = ( 4: 6: 8, 2: 2: 4); (c => y) = ( 4: 5: 8, 1: 1: 2); (d => y) = ( 1: 2: 3, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=11; specparam area=5; `endif endspecify endmodule `endcelldefine primitive udp_oai33(y,a1,a2,a3,b1,b2,b3); output y; input a1,a2,a3,b1,b2,b3; table // a1 a2 b1 b2 c1 c2 : y; ? ? ? 0 0 0 : 1; 0 0 0 ? ? ? : 1; 1 ? ? 1 ? ? : 0; 1 ? ? ? 1 ? : 0; 1 ? ? ? ? 1 : 0; ? 1 ? 1 ? ? : 0; ? 1 ? ? 1 ? : 0; ? 1 ? ? ? 1 : 0; ? ? 1 1 ? ? : 0; ? ? 1 ? 1 ? : 0; ? ? 1 ? ? 1 : 0; endtable endprimitive `celldefine module oai33(y,a,b,c,d,e,f); input a; input b; input c; input d; input e; input f; output y; udp_oai33(y, a,b,c,d,e,f); // assign o_int=~((a|b|c)&(d|e|f)); specify (a => y) = ( 5: 7: 10, 2: 3: 6); (b => y) = ( 5: 7: 10, 2: 3: 4); (c => y) = ( 5: 7: 10, 1: 2: 3); (d => y) = ( 8: 11: 15, 1: 2: 3); (e => y) = ( 8: 11: 15, 2: 3: 4); (f => y) = ( 8: 11: 15, 2: 3: 5); `ifdef SYNTH specparam maxfanout$y=11; specparam area=7; `endif endspecify endmodule `endcelldefine `celldefine module bus_hold(y,a); input a; output y; not(y, a); // assign o_int=~a; specify (a => y) = ( 2: 3: 4, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y=10; specparam area=3; `endif endspecify endmodule `endcelldefine `celldefine module dec24(y0,y1,y2,y3,a,b); input a; input b; output y0; output y1; output y2; output y3; wire abar,bbar; not(abar,a); not(bbar,b); nand(y0,abar,bbar); nand(y1,abar,b); nand(y2,a,bbar); nand(y3,a,b); // assign o_int0=~(~a&~b); // assign o_int1=~(a&~b); // assign o_int2=~(~a&b); // assign o_int3=~(a&b); specify (a => y0) = ( 1: 1: 2, 1: 1: 2); (a => y1) = ( 1: 1: 2, 1: 1: 2); (a => y2) = ( 1: 1: 2, 1: 1: 2); (a => y3) = ( 1: 1: 2, 1: 1: 2); (b => y0) = ( 1: 2: 3, 1: 1: 2); (b => y1) = ( 1: 2: 3, 1: 1: 2); (b => y2) = ( 1: 2: 3, 1: 1: 2); (b => y3) = ( 1: 2: 3, 1: 1: 2); `ifdef SYNTH specparam maxfanout$y0=13; specparam maxfanout$y1=13; specparam maxfanout$y2=13; specparam maxfanout$y3=13; specparam area=14; `endif endspecify endmodule `endcelldefine `celldefine module sel12(y0,y1,a,s); input a; input s; output y0; output y1; bufif0(y0,a,s); bufif1(y1,a,s); // assign y0= !s ? 'bz : a; // assign y1= s ? a : 'bz; specify (a => y0) = ( 1: 2: 3, 1: 2: 3); (a => y1) = ( 1: 2: 3, 1: 2: 3); (s => y0) = ( 0: 2: 0, 0: 2: 0); (s => y1) = ( 0: 2: 0, 0: 2: 0); `ifdef SYNTH specparam maxfanout$y0=13; specparam maxfanout$y1=13; specparam area=9; `endif endspecify endmodule `endcelldefine primitive udp_mux41(y,s0,s1,a,b,c,d); output y; reg y; input s0,s1,a,b,c,d; table //s0 s1 a b c d : state : y; 0 0 0 ? ? ? : ? : 0; ? 0 0 0 ? ? : ? : 0; 0 ? 0 ? 0 ? : ? : 0; ? ? 0 0 0 0 : ? : 0; 0 1 ? ? 0 ? : ? : 0; ? 1 ? ? 0 0 : ? : 0; 1 0 ? 0 ? ? : ? : 0; 1 ? ? 0 ? 0 : ? : 0; 1 1 ? ? ? 0 : ? : 0; 0 0 1 ? ? ? : ? : 1; 0 ? 1 ? 1 ? : ? : 1; ? 0 1 1 ? ? : ? : 1; ? ? 1 1 1 1 : ? : 1; 0 1 ? ? 1 ? : ? : 1; ? 1 ? ? 1 1 : ? : 1; 1 0 ? 1 ? ? : ? : 1; 1 ? ? 1 ? 1 : ? : 1; 1 1 ? ? ? 1 : ? : 1; endtable endprimitive `celldefine module sel21(y,a,b,s); input a; input b; input s; output y; wire gnd = 0; not(sbar,s); udp_mux41 (y,sbar,gnd,a,b,gnd,gnd); // assign y=s&a|~s&b; specify (a => y) = ( 1: 2: 3, 1: 2: 3); (b => y) = ( 1: 2: 3, 1: 2: 3); (s => y) = ( 1: 2: 3, 1: 2: 3); `ifdef SYNTH specparam maxfanout$y=13; specparam area=9; `endif endspecify endmodule `endcelldefine `celldefine module priority_enc(x0,x1,n,i0,i1,i2,i3); input i0; input i1; input i2; input i3; output x0; output x1; output n; wire i2bar; not(i2bar,i2); or(tmp0,i3,i2bar); and(x0,tmp0,i1); or(x1,i3,i2); nor(n,i0,i1,i2,i3); // assign x0=i3|~i2&i1; // assign x1=i3|i2; // assign n=~(i0|i1|i2|i3); specify (i0 => x0) = ( 1: 2: 3, 1: 2: 3); (i0 => x1) = ( 1: 2: 3, 1: 2: 3); (i0 => n) = ( 4: 5: 8, 1: 2: 3); (i1 => x0) = ( 1: 2: 3, 1: 2: 3); (i1 => x1) = ( 0: 2: 0, 0: 2: 0); (i1 => n) = ( 4: 6: 9, 3: 5: 8); (i2 => x0) = ( 1: 2: 3, 1: 2: 2); (i2 => x1) = ( 1: 2: 2, 1: 1: 2); (i2 => n) = ( 4: 6: 9, 3: 4: 6); (i3 => x0) = ( 1: 2: 2, 1: 2: 3); (i3 => x1) = ( 1: 1: 2, 1: 1: 2); (i3 => n) = ( 4: 6: 9, 2: 3: 4); `ifdef SYNTH specparam maxfanout$x0=13; specparam maxfanout$x1=13; specparam maxfanout$n=13; specparam area=17; `endif endspecify endmodule `endcelldefine primitive udp_lat(q,load,d,resetz,setz,notifier,recover ); output q; reg q; input load,d,resetz,setz,notifier,recover; table // ld d resetz setz notifier recover : state : q ; * ? ? 0 ? ? : ? : - ; * ? 0 ? ? ? : ? : - ; ? * ? 0 ? ? : ? : - ; ? * 0 ? ? ? : ? : - ; // event on d 0 (01) X 1 ? ? : 0 : 0 ; 0 (01) 1 1 ? ? : ? : - ; 1 (01) 1 1 ? ? : ? : 1 ; 0 (01) 1 X ? ? : 1 : 1 ; 1 (01) 1 X ? ? : ? : 1 ; 0 (0X) 1 1 ? ? : ? : - ; ? (0X) 1 X ? ? : 1 : 1 ; 0 (0X) X 1 ? ? : 0 : 0 ; 0 (10) 1 1 ? ? : ? : - ; 1 (10) 1 1 ? ? : ? : 0 ; 0 (10) X 1 ? ? : ? : - ; 1 (10) X 1 ? ? : ? : 0 ; 0 (10) 1 X ? ? : 1 : 1 ; 0 (1X) 1 1 ? ? : ? : - ; 0 (1X) X 1 ? ? : ? : - ; 0 (1X) 1 X ? ? : ? : - ; 0 (X0) 1 1 ? ? : ? : - ; 1 (X0) 1 1 ? ? : ? : 0 ; 0 (X0) X 1 ? ? : ? : - ; 1 (X0) X 1 ? ? : ? : 0 ; 0 (X0) 1 X ? ? : 1 : 1 ; 0 (X1) 1 1 ? ? : ? : - ; 1 (X1) 1 1 ? ? : ? : 1 ; 0 (X1) X 1 ? ? : ? : - ; 0 (X1) 1 X ? ? : ? : - ; 1 (X1) 1 X ? ? : ? : 1 ; // event on ld (01) 0 1 1 ? ? : ? : 0 ; (01) 1 1 1 ? ? : ? : 1 ; (01) 0 X 1 ? ? : ? : 0 ; (01) 1 1 X ? ? : ? : 1 ; (0X) 0 1 1 ? ? : 0 : 0 ; (0X) 1 1 1 ? ? : 1 : 1 ; (0X) 0 X 1 ? ? : 0 : 0 ; (0X) 1 1 X ? ? : 1 : 1 ; (10) ? ? ? ? ? : ? : - ; (1X) ? ? ? ? ? : ? : - ; (X0) ? ? ? ? ? : ? : - ; (X1) 0 1 1 ? ? : ? : 0 ; (X1) 1 1 1 ? ? : ? : 1 ; (X1) 0 X 1 ? ? : ? : 0 ; (X1) 1 1 X ? ? : ? : 1 ; // event on resetz ? ? (01) 0 ? ? : ? : 1 ; 1 1 (01) X ? ? : ? : 1 ; 0 ? (01) 1 ? ? : 0 : 0 ; 1 0 (01) 1 ? ? : 0 : 0 ; 1 1 (01) 1 ? ? : ? : 1 ; X 0 (01) 1 ? ? : 0 : 0 ; 0 ? (0X) 1 ? ? : 0 : 0 ; 1 0 (0X) 1 ? ? : 0 : 0 ; X 0 (0X) 1 ? ? : 0 : 0 ; ? ? (10) 1 ? ? : ? : 0 ; ? ? (1X) 1 ? ? : 0 : 0 ; ? ? (X0) 1 ? ? : ? : 0 ; ? ? (X1) 0 ? ? : ? : 1 ; 1 1 (X1) X ? ? : ? : 1 ; ? ? (X1) 1 ? ? : 0 : 0 ; 1 1 (X1) 1 ? ? : X : 1 ; // event on setz ? ? 0 (01) ? ? : ? : 0 ; 1 0 X (01) ? ? : ? : 0 ; 0 ? 1 (01) ? ? : 1 : 1 ; 1 0 1 (01) ? ? : 1 : 0 ; 1 1 1 (01) ? ? : 1 : 1 ; X 1 1 (01) ? ? : 1 : 1 ; 0 ? 1 (0X) ? ? : 1 : 1 ; 1 1 1 (0X) ? ? : 1 : 1 ; X 1 1 (0X) ? ? : 1 : 1 ; ? ? 1 (10) ? ? : ? : 1 ; ? ? 1 (1X) ? ? : 1 : 1 ; ? ? 1 (X0) ? ? : ? : 1 ; ? ? 0 (X1) ? ? : ? : 0 ; 1 0 X (X1) ? ? : ? : 0 ; ? ? 1 (X1) ? ? : 1 : 1 ; 1 0 1 (X1) ? ? : X : 0 ; ? ? ? ? * ? : ? : X ; ? 0 ? ? ? * : X : 0 ; ? 1 ? ? ? * : X : 1 ; ? X ? ? ? * : ? : X ; endtable endprimitive `celldefine module d_latch(q,d,ck); input d; input ck; output q; wire vdd = 1; reg notifier,recover; // reg qt; not(ck_,ck); udp_lat (q,ck_,d,vdd,vdd,notifier,recover); // always @(d or ck) // if (ck) // qt<=d; specify (d => q) = ( 2: 2: 4, 2: 2: 3); (ck => q) = ( 2: 3: 4, 2: 2: 3); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=9; `endif endspecify endmodule `endcelldefine `celldefine module d_latch_r(q,d,reset,ck); input d; input reset; input ck; output q; wire vdd = 1; not(ck_,ck); reg notifier,recover; udp_lat (q,ck_,d,reset,vdd,notifier,recover); // always @(d or ck or reset) // if (!reset) // qt<=0; // else if (ck) // qt<=d; specify (d => q) = ( 2: 3: 4, 2: 2: 4); (reset => q) = ( 2: 3: 4, 1: 2: 3); (ck => q) = ( 2: 3: 4, 2: 2: 4); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=11; `endif endspecify endmodule `endcelldefine `celldefine module d_latch_s(q,d,set,ck); input d; input set; input ck; output q; not(ck_,ck); wire vdd = 1; reg notifier,recover; udp_lat (q,ck_,d,vdd,set,notifier,recover); // reg qt; // always @(d or ck or set) // if (!set) // qt<=1; // else if (ck) // qt<=d; // buf(q, qt); specify (d => q) = ( 2: 3: 4, 2: 2: 4); (set => q) = ( 1: 2: 3, 1: 2: 3); (ck => q) = ( 2: 3: 4, 2: 2: 4); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=13; `endif endspecify endmodule `endcelldefine `celldefine module d_latch_sr(q,d,reset,set,ck); input d; input reset; input set; input ck; output q; // reg qt; wire vdd = 1; not(ck_,ck); reg notifier,recover; udp_lat (q,ck_,d,reset,set,notifier,recover); // always @(d or ck or reset or set) // if (!set) // qt<=1; // else if (!reset) // qt<=0; // else if (ck) // qt<=d; // buf(q, qt); specify (d => q) = ( 2: 3: 4, 2: 3: 4); (reset => q) = ( 1: 2: 3, 1: 2: 3); (set => q) = ( 1: 2: 3, 2: 2: 4); (ck => q) = ( 2: 3: 4, 2: 3: 4); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=14; `endif endspecify endmodule `endcelldefine primitive udp_dff(q,ck,d,resetz,setz,notifier); output q; reg q; input ck,d,resetz,setz,notifier; table // ck d resetz setz notifier : state : q ; // resetz or setz inactive * ? ? 0 ? : ? : - ; * ? 0 ? ? : ? : - ; ? * ? 0 ? : ? : - ; ? * 0 ? ? : ? : - ; // events on ck (01) 0 1 1 ? : ? : 0 ; (01) 1 1 1 ? : ? : 1 ; (01) 0 X 1 ? : ? : 0 ; (01) 1 1 X ? : ? : 1 ; (10) ? ? ? ? : ? : - ; (0X) 0 1 1 ? : 0 : 0 ; (1X) 0 1 1 ? : 0 : 0 ; (0X) 1 1 1 ? : 1 : 1 ; (1X) 1 1 1 ? : 1 : 1 ; (0X) 0 X 1 ? : ? : - ; (1X) 0 X 1 ? : ? : - ; (0X) 1 1 X ? : ? : - ; (1X) 1 1 X ? : ? : - ; (X0) ? ? ? ? : ? : - ; (X1) ? ? ? ? : ? : - ; // events on d ? (01) 1 X ? : ? : - ; ? (0X) 1 X ? : ? : - ; ? (10) X 1 ? : ? : - ; ? (1X) X 1 ? : ? : - ; 0 (01) 1 1 ? : ? : - ; 0 (0X) 1 1 ? : ? : - ; 1 (01) 1 1 ? : ? : - ; 1 (0X) 1 1 ? : ? : - ; 0 (10) 1 1 ? : ? : - ; 0 (1X) 1 1 ? : ? : - ; 1 (10) 1 1 ? : ? : - ; 1 (1X) 1 1 ? : ? : - ; 0 (01) X 1 ? : ? : - ; 0 (0X) X 1 ? : ? : - ; 1 (01) X 1 ? : ? : - ; 1 (0X) X 1 ? : ? : - ; 0 (10) 1 X ? : ? : - ; 0 (1X) 1 X ? : ? : - ; 1 (10) 1 X ? : ? : - ; 1 (1X) 1 X ? : ? : - ; ? (X0) ? ? ? : ? : - ; ? (X1) ? ? ? : ? : - ; // events on resetz 0 ? (01) 1 ? : ? : 0 ; 0 ? (0X) 1 ? : ? : 0 ; 1 ? (01) 1 ? : ? : 0 ; 1 ? (0X) 1 ? : ? : 0 ; X 0 (01) 1 ? : ? : 0 ; X 0 (0X) 1 ? : ? : 0 ; ? ? (10) 1 ? : ? : 0 ; ? ? (X0) 1 ? : ? : 0 ; ? ? (01) 0 ? : ? : 1 ; ? ? (X1) 0 ? : ? : 1 ; ? ? (1X) 1 ? : 0 : 0 ; ? ? (X1) 1 ? : 0 : 0 ; // events on setz 0 ? 1 (01) ? : ? : 1 ; 0 ? 1 (0X) ? : ? : 1 ; 1 ? 1 (01) ? : ? : 1 ; 1 ? 1 (0X) ? : ? : 1 ; X 1 1 (01) ? : ? : 1 ; X 1 1 (0X) ? : ? : 1 ; ? ? 1 (10) ? : ? : 1 ; ? ? 1 (X0) ? : ? : 1 ; ? ? 0 (01) ? : ? : 0 ; ? ? 0 (X1) ? : ? : 0 ; ? ? 1 (1X) ? : 1 : 1 ; ? ? 1 (X1) ? : 1 : 1 ; ? ? ? ? * : ? : x ; // at any notifier event, // output goes to x endtable endprimitive `celldefine module dff(q,d,ck); input d; input ck; output q; reg notifier; wire vdd = 1; not(ck_,ck); udp_dff (q,ck_,d,vdd,vdd,notifier); // reg qt; // always @(negedge ck) // qt<=d; // buf(q, qt); specify (d => q) = ( 2: 3: 4, 2: 3: 4); (ck => q) = ( 2: 3: 4, 2: 2: 3); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=15; `endif endspecify endmodule `endcelldefine `celldefine module dff_r(q,d,reset,ck); input d; input reset; input ck; output q; reg notifier; wire vdd = 1; not(ck_,ck); udp_dff (q,ck_,d,reset,vdd,notifier); // reg qt; // always @(negedge ck or negedge reset) // qt<=(!reset)? 0:d; // buf(q, qt); specify (d => q) = ( 2: 3: 4, 2: 3: 4); (reset => q) = ( 2: 3: 4, 1: 2: 3); (ck => q) = ( 2: 3: 4, 2: 2: 4); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=18; `endif endspecify endmodule `endcelldefine `celldefine module dff_s(q,d,set,ck); input d; input set; input ck; output q; reg notifier; wire vdd = 1; not(ck_,ck); udp_dff (q,ck_,d,vdd,set,notifier); // reg qt; // always @(negedge ck or negedge set) // qt<=(!set)? 1:d; // buf(q, qt); specify (d => q) = ( 2: 3: 4, 2: 3: 4); (set => q) = ( 1: 2: 3, 1: 2: 3); (ck => q) = ( 2: 3: 4, 2: 2: 4); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=19; `endif endspecify endmodule `endcelldefine `celldefine module dff_sr(q,d,reset,set,ck); input d; input reset; input set; input ck; output q; reg notifier; wire vdd = 1; not(ck_,ck); udp_dff (q,ck_,d,reset,set,notifier); // reg qt; // always @(negedge ck or negedge set or negedge reset) // qt<=(!set)? 1:((!reset)? 0: d); // buf(q, qt); specify (d => q) = ( 2: 3: 4, 2: 3: 4); (reset => q) = ( 1: 2: 3, 1: 2: 3); (set => q) = ( 1: 2: 3, 2: 2: 4); (ck => q) = ( 2: 3: 4, 2: 3: 4); `ifdef SYNTH specparam maxfanout$q=8.0; specparam area=20; `endif endspecify endmodule `endcelldefine