openlane support for latch mapping in synthesis
diff --git a/sky130/openlane/config.tcl b/sky130/openlane/config.tcl
index cffa0e3..5c37eaa 100755
--- a/sky130/openlane/config.tcl
+++ b/sky130/openlane/config.tcl
@@ -40,6 +40,9 @@
# Tracks info
set ::env(TRACKS_INFO_FILE) "$::env(PDK_ROOT)/$::env(PDK)/libs.tech/openlane/$::env(STD_CELL_LIBRARY)/tracks.info"
+# Latch mapping
+set ::env(SYNTH_LATCH_MAP) "$::env(PDK_ROOT)/$::env(PDK)/libs.tech/openlane/$::env(STD_CELL_LIBRARY)/latch_map.v"
+
set ::env(GLB_RT_L1_ADJUSTMENT) 0.99
# Extra PDN configs
diff --git a/sky130/openlane/sky130_fd_sc_hd/latch_map.v b/sky130/openlane/sky130_fd_sc_hd/latch_map.v
new file mode 100644
index 0000000..204ce88
--- /dev/null
+++ b/sky130/openlane/sky130_fd_sc_hd/latch_map.v
@@ -0,0 +1,21 @@
+module \$_DLATCH_P_ (input E, input D, output Q);
+ sky130_fd_sc_hd__dlxtp_1 _TECHMAP_DLATCH_P (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE(E)
+ );
+endmodule
+
+module \$_DLATCH_N_ (input E, input D, output Q);
+ sky130_fd_sc_hd__dlxtn_1 _TECHMAP_DLATCH_N (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE_N(E)
+ );
+endmodule
diff --git a/sky130/openlane/sky130_fd_sc_hdll/latch_map.v b/sky130/openlane/sky130_fd_sc_hdll/latch_map.v
new file mode 100644
index 0000000..4a27aa7
--- /dev/null
+++ b/sky130/openlane/sky130_fd_sc_hdll/latch_map.v
@@ -0,0 +1,21 @@
+module \$_DLATCH_P_ (input E, input D, output Q);
+ sky130_fd_sc_hdll__dlxtp_1 _TECHMAP_DLATCH_P (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE(E)
+ );
+endmodule
+
+module \$_DLATCH_N_ (input E, input D, output Q);
+ sky130_fd_sc_hdll__dlxtn_1 _TECHMAP_DLATCH_N (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE_N(E)
+ );
+endmodule
diff --git a/sky130/openlane/sky130_fd_sc_hs/latch_map.v b/sky130/openlane/sky130_fd_sc_hs/latch_map.v
new file mode 100644
index 0000000..9dd8167
--- /dev/null
+++ b/sky130/openlane/sky130_fd_sc_hs/latch_map.v
@@ -0,0 +1,21 @@
+module \$_DLATCH_P_ (input E, input D, output Q);
+ sky130_fd_sc_hs__dlxtp_1 _TECHMAP_DLATCH_P (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE(E)
+ );
+endmodule
+
+module \$_DLATCH_N_ (input E, input D, output Q);
+ sky130_fd_sc_hs__dlxtn_1 _TECHMAP_DLATCH_N (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE_N(E)
+ );
+endmodule
diff --git a/sky130/openlane/sky130_fd_sc_hvl/latch_map.v b/sky130/openlane/sky130_fd_sc_hvl/latch_map.v
new file mode 100644
index 0000000..7cd80d4
--- /dev/null
+++ b/sky130/openlane/sky130_fd_sc_hvl/latch_map.v
@@ -0,0 +1,10 @@
+module \$_DLATCH_P_ (input E, input D, output Q);
+ sky130_fd_sc_hvl__dlxtp_1 _TECHMAP_DLATCH_P (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE(E)
+ );
+endmodule
diff --git a/sky130/openlane/sky130_fd_sc_ls/latch_map.v b/sky130/openlane/sky130_fd_sc_ls/latch_map.v
new file mode 100644
index 0000000..319ff5a
--- /dev/null
+++ b/sky130/openlane/sky130_fd_sc_ls/latch_map.v
@@ -0,0 +1,21 @@
+module \$_DLATCH_P_ (input E, input D, output Q);
+ sky130_fd_sc_ls__dlxtp_1 _TECHMAP_DLATCH_P (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE(E)
+ );
+endmodule
+
+module \$_DLATCH_N_ (input E, input D, output Q);
+ sky130_fd_sc_ls__dlxtn_1 _TECHMAP_DLATCH_N (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE_N(E)
+ );
+endmodule
diff --git a/sky130/openlane/sky130_fd_sc_ms/latch_map.v b/sky130/openlane/sky130_fd_sc_ms/latch_map.v
new file mode 100644
index 0000000..3bb5946
--- /dev/null
+++ b/sky130/openlane/sky130_fd_sc_ms/latch_map.v
@@ -0,0 +1,21 @@
+module \$_DLATCH_P_ (input E, input D, output Q);
+ sky130_fd_sc_ms__dlxtp_1 _TECHMAP_DLATCH_P (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE(E)
+ );
+endmodule
+
+module \$_DLATCH_N_ (input E, input D, output Q);
+ sky130_fd_sc_ms__dlxtn_1 _TECHMAP_DLATCH_N (
+ //# {{data|Data Signals}}
+ .D(D),
+ .Q(Q),
+
+ //# {{clocks|Clocking}}
+ .GATE_N(E)
+ );
+endmodule