diff options
Diffstat (limited to 'techlibs/ice40')
| -rw-r--r-- | techlibs/ice40/cells_sim.v | 153 | 
1 files changed, 153 insertions, 0 deletions
| diff --git a/techlibs/ice40/cells_sim.v b/techlibs/ice40/cells_sim.v index 1b759a28f..ad572c877 100644 --- a/techlibs/ice40/cells_sim.v +++ b/techlibs/ice40/cells_sim.v @@ -372,6 +372,7 @@ module SB_DFFSR (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFR (  	output `SB_DFF_REG,  	input C, R, D @@ -389,7 +390,13 @@ module SB_DFFR (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(negedge R, posedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 599; +`else +		if (R) (R => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (!R) (posedge C => (Q : D)) = 540;  	endspecify @@ -402,7 +409,13 @@ module SB_DFFR (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(negedge R, posedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 883; +`else +		if (R) (R => Q) = 883;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (!R) (posedge C => (Q : D)) = 796;  	endspecify @@ -415,7 +428,13 @@ module SB_DFFR (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge R, posedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 1589; +`else +		if (R) (R => Q) = 1589;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (!R) (posedge C => (Q : D)) = 1391;  	endspecify @@ -470,6 +489,7 @@ module SB_DFFSS (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFS (  	output `SB_DFF_REG,  	input C, S, D @@ -487,7 +507,13 @@ module SB_DFFS (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(negedge S, posedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 599; +`else +		if (S) (S => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (!S) (posedge C => (Q : D)) = 540;  	endspecify @@ -500,7 +526,13 @@ module SB_DFFS (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(negedge S, posedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 883; +`else +		if (S) (S => Q) = 883;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (!S) (posedge C => (Q : D)) = 796;  	endspecify @@ -513,7 +545,13 @@ module SB_DFFS (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge S, posedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 1589; +`else +		if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (!S) (posedge C => (Q : D)) = 1391;  	endspecify @@ -576,6 +614,7 @@ module SB_DFFESR (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFER (  	output `SB_DFF_REG,  	input C, E, R, D @@ -595,7 +634,13 @@ module SB_DFFER (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(negedge R, posedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 599; +`else +		if (R) (R => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (E && !R) (posedge C => (Q : D)) = 540;  	endspecify @@ -610,7 +655,13 @@ module SB_DFFER (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(negedge R, posedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 883; +`else +		if (R) (R => Q) = 883; 	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (E && !R) (posedge C => (Q : D)) = 796;  	endspecify @@ -625,7 +676,13 @@ module SB_DFFER (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge R, posedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 1589; +`else +		if (R) (R => Q) = 1589;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (E && !R) (posedge C => (Q : D)) = 1391;  	endspecify @@ -688,6 +745,7 @@ module SB_DFFESS (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFES (  	output `SB_DFF_REG,  	input C, E, S, D @@ -707,7 +765,13 @@ module SB_DFFES (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(posedge S, posedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 599; +`else +		if (S) (S => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (E && !S) (posedge C => (Q : D)) = 540;  	endspecify @@ -722,7 +786,13 @@ module SB_DFFES (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(posedge S, posedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 883; +`else +		if (S) (S => Q) = 883; // Technically, this should be an edge sensitive path +							   // but for facilitating a bypass box, let's pretend it's +							   // a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (E && !S) (posedge C => (Q : D)) = 796;  	endspecify @@ -737,7 +807,13 @@ module SB_DFFES (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(posedge S, posedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 1589; +`else +		if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path +							   // but for facilitating a bypass box, let's pretend it's +							   // a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (E && !S) (posedge C => (Q : D)) = 1391;  	endspecify @@ -891,7 +967,13 @@ module SB_DFFNR (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(negedge R, negedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 599; +`else +		if (R) (R => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (!R) (negedge C => (Q : D)) = 540;  	endspecify @@ -904,7 +986,13 @@ module SB_DFFNR (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(negedge R, negedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 883; +`else +		if (R) (R => Q) = 883;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (!R) (negedge C => (Q : D)) = 796;  	endspecify @@ -917,7 +1005,13 @@ module SB_DFFNR (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge R, negedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 1589; +`else +		if (R) (R => Q) = 1589;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (!R) (negedge C => (Q : D)) = 1391;  	endspecify @@ -972,6 +1066,7 @@ module SB_DFFNSS (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFNS (  	output `SB_DFF_REG,  	input C, S, D @@ -989,7 +1084,13 @@ module SB_DFFNS (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(negedge S, negedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 599; +`else +		if (S) (S => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (!S) (negedge C => (Q : D)) = 540;  	endspecify @@ -1002,7 +1103,13 @@ module SB_DFFNS (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(negedge S, negedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 883; +`else +		if (S) (S => Q) = 883;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (!S) (negedge C => (Q : D)) = 796;  	endspecify @@ -1015,7 +1122,13 @@ module SB_DFFNS (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge S, negedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 1589; +`else +		if (S) (S => Q) = 1589;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (!S) (negedge C => (Q : D)) = 1391;  	endspecify @@ -1078,6 +1191,7 @@ module SB_DFFNESR (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFNER (  	output `SB_DFF_REG,  	input C, E, R, D @@ -1097,7 +1211,13 @@ module SB_DFFNER (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(R, negedge C, 2160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 599; +`else +		if (R) (R => Q) = 599;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (E && !R) (negedge C => (Q : D)) = 540;  	endspecify @@ -1112,7 +1232,13 @@ module SB_DFFNER (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(R, negedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 883; +`else +		if (R) (R => Q) = 883;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (E && !R) (negedge C => (Q : D)) = 796;  	endspecify @@ -1127,7 +1253,13 @@ module SB_DFFNER (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge R, negedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge R => (Q : 1'b0)) = 1589; +`else +		if (R) (R => Q) = 1589;	// Technically, this should be an edge sensitive path +					// but for facilitating a bypass box, let's pretend it's +					// a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (E && !R) (negedge C => (Q : D)) = 1391;  	endspecify @@ -1190,6 +1322,7 @@ module SB_DFFNESS (  `endif  endmodule +(* abc9_box, lib_whitebox *)  module SB_DFFNES (  	output `SB_DFF_REG,  	input C, E, S, D @@ -1209,7 +1342,14 @@ module SB_DFFNES (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63  		$setup(negedge S, negedge C, 160);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 599; +`else +        if (S) (S => Q) = 599; // Technically, this should be an edge sensitive path +                               // but for facilitating a bypass box, let's pretend it's +                               // a simple path +`endif +  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90  		if (E && !S) (negedge C => (Q : D)) = 540;  	endspecify @@ -1224,7 +1364,13 @@ module SB_DFFNES (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63  		$setup(negedge S, negedge C, 235);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 883; +`else +        if (S) (S => Q) = 883; // Technically, this should be an edge sensitive path +                               // but for facilitating a bypass box, let's pretend it's +                               // a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90  		if (E && !S) (negedge C => (Q : D)) = 796;  	endspecify @@ -1239,7 +1385,13 @@ module SB_DFFNES (  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75  		$setup(negedge S, negedge C, 424);  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103 +`ifndef YOSYS  		(posedge S => (Q : 1'b1)) = 1589; +`else +        if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path +                               // but for facilitating a bypass box, let's pretend it's +                               // a simple path +`endif  		// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102  		if (E && !S) (negedge C => (Q : D)) = 1391;  	endspecify @@ -2736,6 +2888,7 @@ module SB_IO_OD (  `endif  endmodule +//(* abc9_box, lib_whitebox *) // TODO  module SB_MAC16 (  	input CLK, CE,  	input [15:0] C, A, B, D, | 
