1module GP_DFFS(input D, CLK, nSET, output reg Q);
2	parameter [0:0] INIT = 1'bx;
3	GP_DFFSR #(
4		.INIT(INIT),
5		.SRMODE(1'b1),
6	) _TECHMAP_REPLACE_ (
7		.D(D),
8		.CLK(CLK),
9		.nSR(nSET),
10		.Q(Q)
11	);
12endmodule
13
14module GP_DFFR(input D, CLK, nRST, output reg Q);
15	parameter [0:0] INIT = 1'bx;
16	GP_DFFSR #(
17		.INIT(INIT),
18		.SRMODE(1'b0),
19	) _TECHMAP_REPLACE_ (
20		.D(D),
21		.CLK(CLK),
22		.nSR(nRST),
23		.Q(Q)
24	);
25endmodule
26
27module GP_DFFSI(input D, CLK, nSET, output reg nQ);
28	parameter [0:0] INIT = 1'bx;
29	GP_DFFSRI #(
30		.INIT(INIT),
31		.SRMODE(1'b1),
32	) _TECHMAP_REPLACE_ (
33		.D(D),
34		.CLK(CLK),
35		.nSR(nSET),
36		.nQ(nQ)
37	);
38endmodule
39
40module GP_DFFRI(input D, CLK, nRST, output reg nQ);
41	parameter [0:0] INIT = 1'bx;
42	GP_DFFSRI #(
43		.INIT(INIT),
44		.SRMODE(1'b0),
45	) _TECHMAP_REPLACE_ (
46		.D(D),
47		.CLK(CLK),
48		.nSR(nRST),
49		.nQ(nQ)
50	);
51endmodule
52
53module GP_DLATCHS(input D, nCLK, nSET, output reg Q);
54	parameter [0:0] INIT = 1'bx;
55	GP_DLATCHSR #(
56		.INIT(INIT),
57		.SRMODE(1'b1),
58	) _TECHMAP_REPLACE_ (
59		.D(D),
60		.nCLK(nCLK),
61		.nSR(nSET),
62		.Q(Q)
63	);
64endmodule
65
66module GP_DLATCHR(input D, nCLK, nRST, output reg Q);
67	parameter [0:0] INIT = 1'bx;
68	GP_DLATCHSR #(
69		.INIT(INIT),
70		.SRMODE(1'b0),
71	) _TECHMAP_REPLACE_ (
72		.D(D),
73		.nCLK(nCLK),
74		.nSR(nRST),
75		.Q(Q)
76	);
77endmodule
78
79module GP_DLATCHSI(input D, nCLK, nSET, output reg nQ);
80	parameter [0:0] INIT = 1'bx;
81	GP_DLATCHSRI #(
82		.INIT(INIT),
83		.SRMODE(1'b1),
84	) _TECHMAP_REPLACE_ (
85		.D(D),
86		.nCLK(nCLK),
87		.nSR(nSET),
88		.nQ(nQ)
89	);
90endmodule
91
92module GP_DLATCHRI(input D, nCLK, nRST, output reg nQ);
93	parameter [0:0] INIT = 1'bx;
94	GP_DLATCHSRI #(
95		.INIT(INIT),
96		.SRMODE(1'b0),
97	) _TECHMAP_REPLACE_ (
98		.D(D),
99		.nCLK(nCLK),
100		.nSR(nRST),
101		.nQ(nQ)
102	);
103endmodule
104
105module GP_OBUFT(input IN, input OE, output OUT);
106	GP_IOBUF _TECHMAP_REPLACE_ (
107		.IN(IN),
108		.OE(OE),
109		.IO(OUT),
110		.OUT()
111	);
112endmodule
113
114module \$lut (A, Y);
115	parameter WIDTH = 0;
116	parameter LUT = 0;
117
118	(* force_downto *)
119	input [WIDTH-1:0] A;
120	output Y;
121
122	generate
123		if (WIDTH == 1) begin
124		if(LUT == 2'b01) begin
125			GP_INV _TECHMAP_REPLACE_ (.OUT(Y), .IN(A[0]) );
126		end
127		else begin
128			GP_2LUT #(.INIT({2'b00, LUT})) _TECHMAP_REPLACE_ (.OUT(Y),
129				.IN0(A[0]), .IN1(1'b0));
130		end
131		end else
132		if (WIDTH == 2) begin
133			GP_2LUT #(.INIT(LUT)) _TECHMAP_REPLACE_ (.OUT(Y),
134				.IN0(A[0]), .IN1(A[1]));
135		end else
136		if (WIDTH == 3) begin
137			GP_3LUT #(.INIT(LUT)) _TECHMAP_REPLACE_ (.OUT(Y),
138				.IN0(A[0]), .IN1(A[1]), .IN2(A[2]));
139		end else
140		if (WIDTH == 4) begin
141			GP_4LUT #(.INIT(LUT)) _TECHMAP_REPLACE_ (.OUT(Y),
142				.IN0(A[0]), .IN1(A[1]), .IN2(A[2]), .IN3(A[3]));
143		end else begin
144			wire _TECHMAP_FAIL_ = 1;
145		end
146	endgenerate
147endmodule
148
149module \$__COUNT_ (CE, CLK, OUT, POUT, RST, UP);
150
151	input wire CE;
152	input wire CLK;
153	output reg OUT;
154	(* force_downto *)
155	output reg[WIDTH-1:0] POUT;
156	input wire RST;
157	input wire UP;
158
159	parameter COUNT_TO = 1;
160	parameter RESET_MODE = "RISING";
161	parameter RESET_TO_MAX = 0;
162	parameter HAS_POUT = 0;
163	parameter HAS_CE = 0;
164	parameter WIDTH = 8;
165	parameter DIRECTION = "DOWN";
166
167	//If we have a DIRECTION other than DOWN fail... GP_COUNTx_ADV is not supported yet
168	if(DIRECTION != "DOWN") begin
169		initial begin
170			$display("ERROR: \$__COUNT_ support for GP_COUNTx_ADV is not yet implemented. This counter should never have been extracted (bug in extract_counter pass?).");
171			$finish;
172		end
173	end
174
175	//If counter is more than 14 bits wide, complain (also shouldn't happen)
176	else if(WIDTH > 14) begin
177		initial begin
178			$display("ERROR: \$__COUNT_ support for cascaded counters is not yet implemented. This counter should never have been extracted (bug in extract_counter pass?).");
179			$finish;
180		end
181	end
182
183	//If counter is more than 8 bits wide and has parallel output, we have a problem
184	else if(WIDTH > 8 && HAS_POUT) begin
185		initial begin
186			$display("ERROR: \$__COUNT_ support for 9-14 bit counters with parallel output is not yet implemented. This counter should never have been extracted (bug in extract_counter pass?).");
187			$finish;
188		end
189	end
190
191	//Looks like a legal counter! Do something with it
192	else if(WIDTH <= 8) begin
193		if(HAS_CE) begin
194			wire ce_not;
195			GP_INV ceinv(
196				.IN(CE),
197				.OUT(ce_not)
198			);
199			GP_COUNT8_ADV #(
200				.COUNT_TO(COUNT_TO),
201				.RESET_MODE(RESET_MODE),
202				.RESET_VALUE(RESET_TO_MAX ? "COUNT_TO" : "ZERO"),
203				.CLKIN_DIVIDE(1)
204			) _TECHMAP_REPLACE_ (
205				.CLK(CLK),
206				.RST(RST),
207				.OUT(OUT),
208				.UP(1'b0),		//always count down for now
209				.KEEP(ce_not),
210				.POUT(POUT)
211			);
212		end
213		else begin
214			GP_COUNT8 #(
215				.COUNT_TO(COUNT_TO),
216				.RESET_MODE(RESET_MODE),
217				.CLKIN_DIVIDE(1)
218			) _TECHMAP_REPLACE_ (
219				.CLK(CLK),
220				.RST(RST),
221				.OUT(OUT),
222				.POUT(POUT)
223			);
224		end
225	end
226
227	else begin
228		if(HAS_CE) begin
229			wire ce_not;
230			GP_INV ceinv(
231				.IN(CE),
232				.OUT(ce_not)
233			);
234			GP_COUNT14_ADV #(
235				.COUNT_TO(COUNT_TO),
236				.RESET_MODE(RESET_TO_MAX ? "COUNT_TO" : "ZERO"),
237				.RESET_VALUE("COUNT_TO"),
238				.CLKIN_DIVIDE(1)
239			) _TECHMAP_REPLACE_ (
240				.CLK(CLK),
241				.RST(RST),
242				.OUT(OUT),
243				.UP(1'b0),		//always count down for now
244				.KEEP(ce_not),
245				.POUT(POUT)
246			);
247		end
248		else begin
249			GP_COUNT14 #(
250				.COUNT_TO(COUNT_TO),
251				.RESET_MODE(RESET_MODE),
252				.CLKIN_DIVIDE(1)
253			) _TECHMAP_REPLACE_ (
254				.CLK(CLK),
255				.RST(RST),
256				.OUT(OUT)
257			);
258		end
259	end
260
261endmodule
262