Added $_SR_[PN][PN]_, $_DFFSR_[PN][PN][PN]_, $_DLATCH_[PN]_
authorClifford Wolf <clifford@clifford.at>
Fri, 18 Oct 2013 10:13:34 +0000 (12:13 +0200)
committerClifford Wolf <clifford@clifford.at>
Fri, 18 Oct 2013 10:13:34 +0000 (12:13 +0200)
backends/verilog/verilog_backend.cc
kernel/celltypes.h
techlibs/common/stdcells_sim.v

index e0794ad6c47803a68d92e10d92c4b58430aa0af8..d64deb640f9325121c9ae6555c7089af6fa0f673 100644 (file)
@@ -573,6 +573,7 @@ bool dump_cell_expr(FILE *f, std::string indent, RTLIL::Cell *cell)
                return true;
        }
 
+       // FIXME: $_SR_[PN][PN]_, $_DFFSR_[PN][PN][PN]_, $_DLATCH_[PN]_
        // FIXME: $sr, $dffsr, $dlatch, $memrd, $memwr, $mem, $fsm
 
        return false;
index 883ef9ee05961c23fe0bf9ffc8600df451f732f5..e59f74d6615512774224cfa8cfabee92de867a72 100644 (file)
@@ -119,6 +119,10 @@ struct CellTypes
 
        void setup_stdcells_mem()
        {
+               cell_types.insert("$_SR_NN_");
+               cell_types.insert("$_SR_NP_");
+               cell_types.insert("$_SR_PN_");
+               cell_types.insert("$_SR_PP_");
                cell_types.insert("$_DFF_N_");
                cell_types.insert("$_DFF_P_");
                cell_types.insert("$_DFF_NN0_");
@@ -129,6 +133,16 @@ struct CellTypes
                cell_types.insert("$_DFF_PN1_");
                cell_types.insert("$_DFF_PP0_");
                cell_types.insert("$_DFF_PP1_");
+               cell_types.insert("$_DFFSR_NNN_");
+               cell_types.insert("$_DFFSR_NNP_");
+               cell_types.insert("$_DFFSR_NPN_");
+               cell_types.insert("$_DFFSR_NPP_");
+               cell_types.insert("$_DFFSR_PNN_");
+               cell_types.insert("$_DFFSR_PNP_");
+               cell_types.insert("$_DFFSR_PPN_");
+               cell_types.insert("$_DFFSR_PPP_");
+               cell_types.insert("$_DLATCH_N_");
+               cell_types.insert("$_DLATCH_P_");
        }
 
        void clear()
index 6e5d2719ad2d5d4ca9fafea034b71b8a1bae6928..88284a092398c300b41f3ceaf77ae8d82afb6acd 100644 (file)
@@ -60,6 +60,50 @@ always @* begin
 end
 endmodule
 
+module  \$_SR_NN_ (S, R, Q);
+input S, R;
+output reg Q;
+always @(negedge S, negedge R) begin
+       if (R == 0)
+               Q <= 0;
+       else if (S == 0)
+               Q <= 1;
+end
+endmodule
+
+module  \$_SR_NP_ (S, R, Q);
+input S, R;
+output reg Q;
+always @(negedge S, posedge R) begin
+       if (R == 1)
+               Q <= 0;
+       else if (S == 0)
+               Q <= 1;
+end
+endmodule
+
+module  \$_SR_PN_ (S, R, Q);
+input S, R;
+output reg Q;
+always @(posedge S, negedge R) begin
+       if (R == 0)
+               Q <= 0;
+       else if (S == 1)
+               Q <= 1;
+end
+endmodule
+
+module  \$_SR_PP_ (S, R, Q);
+input S, R;
+output reg Q;
+always @(posedge S, posedge R) begin
+       if (R == 1)
+               Q <= 0;
+       else if (S == 1)
+               Q <= 1;
+end
+endmodule
+
 module  \$_DFF_N_ (D, Q, C);
 input D, C;
 output reg Q;
@@ -164,3 +208,125 @@ always @(posedge C or posedge R) begin
 end
 endmodule
 
+module  \$_DFFSR_NNN_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(negedge C, negedge S, negedge R) begin
+       if (R == 0)
+               Q <= 0;
+       else if (S == 0)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_NNP_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(negedge C, negedge S, posedge R) begin
+       if (R == 1)
+               Q <= 0;
+       else if (S == 0)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_NPN_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(negedge C, posedge S, negedge R) begin
+       if (R == 0)
+               Q <= 0;
+       else if (S == 1)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_NPP_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(negedge C, posedge S, posedge R) begin
+       if (R == 1)
+               Q <= 0;
+       else if (S == 1)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_PNN_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(posedge C, negedge S, negedge R) begin
+       if (R == 0)
+               Q <= 0;
+       else if (S == 0)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_PNP_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(posedge C, negedge S, posedge R) begin
+       if (R == 1)
+               Q <= 0;
+       else if (S == 0)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_PPN_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(posedge C, posedge S, negedge R) begin
+       if (R == 0)
+               Q <= 0;
+       else if (S == 1)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DFFSR_PPP_ (C, S, R, D, Q);
+input C, S, R, D;
+output reg Q;
+always @(posedge C, posedge S, posedge R) begin
+       if (R == 1)
+               Q <= 0;
+       else if (S == 1)
+               Q <= 1;
+       else
+               Q <= D;
+end
+endmodule
+
+module  \$_DLATCH_N_ (E, D, Q);
+input E, D;
+output reg Q;
+always @* begin
+       if (E == 0)
+               Q <= D;
+end
+endmodule
+
+module  \$_DLATCH_P_ (E, D, Q);
+input E, D;
+output reg Q;
+always @* begin
+       if (E == 1)
+               Q <= D;
+end
+endmodule
+