Added GP_DFFS, GP_DFFR, and GP_DFFSR
authorClifford Wolf <clifford@clifford.at>
Wed, 23 Mar 2016 07:46:10 +0000 (08:46 +0100)
committerClifford Wolf <clifford@clifford.at>
Wed, 23 Mar 2016 07:46:10 +0000 (08:46 +0100)
techlibs/greenpak4/cells_map.v
techlibs/greenpak4/cells_sim.v
techlibs/greenpak4/gp_dff.lib
techlibs/greenpak4/synth_greenpak4.cc

index 667d853daae3067dcbcbe49d42e38ad87ab35199..e24d249730f9ae7f53df6bff46128bd5d5c9c5a6 100644 (file)
@@ -1,20 +1,26 @@
-module  \$_DFF_P_ (input D, C, output Q);
-       GP_DFF _TECHMAP_REPLACE_ (
+module GP_DFFS(input D, CLK, nSET, output reg Q);
+       parameter [0:0] INIT = 1'bx;
+       GP_DFFSR #(
+               .INIT(INIT),
+               .SRMODE(1'b1),
+       ) _TECHMAP_REPLACE_ (
                .D(D),
-               .Q(Q),
                .CLK(C),
-               .nRSTZ(1'b1),
-               .nSETZ(1'b1)
+               .nSR(nSET),
+               .Q(Q)
        );
 endmodule
 
-module  \$_DFFSR_PNN_ (input C, S, R, D, output Q);
-       GP_DFF _TECHMAP_REPLACE_ (
+module GP_DFFR(input D, CLK, nRST, output reg Q);
+       parameter [0:0] INIT = 1'bx;
+       GP_DFFSR #(
+               .INIT(INIT),
+               .SRMODE(1'b0),
+       ) _TECHMAP_REPLACE_ (
                .D(D),
-               .Q(Q),
                .CLK(C),
-               .nRSTZ(R),
-               .nSETZ(S)
+               .nSR(nRST),
+               .Q(Q)
        );
 endmodule
 
index f8593b9fb60cb83ae188175794686d2fd6893967..4602c6cc4750b97994b43657096cdf4451c82c9d 100644 (file)
@@ -1,16 +1,45 @@
-module GP_DFF(input D, CLK, nRSTZ, nSETZ, output reg Q);
+module GP_DFF(input D, CLK, output reg Q);
        parameter [0:0] INIT = 1'bx;
        initial Q = INIT;
-       always @(posedge CLK, negedge nRSTZ, negedge nSETZ) begin
-               if (!nRSTZ)
-                       Q <= 1'b0;
-               else if (!nSETZ)
+       always @(posedge CLK) begin
+               Q <= D;
+       end
+endmodule
+
+module GP_DFFS(input D, CLK, nSET, output reg Q);
+       parameter [0:0] INIT = 1'bx;
+       initial Q = INIT;
+       always @(posedge CLK, negedge nSET) begin
+               if (!nSET)
                        Q <= 1'b1;
                else
                        Q <= D;
        end
 endmodule
 
+module GP_DFFR(input D, CLK, nRST, output reg Q);
+       parameter [0:0] INIT = 1'bx;
+       initial Q = INIT;
+       always @(posedge CLK, negedge nRST) begin
+               if (!nRST)
+                       Q <= 1'b0;
+               else
+                       Q <= D;
+       end
+endmodule
+
+module GP_DFFSR(input D, CLK, nSR, output reg Q);
+       parameter [0:0] INIT = 1'bx;
+       parameter [0:0] SRMODE = 1'bx;
+       initial Q = INIT;
+       always @(posedge CLK, negedge nSR) begin
+               if (!nSR)
+                       Q <= SRMODE;
+               else
+                       Q <= D;
+       end
+endmodule
+
 module GP_2LUT(input IN0, IN1, output OUT);
        parameter [3:0] INIT = 0;
        assign OUT = INIT[{IN1, IN0}];
@@ -25,3 +54,11 @@ module GP_4LUT(input IN0, IN1, IN2, IN3, output OUT);
        parameter [15:0] INIT = 0;
        assign OUT = INIT[{IN3, IN2, IN1, IN0}];
 endmodule
+
+module GP4_VDD(output OUT);
+       assign OUT = 1;
+endmodule
+
+module GP4_VSS(output OUT);
+       assign OUT = 0;
+endmodule
index 9e2e46cb4a62d6df68810a18ecb02eaf6a2157fd..bc41d18effdec84656fd177aabdfe61245736bfa 100644 (file)
@@ -1,5 +1,5 @@
 library(gp_dff) {
-  cell(GP_DFF_NOSR) {
+  cell(GP_DFF) {
     area: 1;
     ff("IQ", "IQN") { clocked_on: CLK;
                   next_state: D; }
@@ -9,18 +9,28 @@ library(gp_dff) {
     pin(Q) { direction: output;
               function: "IQ"; }
   }
-  cell(GP_DFF_SR) {
+  cell(GP_DFFS) {
     area: 1;
     ff("IQ", "IQN") { clocked_on: CLK;
                   next_state: D;
-                      preset: "nSETZ'";
-                       clear: "nRSTZ'"; }
+                      preset: "nSET'"; }
     pin(CLK) { direction: input;
                  clock: true; }
     pin(D) { direction: input; }
     pin(Q) { direction: output;
               function: "IQ"; }
-    pin(nRSTZ) { direction: input; }
-    pin(nSETZ) { direction: input; }
+    pin(nSET) { direction: input; }
+  }
+  cell(GP_DFFR) {
+    area: 1;
+    ff("IQ", "IQN") { clocked_on: CLK;
+                  next_state: D;
+                       clear: "nRST'"; }
+    pin(CLK) { direction: input;
+                 clock: true; }
+    pin(D) { direction: input; }
+    pin(Q) { direction: output;
+              function: "IQ"; }
+    pin(nRST) { direction: input; }
   }
 }
index 7d43cf579da3d840acd565e0d7bba278e2b14c00..04166d8be737ddf0a8f81fd1a3c04eb38a6aaf55 100644 (file)
@@ -97,6 +97,7 @@ struct SynthGreenPAK4Pass : public Pass {
                log("        clean\n");
                log("\n");
                log("    map_cells:\n");
+               log("        dfflibmap -liberty +/greenpak4/gp_dff.lib\n");
                log("        techmap -map +/greenpak4/cells_map.v\n");
                log("        dffinit -ff GP_DFF Q INIT\n");
                log("        clean\n");
@@ -205,6 +206,7 @@ struct SynthGreenPAK4Pass : public Pass {
 
                if (check_label(active, run_from, run_to, "map_cells"))
                {
+                       Pass::call(design, "dfflibmap -liberty +/greenpak4/gp_dff.lib");
                        Pass::call(design, "techmap -map +/greenpak4/cells_map.v");
                        Pass::call(design, "dffinit -ff GP_DFF Q INIT");
                        Pass::call(design, "clean");