aboutsummaryrefslogtreecommitdiffstats
path: root/techlibs/intel_alm/common
diff options
context:
space:
mode:
authorDan Ravensloft <dan.ravensloft@gmail.com>2020-05-23 12:52:13 +0100
committerMarcelina Koƛcielnicka <mwk@0x04.net>2020-07-04 19:45:10 +0200
commit83cde2d02ba06bbd4014858983ac324bf44cb6c6 (patch)
treeb999b0fc1a813b7683d85ba63b0cfd129e1d18b2 /techlibs/intel_alm/common
parenta9b61080a409d3ad2c8ff4a9bbef9ba1c9c1d194 (diff)
downloadyosys-83cde2d02ba06bbd4014858983ac324bf44cb6c6.tar.gz
yosys-83cde2d02ba06bbd4014858983ac324bf44cb6c6.tar.bz2
yosys-83cde2d02ba06bbd4014858983ac324bf44cb6c6.zip
intel_alm: ABC9 sequential optimisations
Diffstat (limited to 'techlibs/intel_alm/common')
-rw-r--r--techlibs/intel_alm/common/abc9_map.v18
-rw-r--r--techlibs/intel_alm/common/abc9_model.v55
-rw-r--r--techlibs/intel_alm/common/abc9_unmap.v11
-rw-r--r--techlibs/intel_alm/common/dff_sim.v42
-rw-r--r--techlibs/intel_alm/common/mem_sim.v10
5 files changed, 126 insertions, 10 deletions
diff --git a/techlibs/intel_alm/common/abc9_map.v b/techlibs/intel_alm/common/abc9_map.v
new file mode 100644
index 000000000..32ad79bdc
--- /dev/null
+++ b/techlibs/intel_alm/common/abc9_map.v
@@ -0,0 +1,18 @@
+// This file exists to map purely-synchronous flops to ABC9 flops, while
+// mapping flops with asynchronous-clear as boxes, this is because ABC9
+// doesn't support asynchronous-clear flops in sequential synthesis.
+
+module MISTRAL_FF(
+ input DATAIN, CLK, ACLR, ENA, SCLR, SLOAD, SDATA,
+ output reg Q
+);
+
+parameter _TECHMAP_CONSTMSK_ACLR_ = 1'b0;
+
+// If the async-clear is constant, we assume it's disabled.
+if (_TECHMAP_CONSTMSK_ACLR_ != 1'b0)
+ MISTRAL_FF_SYNCONLY _TECHMAP_REPLACE_ (.DATAIN(DATAIN), .CLK(CLK), .ENA(ENA), .SCLR(SCLR), .SLOAD(SLOAD), .SDATA(SDATA), .Q(Q));
+else
+ wire _TECHMAP_FAIL_ = 1;
+
+endmodule
diff --git a/techlibs/intel_alm/common/abc9_model.v b/techlibs/intel_alm/common/abc9_model.v
new file mode 100644
index 000000000..dd46147a5
--- /dev/null
+++ b/techlibs/intel_alm/common/abc9_model.v
@@ -0,0 +1,55 @@
+`ifdef cyclonev
+`define SYNCPATH 262
+`define SYNCSETUP 522
+`define COMBPATH 0
+`endif
+`ifdef cyclone10gx
+`define SYNCPATH 219
+`define SYNCSETUP 268
+`define COMBPATH 0
+`endif
+
+// fallback for when a family isn't detected (e.g. when techmapping for equivalence)
+`ifndef SYNCPATH
+`define SYNCPATH 0
+`define SYNCSETUP 0
+`define COMBPATH 0
+`endif
+
+// This is a purely-synchronous flop, that ABC9 can use for sequential synthesis.
+(* abc9_flop, lib_whitebox *)
+module MISTRAL_FF_SYNCONLY(
+ input DATAIN, CLK, ENA, SCLR, SLOAD, SDATA,
+ output reg Q
+);
+
+specify
+ if (ENA) (posedge CLK => (Q : DATAIN)) = `SYNCPATH;
+ if (ENA) (posedge CLK => (Q : SCLR)) = `SYNCPATH;
+ if (ENA) (posedge CLK => (Q : SLOAD)) = `SYNCPATH;
+ if (ENA) (posedge CLK => (Q : SDATA)) = `SYNCPATH;
+
+ $setup(DATAIN, posedge CLK, `SYNCSETUP);
+ $setup(ENA, posedge CLK, `SYNCSETUP);
+ $setup(SCLR, posedge CLK, `SYNCSETUP);
+ $setup(SLOAD, posedge CLK, `SYNCSETUP);
+ $setup(SDATA, posedge CLK, `SYNCSETUP);
+endspecify
+
+initial begin
+ // Altera flops initialise to zero.
+ Q = 0;
+end
+
+always @(posedge CLK) begin
+ // Clock-enable
+ if (ENA) begin
+ // Synchronous clear
+ if (SCLR) Q <= 0;
+ // Synchronous load
+ else if (SLOAD) Q <= SDATA;
+ else Q <= DATAIN;
+ end
+end
+
+endmodule
diff --git a/techlibs/intel_alm/common/abc9_unmap.v b/techlibs/intel_alm/common/abc9_unmap.v
new file mode 100644
index 000000000..0eda69560
--- /dev/null
+++ b/techlibs/intel_alm/common/abc9_unmap.v
@@ -0,0 +1,11 @@
+// After performing sequential synthesis, map the synchronous flops back to
+// standard MISTRAL_FF flops.
+
+module MISTRAL_FF_SYNCONLY(
+ input DATAIN, CLK, ENA, SCLR, SLOAD, SDATA,
+ output reg Q
+);
+
+MISTRAL_FF _TECHMAP_REPLACE_ (.DATAIN(DATAIN), .CLK(CLK), .ACLR(1'b1), .ENA(ENA), .SCLR(SCLR), .SLOAD(SLOAD), .SDATA(SDATA), .Q(Q));
+
+endmodule
diff --git a/techlibs/intel_alm/common/dff_sim.v b/techlibs/intel_alm/common/dff_sim.v
index 32444dd46..94aa37fb5 100644
--- a/techlibs/intel_alm/common/dff_sim.v
+++ b/techlibs/intel_alm/common/dff_sim.v
@@ -53,23 +53,45 @@
// Q: data output
//
// Note: the DFFEAS primitive is mostly emulated; it does not reflect what the hardware implements.
+
+`ifdef cyclonev
+`define SYNCPATH 262
+`define SYNCSETUP 522
+`define COMBPATH 0
+`endif
+`ifdef cyclone10gx
+`define SYNCPATH 219
+`define SYNCSETUP 268
+`define COMBPATH 0
+`endif
+
+// fallback for when a family isn't detected (e.g. when techmapping for equivalence)
+`ifndef SYNCPATH
+`define SYNCPATH 0
+`define SYNCSETUP 0
+`define COMBPATH 0
+`endif
+
+(* abc9_box, lib_whitebox *)
module MISTRAL_FF(
input DATAIN, CLK, ACLR, ENA, SCLR, SLOAD, SDATA,
output reg Q
);
-`ifdef cyclonev
-specify
- (posedge CLK => (Q : DATAIN)) = 262;
- $setup(DATAIN, posedge CLK, 522);
-endspecify
-`endif
-`ifdef cyclone10gx
specify
- (posedge CLK => (Q : DATAIN)) = 219;
- $setup(DATAIN, posedge CLK, 268);
+ if (ENA) (posedge CLK => (Q : DATAIN)) = `SYNCPATH;
+ if (ENA) (posedge CLK => (Q : SCLR)) = `SYNCPATH;
+ if (ENA) (posedge CLK => (Q : SLOAD)) = `SYNCPATH;
+ if (ENA) (posedge CLK => (Q : SDATA)) = `SYNCPATH;
+
+ $setup(DATAIN, posedge CLK, `SYNCSETUP);
+ $setup(ENA, posedge CLK, `SYNCSETUP);
+ $setup(SCLR, posedge CLK, `SYNCSETUP);
+ $setup(SLOAD, posedge CLK, `SYNCSETUP);
+ $setup(SDATA, posedge CLK, `SYNCSETUP);
+
+ (ACLR => Q) = `COMBPATH;
endspecify
-`endif
initial begin
// Altera flops initialise to zero.
diff --git a/techlibs/intel_alm/common/mem_sim.v b/techlibs/intel_alm/common/mem_sim.v
index ae79b19a4..f6f9ecb02 100644
--- a/techlibs/intel_alm/common/mem_sim.v
+++ b/techlibs/intel_alm/common/mem_sim.v
@@ -48,10 +48,20 @@
// the following model because it's very difficult to trigger this in practice
// as clock cycles will be much longer than any potential blip of 'x, so the
// model can be treated as always returning a defined result.
+
+(* abc9_box, lib_whitebox *)
module MISTRAL_MLAB(input [4:0] A1ADDR, input A1DATA, A1EN, CLK1, input [4:0] B1ADDR, output B1DATA);
reg [31:0] mem = 32'b0;
+// TODO
+specify
+ $setup(A1ADDR, posedge CLK1, 0);
+ $setup(A1DATA, posedge CLK1, 0);
+
+ (B1ADDR *> B1DATA) = 0;
+endspecify
+
always @(posedge CLK1)
if (A1EN) mem[A1ADDR] <= A1DATA;