Added mod->addGate() methods for new gate types
authorClifford Wolf <clifford@clifford.at>
Tue, 19 Aug 2014 11:44:56 +0000 (13:44 +0200)
committerClifford Wolf <clifford@clifford.at>
Tue, 19 Aug 2014 12:26:54 +0000 (14:26 +0200)
kernel/rtlil.cc
kernel/rtlil.h

index e4bf4f9f3bab37655395ca95544498333c79de32..24cce6b8b211b26c485e841b693f07737909ab65 100644 (file)
@@ -1239,10 +1239,10 @@ RTLIL::Cell *RTLIL::Module::addCell(RTLIL::IdString name, const RTLIL::Cell *oth
        RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y, bool is_signed) { \
                RTLIL::Cell *cell = addCell(name, _type);           \
                cell->parameters["\\A_SIGNED"] = is_signed;         \
-               cell->parameters["\\A_WIDTH"] = sig_a.size();        \
-               cell->parameters["\\Y_WIDTH"] = sig_y.size();        \
-               cell->setPort("\\A", sig_a);                   \
-               cell->setPort("\\Y", sig_y);                   \
+               cell->parameters["\\A_WIDTH"] = sig_a.size();       \
+               cell->parameters["\\Y_WIDTH"] = sig_y.size();       \
+               cell->setPort("\\A", sig_a);                        \
+               cell->setPort("\\Y", sig_y);                        \
                return cell;                                        \
        } \
        RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, bool is_signed) { \
@@ -1267,12 +1267,12 @@ DEF_METHOD(LogicNot,   1, "$logic_not")
                RTLIL::Cell *cell = addCell(name, _type);           \
                cell->parameters["\\A_SIGNED"] = is_signed;         \
                cell->parameters["\\B_SIGNED"] = is_signed;         \
-               cell->parameters["\\A_WIDTH"] = sig_a.size();        \
-               cell->parameters["\\B_WIDTH"] = sig_b.size();        \
-               cell->parameters["\\Y_WIDTH"] = sig_y.size();        \
-               cell->setPort("\\A", sig_a);                   \
-               cell->setPort("\\B", sig_b);                   \
-               cell->setPort("\\Y", sig_y);                   \
+               cell->parameters["\\A_WIDTH"] = sig_a.size();       \
+               cell->parameters["\\B_WIDTH"] = sig_b.size();       \
+               cell->parameters["\\Y_WIDTH"] = sig_y.size();       \
+               cell->setPort("\\A", sig_a);                        \
+               cell->setPort("\\B", sig_b);                        \
+               cell->setPort("\\Y", sig_y);                        \
                return cell;                                        \
        } \
        RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, bool is_signed) { \
@@ -1309,72 +1309,95 @@ DEF_METHOD(LogicOr,  1, "$logic_or")
 
 #define DEF_METHOD(_func, _type, _pmux) \
        RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y) { \
-               RTLIL::Cell *cell = addCell(name, _type);                \
+               RTLIL::Cell *cell = addCell(name, _type);                 \
                cell->parameters["\\WIDTH"] = sig_a.size();               \
                cell->parameters["\\WIDTH"] = sig_b.size();               \
                if (_pmux) cell->parameters["\\S_WIDTH"] = sig_s.size();  \
-               cell->setPort("\\A", sig_a);                        \
-               cell->setPort("\\B", sig_b);                        \
-               cell->setPort("\\S", sig_s);                        \
-               cell->setPort("\\Y", sig_y);                        \
-               return cell;                                             \
+               cell->setPort("\\A", sig_a);                              \
+               cell->setPort("\\B", sig_b);                              \
+               cell->setPort("\\S", sig_s);                              \
+               cell->setPort("\\Y", sig_y);                              \
+               return cell;                                              \
        } \
        RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s) { \
                RTLIL::SigSpec sig_y = addWire(NEW_ID, sig_a.size());     \
-               add ## _func(name, sig_a, sig_b, sig_s, sig_y);          \
-               return sig_y;                                            \
+               add ## _func(name, sig_a, sig_b, sig_s, sig_y);           \
+               return sig_y;                                             \
        }
 DEF_METHOD(Mux,      "$mux",        0)
 DEF_METHOD(Pmux,     "$pmux",       1)
 #undef DEF_METHOD
 
 #define DEF_METHOD_2(_func, _type, _P1, _P2) \
