Added RTLIL::Module::add{Dff,Dffsr,Adff,Dlatch}Gate() API
authorClifford Wolf <clifford@clifford.at>
Sat, 15 Mar 2014 13:35:29 +0000 (14:35 +0100)
committerClifford Wolf <clifford@clifford.at>
Sat, 15 Mar 2014 13:35:29 +0000 (14:35 +0100)
kernel/rtlil.cc
kernel/rtlil.h

index ee73ebe44c6a7422adfe9df9bbc8b8c6c79d36cf..072910e30316af2252e10090268447274f37b7eb 100644 (file)
@@ -1109,7 +1109,7 @@ RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, RTLIL::SigSpec sig_clk
        return cell;
 }
 
-RTLIL::Cell* RTLIL::Module::addDlatch (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity)
+RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity)
 {
        RTLIL::Cell *cell = new RTLIL::Cell;
        cell->name = name;
@@ -1123,6 +1123,59 @@ RTLIL::Cell* RTLIL::Module::addDlatch (RTLIL::IdString name, RTLIL::SigSpec sig_
        return cell;
 }
 
+RTLIL::Cell* RTLIL::Module::addDffGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity)
+{
+       RTLIL::Cell *cell = new RTLIL::Cell;
+       cell->name = name;
+       cell->type = stringf("$_DFF_%c_", clk_polarity ? 'P' : 'N');
+       cell->connections["\\C"] = sig_clk;
+       cell->connections["\\D"] = sig_d;
+       cell->connections["\\Q"] = sig_q;
+       add(cell);
+       return cell;
+}
+
+RTLIL::Cell* RTLIL::Module::addDffsrGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_set, RTLIL::SigSpec sig_clr,
+               RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity, bool set_polarity, bool clr_polarity)
+{
+       RTLIL::Cell *cell = new RTLIL::Cell;
+       cell->name = name;
+       cell->type = stringf("$_DFFSR_%c%c%c_", clk_polarity ? 'P' : 'N', set_polarity ? 'P' : 'N', clr_polarity ? 'P' : 'N');
+       cell->connections["\\C"] = sig_clk;
+       cell->connections["\\S"] = sig_set;
+       cell->connections["\\R"] = sig_clr;
+       cell->connections["\\D"] = sig_d;
+       cell->connections["\\Q"] = sig_q;
+       add(cell);
+       return cell;
+}
+
+RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q,
+               bool arst_value, bool clk_polarity, bool arst_polarity)
+{
+       RTLIL::Cell *cell = new RTLIL::Cell;
+       cell->name = name;
+       cell->type = stringf("$_DFF_%c%c%c_", clk_polarity ? 'P' : 'N', arst_polarity ? 'P' : 'N', arst_value ? '1' : '0');
+       cell->connections["\\C"] = sig_clk;
+       cell->connections["\\R"] = sig_arst;
+       cell->connections["\\D"] = sig_d;
+       cell->connections["\\Q"] = sig_q;
+       add(cell);
+       return cell;
+}
+
+RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity)
+{
+       RTLIL::Cell *cell = new RTLIL::Cell;
+       cell->name = name;
+       cell->type = stringf("$_DLATCH_%c_", en_polarity ? 'P' : 'N');
+       cell->connections["\\E"] = sig_en;
+       cell->connections["\\D"] = sig_d;
+       cell->connections["\\Q"] = sig_q;
+       add(cell);
+       return cell;
+}
+
 RTLIL::Wire::Wire()
 {
        width = 1;
index e55a88eba5172cfd55161dbdb2f68c085a4476b4..44142bf2968b3e8ac5421a2510bd13e480241fbf 100644 (file)
@@ -357,6 +357,13 @@ struct RTLIL::Module {
        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* 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,
+                       RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true);
+       RTLIL::Cell* addAdffGate   (RTLIL::IdString name, RTLIL::SigSpec sig_clk, RTLIL::SigSpec sig_arst, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q,
+                       bool arst_value = false, bool clk_polarity = true, bool arst_polarity = true);
+       RTLIL::Cell* addDlatchGate (RTLIL::IdString name, RTLIL::SigSpec sig_en, RTLIL::SigSpec sig_d, RTLIL::SigSpec sig_q, bool en_polarity = true);
 };
 
 struct RTLIL::Wire {