2 * yosys -- Yosys Open SYnthesis Suite
4 * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 * The internal logic cell simulation library.
22 * This Verilog library contains simple simulation models for the internal
23 * logic cells ($_NOT_ , $_AND_ , ...) that are generated by the default technology
24 * mapper (see "techmap.v" in this directory) and expected by the "abc" pass.
28 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
32 //- A buffer. This cell type is always optimized away by the opt_clean pass.
34 //- Truth table: A | Y
39 module \$_BUF_ (A, Y);
45 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
51 //- Truth table: A | Y
56 module \$_NOT_ (A, Y);
62 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
66 //- A 2-input AND gate.
68 //- Truth table: A B | Y
75 module \$_AND_ (A, B, Y);
81 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
85 //- A 2-input NAND gate.
87 //- Truth table: A B | Y
94 module \$_NAND_ (A, B, Y);
100 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
104 //- A 2-input OR gate.
106 //- Truth table: A B | Y
113 module \$_OR_ (A, B, Y);
119 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
123 //- A 2-input NOR gate.
125 //- Truth table: A B | Y
132 module \$_NOR_ (A, B, Y);
138 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
142 //- A 2-input XOR gate.
144 //- Truth table: A B | Y
151 module \$_XOR_ (A, B, Y);
157 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
159 //- $_XNOR_ (A, B, Y)
161 //- A 2-input XNOR gate.
163 //- Truth table: A B | Y
170 module \$_XNOR_ (A, B, Y);
176 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
178 //- $_ANDNOT_ (A, B, Y)
180 //- A 2-input AND-NOT gate.
182 //- Truth table: A B | Y
189 module \$_ANDNOT_ (A, B, Y);
195 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
197 //- $_ORNOT_ (A, B, Y)
199 //- A 2-input OR-NOT gate.
201 //- Truth table: A B | Y
208 module \$_ORNOT_ (A, B, Y);
214 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
216 //- $_MUX_ (A, B, S, Y)
218 //- A 2-input MUX gate.
220 //- Truth table: A B S | Y
225 module \$_MUX_ (A, B, S, Y);
228 assign Y = S ? B : A;
231 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
233 //- $_MUX4_ (A, B, C, D, S, T, Y)
235 //- A 4-input MUX gate.
237 //- Truth table: A B C D S T | Y
238 //- -------------+---
244 module \$_MUX4_ (A, B, C, D, S, T, Y);
245 input A, B, C, D, S, T;
247 assign Y = T ? (S ? D : C) :
251 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
253 //- $_MUX8_ (A, B, C, D, E, F, G, H, S, T, U, Y)
255 //- An 8-input MUX gate.
257 //- Truth table: A B C D E F G H S T U | Y
258 //- -----------------------+---
259 //- a - - - - - - - 0 0 0 | a
260 //- - b - - - - - - 1 0 0 | b
261 //- - - c - - - - - 0 1 0 | c
262 //- - - - d - - - - 1 1 0 | d
263 //- - - - - e - - - 0 0 1 | e
264 //- - - - - - f - - 1 0 1 | f
265 //- - - - - - - g - 0 1 1 | g
266 //- - - - - - - - h 1 1 1 | h
268 module \$_MUX8_ (A, B, C, D, E, F, G, H, S, T, U, Y);
269 input A, B, C, D, E, F, G, H, S, T, U;
271 assign Y = U ? T ? (S ? H : G) :
277 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
279 //- $_MUX16_ (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V, Y)
281 //- A 16-input MUX gate.
283 //- Truth table: A B C D E F G H I J K L M N O P S T U V | Y
284 //- -----------------------------------------+---
285 //- a - - - - - - - - - - - - - - - 0 0 0 0 | a
286 //- - b - - - - - - - - - - - - - - 1 0 0 0 | b
287 //- - - c - - - - - - - - - - - - - 0 1 0 0 | c
288 //- - - - d - - - - - - - - - - - - 1 1 0 0 | d
289 //- - - - - e - - - - - - - - - - - 0 0 1 0 | e
290 //- - - - - - f - - - - - - - - - - 1 0 1 0 | f
291 //- - - - - - - g - - - - - - - - - 0 1 1 0 | g
292 //- - - - - - - - h - - - - - - - - 1 1 1 0 | h
293 //- - - - - - - - - i - - - - - - - 0 0 0 1 | i
294 //- - - - - - - - - - j - - - - - - 1 0 0 1 | j
295 //- - - - - - - - - - - k - - - - - 0 1 0 1 | k
296 //- - - - - - - - - - - - l - - - - 1 1 0 1 | l
297 //- - - - - - - - - - - - - m - - - 0 0 1 1 | m
298 //- - - - - - - - - - - - - - n - - 1 0 1 1 | n
299 //- - - - - - - - - - - - - - - o - 0 1 1 1 | o
300 //- - - - - - - - - - - - - - - - p 1 1 1 1 | p
302 module \$_MUX16_ (A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V, Y);
303 input A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, S, T, U, V;
305 assign Y = V ? U ? T ? (S ? P : O) :
309 U ? T ? (S ? H : G) :
315 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
317 //- $_AOI3_ (A, B, C, Y)
319 //- A 3-input And-Or-Invert gate.
321 //- Truth table: A B C | Y
332 module \$_AOI3_ (A, B, C, Y);
335 assign Y = ~((A & B) | C);
338 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
340 //- $_OAI3_ (A, B, C, Y)
342 //- A 3-input Or-And-Invert gate.
344 //- Truth table: A B C | Y
355 module \$_OAI3_ (A, B, C, Y);
358 assign Y = ~((A | B) & C);
361 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
363 //- $_AOI4_ (A, B, C, Y)
365 //- A 4-input And-Or-Invert gate.
367 //- Truth table: A B C D | Y
386 module \$_AOI4_ (A, B, C, D, Y);
389 assign Y = ~((A & B) | (C & D));
392 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
394 //- $_OAI4_ (A, B, C, Y)
396 //- A 4-input Or-And-Invert gate.
398 //- Truth table: A B C D | Y
417 module \$_OAI4_ (A, B, C, D, Y);
420 assign Y = ~((A | B) & (C | D));
423 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
425 //- $_TBUF_ (A, E, Y)
427 //- A tri-state buffer.
429 //- Truth table: A E | Y
434 module \$_TBUF_ (A, E, Y);
437 assign Y = E ? A : 1'bz;
440 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
442 //- $_SR_NN_ (S, R, Q)
444 //- A set-reset latch with negative polarity SET and RESET.
446 //- Truth table: S R | Q
453 module \$_SR_NN_ (S, R, Q);
456 always @(negedge S, negedge R) begin
464 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
466 //- $_SR_NP_ (S, R, Q)
468 //- A set-reset latch with negative polarity SET and positive polarity RESET.
470 //- Truth table: S R | Q
477 module \$_SR_NP_ (S, R, Q);
480 always @(negedge S, posedge R) begin
488 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
490 //- $_SR_PN_ (S, R, Q)
492 //- A set-reset latch with positive polarity SET and negative polarity RESET.
494 //- Truth table: S R | Q
501 module \$_SR_PN_ (S, R, Q);
504 always @(posedge S, negedge R) begin
512 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
514 //- $_SR_PP_ (S, R, Q)
516 //- A set-reset latch with positive polarity SET and RESET.
518 //- Truth table: S R | Q
525 module \$_SR_PP_ (S, R, Q);
528 always @(posedge S, posedge R) begin
537 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
541 //- A D-type flip-flop that is clocked from the implicit global clock. (This cell
542 //- type is usually only used in netlists for formal verification.)
544 module \$_FF_ (D, Q);
547 always @($global_clock) begin
553 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
555 //- $_DFF_N_ (D, C, Q)
557 //- A negative edge D-type flip-flop.
559 //- Truth table: D C | Q
564 module \$_DFF_N_ (D, C, Q);
567 always @(negedge C) begin
572 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
574 //- $_DFF_P_ (D, C, Q)
576 //- A positive edge D-type flip-flop.
578 //- Truth table: D C | Q
583 module \$_DFF_P_ (D, C, Q);
586 always @(posedge C) begin
591 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
593 //- $_DFFE_NN_ (D, C, E, Q)
595 //- A negative edge D-type flip-flop with negative polarity enable.
597 //- Truth table: D C E | Q
602 module \$_DFFE_NN_ (D, C, E, Q);
605 always @(negedge C) begin
610 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
612 //- $_DFFE_NP_ (D, C, E, Q)
614 //- A negative edge D-type flip-flop with positive polarity enable.
616 //- Truth table: D C E | Q
621 module \$_DFFE_NP_ (D, C, E, Q);
624 always @(negedge C) begin
629 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
631 //- $_DFFE_PN_ (D, C, E, Q)
633 //- A positive edge D-type flip-flop with negative polarity enable.
635 //- Truth table: D C E | Q
640 module \$_DFFE_PN_ (D, C, E, Q);
643 always @(posedge C) begin
648 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
650 //- $_DFFE_PP_ (D, C, E, Q)
652 //- A positive edge D-type flip-flop with positive polarity enable.
654 //- Truth table: D C E | Q
659 module \$_DFFE_PP_ (D, C, E, Q);
662 always @(posedge C) begin
667 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
669 //- $_DFF_NN0_ (D, C, R, Q)
671 //- A negative edge D-type flip-flop with negative polarity reset.
673 //- Truth table: D C R | Q
679 module \$_DFF_NN0_ (D, C, R, Q);
682 always @(negedge C or negedge R) begin
690 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
692 //- $_DFF_NN1_ (D, C, R, Q)
694 //- A negative edge D-type flip-flop with negative polarity set.
696 //- Truth table: D C R | Q
702 module \$_DFF_NN1_ (D, C, R, Q);
705 always @(negedge C or negedge R) begin
713 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
715 //- $_DFF_NP0_ (D, C, R, Q)
717 //- A negative edge D-type flip-flop with positive polarity reset.
719 //- Truth table: D C R | Q
725 module \$_DFF_NP0_ (D, C, R, Q);
728 always @(negedge C or posedge R) begin
736 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
738 //- $_DFF_NP1_ (D, C, R, Q)
740 //- A negative edge D-type flip-flop with positive polarity set.
742 //- Truth table: D C R | Q
748 module \$_DFF_NP1_ (D, C, R, Q);
751 always @(negedge C or posedge R) begin
759 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
761 //- $_DFF_PN0_ (D, C, R, Q)
763 //- A positive edge D-type flip-flop with negative polarity reset.
765 //- Truth table: D C R | Q
771 module \$_DFF_PN0_ (D, C, R, Q);
774 always @(posedge C or negedge R) begin
782 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
784 //- $_DFF_PN1_ (D, C, R, Q)
786 //- A positive edge D-type flip-flop with negative polarity set.
788 //- Truth table: D C R | Q
794 module \$_DFF_PN1_ (D, C, R, Q);
797 always @(posedge C or negedge R) begin
805 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
807 //- $_DFF_PP0_ (D, C, R, Q)
809 //- A positive edge D-type flip-flop with positive polarity reset.
811 //- Truth table: D C R | Q
817 module \$_DFF_PP0_ (D, C, R, Q);
820 always @(posedge C or posedge R) begin
828 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
830 //- $_DFF_PP1_ (D, C, R, Q)
832 //- A positive edge D-type flip-flop with positive polarity set.
834 //- Truth table: D C R | Q
840 module \$_DFF_PP1_ (D, C, R, Q);
843 always @(posedge C or posedge R) begin
851 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
853 //- $_DFFSR_NNN_ (C, S, R, D, Q)
855 //- A negative edge D-type flip-flop with negative polarity set and reset.
857 //- Truth table: C S R D | Q
864 module \$_DFFSR_NNN_ (C, S, R, D, Q);
867 always @(negedge C, negedge S, negedge R) begin
877 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
879 //- $_DFFSR_NNP_ (C, S, R, D, Q)
881 //- A negative edge D-type flip-flop with negative polarity set and positive
884 //- Truth table: C S R D | Q
891 module \$_DFFSR_NNP_ (C, S, R, D, Q);
894 always @(negedge C, negedge S, posedge R) begin
904 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
906 //- $_DFFSR_NPN_ (C, S, R, D, Q)
908 //- A negative edge D-type flip-flop with positive polarity set and negative
911 //- Truth table: C S R D | Q
918 module \$_DFFSR_NPN_ (C, S, R, D, Q);
921 always @(negedge C, posedge S, negedge R) begin
931 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
933 //- $_DFFSR_NPP_ (C, S, R, D, Q)
935 //- A negative edge D-type flip-flop with positive polarity set and reset.
937 //- Truth table: C S R D | Q
944 module \$_DFFSR_NPP_ (C, S, R, D, Q);
947 always @(negedge C, posedge S, posedge R) begin
957 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
959 //- $_DFFSR_PNN_ (C, S, R, D, Q)
961 //- A positive edge D-type flip-flop with negative polarity set and reset.
963 //- Truth table: C S R D | Q
970 module \$_DFFSR_PNN_ (C, S, R, D, Q);
973 always @(posedge C, negedge S, negedge R) begin
983 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
985 //- $_DFFSR_PNP_ (C, S, R, D, Q)
987 //- A positive edge D-type flip-flop with negative polarity set and positive
990 //- Truth table: C S R D | Q
997 module \$_DFFSR_PNP_ (C, S, R, D, Q);
1000 always @(posedge C, negedge S, posedge R) begin
1010 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1012 //- $_DFFSR_PPN_ (C, S, R, D, Q)
1014 //- A positive edge D-type flip-flop with positive polarity set and negative
1017 //- Truth table: C S R D | Q
1024 module \$_DFFSR_PPN_ (C, S, R, D, Q);
1027 always @(posedge C, posedge S, negedge R) begin
1037 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1039 //- $_DFFSR_PPP_ (C, S, R, D, Q)
1041 //- A positive edge D-type flip-flop with positive polarity set and reset.
1043 //- Truth table: C S R D | Q
1050 module \$_DFFSR_PPP_ (C, S, R, D, Q);
1053 always @(posedge C, posedge S, posedge R) begin
1063 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1065 //- $_DLATCH_N_ (E, D, Q)
1067 //- A negative enable D-type latch.
1069 //- Truth table: E D | Q
1074 module \$_DLATCH_N_ (E, D, Q);
1083 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1085 //- $_DLATCH_P_ (E, D, Q)
1087 //- A positive enable D-type latch.
1089 //- Truth table: E D | Q
1094 module \$_DLATCH_P_ (E, D, Q);
1103 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1105 //- $_DLATCHSR_NNN_ (E, S, R, D, Q)
1107 //- A negative enable D-type latch with negative polarity set and reset.
1109 //- Truth table: E S R D | Q
1116 module \$_DLATCHSR_NNN_ (E, S, R, D, Q);
1129 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1131 //- $_DLATCHSR_NNP_ (E, S, R, D, Q)
1133 //- A negative enable D-type latch with negative polarity set and positive polarity
1136 //- Truth table: E S R D | Q
1143 module \$_DLATCHSR_NNP_ (E, S, R, D, Q);
1156 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1158 //- $_DLATCHSR_NPN_ (E, S, R, D, Q)
1160 //- A negative enable D-type latch with positive polarity set and negative polarity
1163 //- Truth table: E S R D | Q
1170 module \$_DLATCHSR_NPN_ (E, S, R, D, Q);
1183 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1185 //- $_DLATCHSR_NPP_ (E, S, R, D, Q)
1187 //- A negative enable D-type latch with positive polarity set and reset.
1189 //- Truth table: E S R D | Q
1196 module \$_DLATCHSR_NPP_ (E, S, R, D, Q);
1209 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1211 //- $_DLATCHSR_PNN_ (E, S, R, D, Q)
1213 //- A positive enable D-type latch with negative polarity set and reset.
1215 //- Truth table: E S R D | Q
1222 module \$_DLATCHSR_PNN_ (E, S, R, D, Q);
1235 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1237 //- $_DLATCHSR_PNP_ (E, S, R, D, Q)
1239 //- A positive enable D-type latch with negative polarity set and positive polarity
1242 //- Truth table: E S R D | Q
1249 module \$_DLATCHSR_PNP_ (E, S, R, D, Q);
1262 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1264 //- $_DLATCHSR_PPN_ (E, S, R, D, Q)
1266 //- A positive enable D-type latch with positive polarity set and negative polarity
1269 //- Truth table: E S R D | Q
1276 module \$_DLATCHSR_PPN_ (E, S, R, D, Q);
1289 // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
1291 //- $_DLATCHSR_PPP_ (E, S, R, D, Q)
1293 //- A positive enable D-type latch with positive polarity set and reset.
1295 //- Truth table: E S R D | Q
1302 module \$_DLATCHSR_PPP_ (E, S, R, D, Q);