-       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig1, RTLIL::SigSpec sig2) { \
-               RTLIL::Cell *cell = addCell(name, _type);   \
-               cell->setPort("\\" #_P1, sig1);                 \
-               cell->setPort("\\" #_P2, sig2);                 \
-               return cell;                                \
+       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2) { \
+               RTLIL::Cell *cell = addCell(name, _type);         \
+               cell->setPort("\\" #_P1, sig1);                   \
+               cell->setPort("\\" #_P2, sig2);                   \
+               return cell;                                      \
        } \
-       RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig1) { \
-               RTLIL::SigSpec sig2 = addWire(NEW_ID);      \
-               add ## _func(name, sig1, sig2);             \
-               return sig2;                                \
+       RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1) { \
+               RTLIL::SigBit sig2 = addWire(NEW_ID);            \
+               add ## _func(name, sig1, sig2);                   \
+               return sig2;                                      \
        }
 #define DEF_METHOD_3(_func, _type, _P1, _P2, _P3) \
-       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig1, RTLIL::SigSpec sig2, RTLIL::SigSpec sig3) { \
-               RTLIL::Cell *cell = addCell(name, _type);   \
-               cell->setPort("\\" #_P1, sig1);                 \
-               cell->setPort("\\" #_P2, sig2);                 \
-               cell->setPort("\\" #_P3, sig3);                 \
-               return cell;                                \
+       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3) { \
+               RTLIL::Cell *cell = addCell(name, _type);         \
+               cell->setPort("\\" #_P1, sig1);                   \
+               cell->setPort("\\" #_P2, sig2);                   \
+               cell->setPort("\\" #_P3, sig3);                   \
+               return cell;                                      \
        } \
-       RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig1, RTLIL::SigSpec sig2) { \
-               RTLIL::SigSpec sig3 = addWire(NEW_ID);      \
-               add ## _func(name, sig1, sig2, sig3);       \
-               return sig3;                                \
+       RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2) { \
+               RTLIL::SigBit sig3 = addWire(NEW_ID);            \
+               add ## _func(name, sig1, sig2, sig3);             \
+               return sig3;                                      \
        }
 #define DEF_METHOD_4(_func, _type, _P1, _P2, _P3, _P4) \
-       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigSpec sig1, RTLIL::SigSpec sig2, RTLIL::SigSpec sig3, RTLIL::SigSpec sig4) { \
-               RTLIL::Cell *cell = addCell(name, _type);   \
-               cell->setPort("\\" #_P1, sig1);                 \
-               cell->setPort("\\" #_P2, sig2);                 \
-               cell->setPort("\\" #_P3, sig3);                 \
-               cell->setPort("\\" #_P4, sig4);                 \
-               return cell;                                \
+       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4) { \
+               RTLIL::Cell *cell = addCell(name, _type);         \
+               cell->setPort("\\" #_P1, sig1);                   \
+               cell->setPort("\\" #_P2, sig2);                   \
+               cell->setPort("\\" #_P3, sig3);                   \
+               cell->setPort("\\" #_P4, sig4);                   \
+               return cell;                                      \
+       } \
+       RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3) { \
+               RTLIL::SigBit sig4 = addWire(NEW_ID);            \
+               add ## _func(name, sig1, sig2, sig3, sig4);       \
+               return sig4;                                      \
+       }
+#define DEF_METHOD_5(_func, _type, _P1, _P2, _P3, _P4, _P5) \
+       RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4, RTLIL::SigBit sig5) { \
+               RTLIL::Cell *cell = addCell(name, _type);         \
+               cell->setPort("\\" #_P1, sig1);                   \
+               cell->setPort("\\" #_P2, sig2);                   \
+               cell->setPort("\\" #_P3, sig3);                   \
+               cell->setPort("\\" #_P4, sig4);                   \
+               cell->setPort("\\" #_P5, sig5);                   \
+               return cell;                                      \
        } \
-       RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigSpec sig1, RTLIL::SigSpec sig2, RTLIL::SigSpec sig3) { \
-               RTLIL::SigSpec sig4 = addWire(NEW_ID);      \
-               add ## _func(name, sig1, sig2, sig3, sig4); \
-               return sig4;                                \
+       RTLIL::SigBit RTLIL::Module::_func(RTLIL::IdString name, RTLIL::SigBit sig1, RTLIL::SigBit sig2, RTLIL::SigBit sig3, RTLIL::SigBit sig4) { \
+               RTLIL::SigBit sig5 = addWire(NEW_ID);            \
+               add ## _func(name, sig1, sig2, sig3, sig4, sig5); \
+               return sig5;                                      \
        }
-DEF_METHOD_2(NotGate, "$_NOT_", A, Y)
-DEF_METHOD_3(AndGate, "$_AND_", A, B, Y)
-DEF_METHOD_3(OrGate,  "$_OR_",  A, B, Y)
-DEF_METHOD_3(XorGate, "$_XOR_", A, B, Y)
-DEF_METHOD_4(MuxGate, "$_MUX_", A, B, S, Y)
+DEF_METHOD_2(NotGate,  "$_NOT_",  A, Y)
+DEF_METHOD_3(AndGate,  "$_AND_",  A, B, Y)
+DEF_METHOD_3(NandGate, "$_NAND_", A, B, Y)
+DEF_METHOD_3(OrGate,   "$_OR_",   A, B, Y)
+DEF_METHOD_3(NorGate,  "$_NOR_",  A, B, Y)
+DEF_METHOD_3(XorGate,  "$_XOR_",  A, B, Y)
+DEF_METHOD_3(XnorGate, "$_XNOR_", A, B, Y)
+DEF_METHOD_4(MuxGate,  "$_MUX_",  A, B, S, Y)
+DEF_METHOD_4(Aoi3Gate, "$_AOI3_", A, B, C, Y)
+DEF_METHOD_4(Oai3Gate, "$_OAI3_", A, B, C, Y)
+DEF_METHOD_5(Aoi4Gate, "$_AOI4_", A, B, C, D, Y)
+DEF_METHOD_5(Oai4Gate, "$_OAI4_", A, B, C, D, Y)
 #undef DEF_METHOD_2
 #undef DEF_METHOD_3
 #undef DEF_METHOD_4
+#undef DEF_METHOD_5
 
 RTLIL::Cell* RTLIL::Module::addPow(RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y, bool a_signed, bool b_signed)
 {
index 7e052b091500f7947d5a99579579b579f55d599c..8b3306f6fac320d767bbbf7ee23ea03bdbe8e7e5 100644 (file)
@@ -697,11 +697,18 @@ public:
        RTLIL::Cell* addDlatchsr (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
                        RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true);
 
-       RTLIL::Cell* addNotGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_y);
-       RTLIL::Cell* addAndGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y);
-       RTLIL::Cell* addOrGate   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y);
-       RTLIL::Cell* addXorGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_y);
-       RTLIL::Cell* addMuxGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s, RTLIL::SigSpec sig_y);
+       RTLIL::Cell* addNotGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addAndGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addNandGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addOrGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addNorGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addXorGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addXnorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addMuxGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addAoi3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addOai3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addAoi4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y);
+       RTLIL::Cell* addOai4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d, RTLIL::SigBit sig_y);
 
        RTLIL::Cell* addDffGate    (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true);
        RTLIL::Cell* addDffsrGate  (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
@@ -760,11 +767,18 @@ public:
        RTLIL::SigSpec Mux      (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s);
        RTLIL::SigSpec Pmux     (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s);
 
-       RTLIL::SigSpec NotGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a);
-       RTLIL::SigSpec AndGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b);
-       RTLIL::SigSpec OrGate   (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b);
-       RTLIL::SigSpec XorGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b);
-       RTLIL::SigSpec MuxGate  (RTLIL::IdString name, RTLIL::SigSpec sig_a, RTLIL::SigSpec sig_b, RTLIL::SigSpec sig_s);
+       RTLIL::SigBit NotGate  (RTLIL::IdString name, RTLIL::SigBit sig_a);
+       RTLIL::SigBit AndGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b);
+       RTLIL::SigBit NandGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b);
+       RTLIL::SigBit OrGate   (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b);
+       RTLIL::SigBit NorGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b);
+       RTLIL::SigBit XorGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b);
+       RTLIL::SigBit XnorGate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b);
+       RTLIL::SigBit MuxGate  (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_s);
+       RTLIL::SigBit Aoi3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c);
+       RTLIL::SigBit Oai3Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c);
+       RTLIL::SigBit Aoi4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d);
+       RTLIL::SigBit Oai4Gate (RTLIL::IdString name, RTLIL::SigBit sig_a, RTLIL::SigBit sig_b, RTLIL::SigBit sig_c, RTLIL::SigBit sig_d);
 };
 
 struct RTLIL::Wire