








set_driving_cell? Does it automatically determine slew rates and delays, or do I still need to specify those manually?
set_driving_cell -lib_cell gf180mcu_fd_io__bi_24t inside my macro SDC files anyways:

set_driving_cell even does. Right now my approach has been to determine values to set on set_input_delay , set_clock_latency, set_input_transition and set_clock_transition by manually interpreting the values in the liberty files for the IO pads.

Stage 37 - Resizer Timing Optimizations (Post-Clock Tree Synthesis) on this CPU macro and on Iteration 0 its starting with a TNS of -5042 compared to main librelane, where I got -250.







set_driving_cell even does. Right now my approach has been to determine values to set on set_input_delay , set_clock_latency, set_input_transition and set_clock_transition by manually interpreting the values in the liberty files for the IO pads. set_driving_cell automates exactly that. It takes the values directly from the LIB.



set_driving_cell automates exactly that. It takes the values directly from the LIB. 

gf180mcu_fd_ip_sram__sram512x8m8wm1 SRAM:
add_pdn_stripe -grid macro -layer Metal4 -width 2.36 -offset 1.18 -spacing 0.28 -pitch 426.86 -starts_with GROUND -number_of_straps 2
It adds a power/ground pair on each side of the SRAM macro, directly above the pins. Since this uses the local coordinate system of the macro, you can move the macro around as you wish, the PDN straps will follow. As the PDN straps go all the way across the macro, connecting them to the PDN above is very easy.add_pdn_stripe -grid sram_macros_WE -layer Metal4 -width 2.36 -offset 1.18 -spacing 0.28 -pitch 479.88 -starts_with GROUND -number_of_straps 2
Unfortunately, the connection to VSS is not as good on the right side. It is better to use the first orientation.
Don't forget the PDN connect:
add_pdn_connect \
-grid macro \
-layers "$::env(PDN_VERTICAL_LAYER) Metal3"



...
"DM4.8": 0,
"DF.12": 3,
"NW.2b_MV": 16,
"DPF.4": 38,
"DCF.4": 48,
"total": 105
}
Is this expected? Or does it indicate something I should debug with my environment first?
sram512x8m8wm1 are instantiated in chip_core and placed inside the chip in two different orientations (north and east).
If you add more SRAMs, make sure to update the LibreLane config (librelane/config.yaml) and the PDN configuration (librelane/pdn_cfg.tcl).
In addition, an issue has been fixed with filler generation, the way how the KLayout DRC deck was invoked (connectivity rules), and an error in the seal ring generator. With these changes the template is now DRC clean for both the magic and KLayout DRC deck.
Furthermore, the design is LVS clean and the there are no setup and hold violations for this example.
Please update your projects to the latest template, and don't forget to update the PDK as well (make clone-pdk).
Let me know if you have any questions.
5



















ulimit -n 1024ulimit to flake.nix as shell hook, but failing so far even with ChatGPT "help" 




ulimit -n 1024 shellHook that could be used for that. However, I'm not sure how to override this from the template.

PL_RESIZER_HOLD_SLACK_MARGIN.
GRT_RESIZER_HOLD_SLACK_MARGIN: 0.1
PL_RESIZER_HOLD_SLACK_MARGIN: 0.1
PL_RESIZER_HOLD_MAX_BUFFER_PCT: 100
by default now since I had hold violations screw me over before.
locking disable may allow you to load large designs without changing the ulimit. http://opencircuitdesign.com/magic/commandref/locking.html (edited)
* Antenna
Failed 𐄂
Pin violations: 17
Net violations: 11
Check the report directory of OpenROAD.CheckAntennas.
checking the CI run here I do see the same violations: https://github.com/wafer-space/gf180mcu-project-template/actions/runs/19297076321/job/55181634117set_driving_cell from SDC file · wafer-space/gf180mcu-project-template@9b6c284


INSERT_ECO_DIODES in https://librelane.readthedocs.io/en/latest/reference/step_config_vars.html
chip_core.sv in the example project, why does it have keep attributes on the SRAM? Are they just left in from initial hacking or are they required?
logic [7:0] sram_0_out;
(* keep *)
gf180mcu_fd_ip_sram__sram512x8m8wm1 sram_0 (
`ifdef USE_POWER_PINS
.VDD (VDD),
.VSS (VSS),
`endif
.CLK (clk),
.CEN (1'b1),
.GWEN (1'b0),
.WEN (8'b0),
.A ('0),
.D ('0),
.Q (sram_0_out)
);

chip_core.sv in the example project, why does it have keep attributes on the SRAM? Are they just left in from initial hacking or are they required?
logic [7:0] sram_0_out;
(* keep *)
gf180mcu_fd_ip_sram__sram512x8m8wm1 sram_0 (
`ifdef USE_POWER_PINS
.VDD (VDD),
.VSS (VSS),
`endif
.CLK (clk),
.CEN (1'b1),
.GWEN (1'b0),
.WEN (8'b0),
.A ('0),
.D ('0),
.Q (sram_0_out)
); (* keep *) and since Yosys sees that the outputs of the macro are being used, it will keep it. I'll remove it the next time I push another change to the template :)
(* dont_touch keep *) etc to my cell wrappers?
SYNTH_WRITE_NOATTR to false and they should be passed on to OpenROAD.
However, there's RSZ_DONT_TOUCH_RX and RSZ_DONT_TOUCH_LIST if you want to keep a cell or net untouched.
I think if you just set the (* keep *) attribute on a stdcell, Yosys will instantiate the stdcell and OpenROAD is free to change it's buffer width.
(* keep *) on my cells is what I want; quite happy for the tools to change the drive as I don't fancy going and fixing all the transition violations myself 

SYNTH_WRITE_NOATTR to false and they should be passed on to OpenROAD.
However, there's RSZ_DONT_TOUCH_RX and RSZ_DONT_TOUCH_LIST if you want to keep a cell or net untouched.
I think if you just set the (* keep *) attribute on a stdcell, Yosys will instantiate the stdcell and OpenROAD is free to change it's buffer width. RSZ_DONT_TOUCH_* setting and resizes the cells nonetheless. You can work around it by setting PL_TIME_DRIVEN to 0.

RSZ_DONT_TOUCH_* setting and resizes the cells nonetheless. You can work around it by setting PL_TIME_DRIVEN to 0. dont_touch does not prevent placement. So we could actually keep the attribute throughout GPL. See here: https://github.com/librelane/librelane/issues/695

librelane-magicdrc makefile target crashes out during klayout/magic XOR, since klayout was skipped?Reading /home/luke/proj/riscboy-180/librelane/runs/RUN_2025-11-18_22-06-42/56-magic-streamout/chip_top.magic.gds ..
ERROR: In /nix/store/g3fml7j9yabcq2cmqm5yh19fxrm1h919-python3-3.12.10-env/lib/python3.12/site-packages/librelane/scripts/klayout/xor.drc: 'source': Stream has unknown format: /home/luke/proj/riscboy-180/librelane/runs/RUN_2025-11-18_22-06-42/56-magic-streamout/chip_top.magic.gds in Layout::read
Total elapsed: 0.010s Memory: 413.00M
ERROR: RuntimeError: 'source': Stream has unknown format: /home/luke/proj/riscboy-180/librelane/runs/RUN_2025-11-18_22-06-42/56-magic-streamout/chip_top.magic.gds in Layout::read in Executable::execute
/nix/store/g3fml7j9yabcq2cmqm5yh19fxrm1h919-python3-3.12.10-env/lib/python3.12/site-packages/librelane/scripts/klayout/xor.drc:78:in `execute'
:/built-in-macros/drc_interpreters.lym:31:in `instance_eval'
:/built-in-macros/drc_interpreters.lym:31:in `execute'
/home/luke/proj/riscboy-180/librelane/runs/RUN_2025-11-18_22-06-42/56-magic-streamout/chip_top.magic.gds
/home/luke/proj/riscboy-180/librelane/runs/RUN_2025-11-18_22-06-42/57-klayout-streamout/chip_top.klayout.gds
if it's a known issue with that target then I won't bother debugging chip_top.sdc?
# Clock
CLOCK_PORT: clk_PAD
CLOCK_NET: clk_pad/Y
CLOCK_PERIOD: 40 # 25 MHz
I saw the warning about multiple clocks in there but hoping I can just ignore that and write a normal .sdc file.

chip_top.sdc?
# Clock
CLOCK_PORT: clk_PAD
CLOCK_NET: clk_pad/Y
CLOCK_PERIOD: 40 # 25 MHz
I saw the warning about multiple clocks in there but hoping I can just ignore that and write a normal .sdc file. 

4gf180mcu-precheck repository. It:


qrcode Python module 

qrcode Python module pkgs.stdenv.isLinux



Connecting power net VDD to i_chip_core.u_core.tta_0.lsu_fu_0.sram_512x32_0.gf180mcu_fd_ip_sram__sram512x8m8wm1_0/VDD…
[INFO] Made 0 connections.
[06:50:13] ERROR The following error was encountered while running the flow: __main__.py:189
Odb.SetPowerConnections failed with the following errors:
add_global_connections failed to make any connections for 'i_chip_core.u_core.tta_0.lsu_fu_0.sram_512x32_0.gf180mcu_fd_ip_sram__sram512x8m8wm1_0/VDD' to VDD.
I've gone through and added the conditional stuff where needed
`ifdef USE_POWER_PINS
.VDD (VDD),
.VSS (VSS),
`endifDeleting now unused module tta::sram::sram_512x32. 

Connecting power net VDD to i_chip_core.u_core.tta_0.lsu_fu_0.sram_512x32_0.gf180mcu_fd_ip_sram__sram512x8m8wm1_0/VDD…
[INFO] Made 0 connections.
[06:50:13] ERROR The following error was encountered while running the flow: __main__.py:189
Odb.SetPowerConnections failed with the following errors:
add_global_connections failed to make any connections for 'i_chip_core.u_core.tta_0.lsu_fu_0.sram_512x32_0.gf180mcu_fd_ip_sram__sram512x8m8wm1_0/VDD' to VDD.
I've gone through and added the conditional stuff where needed
`ifdef USE_POWER_PINS
.VDD (VDD),
.VSS (VSS),
`endif librelane/runs/* directory.
Making the power connections in the RTL is one way, the other is to use PDN_MACRO_CONNECTIONS.
PDN_MACRO_CONNECTIONS looks much more convenient






config.yaml and connection to PDN in pdn_cfg.tcl.















pip install klayout) to render the layout and can therefore load both GDS and OAS. I disabled the filler layers to make the layout stand out better.python3 lay2img.py librelane/runs/<timestamp>/final/gds/chip_top.gds image --width 4069 --height 6144 in the root of your repository.






























render-image Make target renders the GDS layout.
4. #21: The CI has been updated.
DRT_ANTENNA_REPAIR_ITERS (disable if any issues occur).
7. The PDK version has been pinned.
Please update your repository in line with the template and clone the latest PDK.


render-image Make target renders the GDS layout.
4. #21: The CI has been updated.
DRT_ANTENNA_REPAIR_ITERS (disable if any issues occur).
7. The PDK version has been pinned.
Please update your repository in line with the template and clone the latest PDK. git describe version number work?

leo/gf180mcu as well.
Unfortunately, I still need to rebase from time to time, so any commit hashes that you reference might break.
leo/gf180mcu. Digging a bit I think the magic version is different.

render-image Make target renders the GDS layout.
4. #21: The CI has been updated.
DRT_ANTENNA_REPAIR_ITERS (disable if any issues occur).
7. The PDK version has been pinned.
Please update your repository in line with the template and clone the latest PDK. drc.klayout.lyrdb file) errors are in sealring (edited)

leo/gf180mcu. Digging a bit I think the magic version is different. leo/gf180mcu branch once the latest Yosys hang is fixed.

drc.klayout.lyrdb file) errors are in sealring (edited)



git describe version number work? x.y.z, like in the gf180mcu repository.
I'll update the tag.

x.y.z, like in the gf180mcu repository.
I'll update the tag. git-describe you get v0.0-<commits>-<hash> which some people map to v0.0.<commits>
git-describe is really neat 
















./25-openroad-globalplacementskipio/chip_top.pnl.v still has the reset synchroniser output going directly to all ~1k loads without buffering. This makes the following STAs meaningless because the reset net has like a 100 ns rise time
repairdesignpostgpl step
2. my issue with insane violations was actually because removing the clock variables from your .yaml and just defining clocks in your .sdc completely skips CTS, so I had like a 450 ns clock rise/fall, and all the flop timings are derated according to slew











Error while reading cell "tt_gf_wrapper" (byte position 137203656): Warning: cell "Metal1_fill_cell" placed on top of itself. Ignoring the extra one. during the pre-check, maybe something's wrong somewhere in fill generation ?

Error while reading cell "tt_gf_wrapper" (byte position 137203656): Warning: cell "Metal1_fill_cell" placed on top of itself. Ignoring the extra one. during the pre-check, maybe something's wrong somewhere in fill generation ? 





1


klayout -b -zz -r ${PDK_ROOT}/gf180mcuD/libs.tech/klayout/tech/drc/gf180mcu.drc -rd input=your.gds -rd report=drc.klayout.lyrdb -rd feol=True -rd beol=True -rd dummy=True -rd offgrid=True -rd conn_drc=True -rd wedge=True -rd run_mode=deep -rd thr=16






string MASKHINTS_V5_XTOR does not have an effect. Will actually have to draw this in KLayout.
magic isn't creating that layer at all, I see no support for writing it in the tech file ?

mv devices (which are the ones used in your design) are meant to be the 5V one and the hv would be the 6V ones.mvnfet / mvpfet and it's just whatever length you use that will dictate which one it is ... (edited)





mv to represent 5V/6V , but the V5_XTOR layer still need to be generated if length is too small to be 6V to comply with the DRC requirement ... I'm not sure if that's something doable in the magic tech file ?




ld if I read the tech file correctly.









-balance_levels switch (off by default, enabled by CTS_BALANCE_LEVELS: True), but it didn't seem to help with overall clock skew:
# Force use of chonky bois to reduce clock skew (default list is 2, 4, 8)
CTS_CLK_BUFFERS:
- "gf180mcu_fd_sc_mcu7t5v0__clkbuf_16" (edited)

-balance_levels switch (off by default, enabled by CTS_BALANCE_LEVELS: True), but it didn't seem to help with overall clock skew:
Total number of Clock Roots: 6.
I have four defined clocks with two gates on one of those clocks. If I rebuild with the ICG cells removed, I get
Total number of Clock Roots: 4.
Is Triton treating each gate as a new root? Normally ICGs are just buffers for CTS purposes, and you'd explicitly define a root if you wanted a root





Total number of Clock Roots: 6.
I have four defined clocks with two gates on one of those clocks. If I rebuild with the ICG cells removed, I get
Total number of Clock Roots: 4.
Is Triton treating each gate as a new root? Normally ICGs are just buffers for CTS purposes, and you'd explicitly define a root if you wanted a root 










make librelane



nix-shell setup? I wanted to look at adding a yosys extraction for mux + flop -> scan flop but librelane is quite hardcoded.



nix-shell setup? I wanted to look at adding a yosys extraction for mux + flop -> scan flop but librelane is quite hardcoded. nix-shell.
That's basically the same step as in: https://librelane.readthedocs.io/en/latest/installation/nix_installation/installation_linux.html#cloning-librelane
You can also apply patches in the in the Nix flake of the template, but it's a bit finicky.



nix-shell.
That's basically the same step as in: https://librelane.readthedocs.io/en/latest/installation/nix_installation/installation_linux.html#cloning-librelane
You can also apply patches in the in the Nix flake of the template, but it's a bit finicky. nix-shell in that branch of the librelane repo is a suitable environment for running the makefile in the project template? If so then got it, thanks

nix-shell in that branch of the librelane repo is a suitable environment for running the makefile in the project template? If so then got it, thanks 

54-openroad-stapostpnr/summary.rpt.
It contains a list of all corners and whether there are any setup violations for the target frequency. If there is a setup violation at a corner, it means that you will not be able to run the chip at the target frequency at that particular corner (PVT - Process, Voltage and Temperature). Using the setup worst slack, you can calculate the maximum frequency for each corner, which could even be above the target frequency.
54-openroad-stapostpnr\nom_tt_025C_3v30\clock.rpt (and actually for each corner) which tells you fmax for that corner. (edited)

[INFO DRT-0076] Complete 3000 pins.
Signal 6 received
Stack trace:
0# handler(int) in /nix/store/g74fz644z0828i5dksxm95mzdb91aq2g-openroad-2025-10-28/bin/.openroad-wrapped
1# _sigtramp in /usr/lib/system/libsystem_platform.dylib
2# pthread_kill in /usr/lib/system/libsystem_pthread.dylib
3# abort in /usr/lib/system/libsystem_c.dylib
4# malloc_vreport in /usr/lib/system/libsystem_malloc.dylib
5# malloc_report in /usr/lib/system/libsystem_malloc.dylib
6# ___BUG_IN_CLIENT_OF_LIBMALLOC_POINTER_BEING_FREED_WAS_NOT_ALLOCATED in /usr/lib/system/libsystem_malloc.dylib
Probably won't have time to file reproducibles til after tapeout but I've made note of my git hashes. I'll just back out the RTL changes for now. Wondering if there is any way to work around it without undoing RTL commits

[INFO DRT-0076] Complete 3000 pins.
Signal 6 received
Stack trace:
0# handler(int) in /nix/store/g74fz644z0828i5dksxm95mzdb91aq2g-openroad-2025-10-28/bin/.openroad-wrapped
1# _sigtramp in /usr/lib/system/libsystem_platform.dylib
2# pthread_kill in /usr/lib/system/libsystem_pthread.dylib
3# abort in /usr/lib/system/libsystem_c.dylib
4# malloc_vreport in /usr/lib/system/libsystem_malloc.dylib
5# malloc_report in /usr/lib/system/libsystem_malloc.dylib
6# ___BUG_IN_CLIENT_OF_LIBMALLOC_POINTER_BEING_FREED_WAS_NOT_ALLOCATED in /usr/lib/system/libsystem_malloc.dylib
Probably won't have time to file reproducibles til after tapeout but I've made note of my git hashes. I'll just back out the RTL changes for now. Wondering if there is any way to work around it without undoing RTL commits 










STD_CELL_LIBRARY: gf180mcu_fd_sc_mcu9t5v0. But there have been no changes to the 9t library.


STD_CELL_LIBRARY: gf180mcu_fd_sc_mcu9t5v0. But there have been no changes to the 9t library. cen_dly and cen_flag_dly; can be fixed by just using always_comb to get a time=0 evaluation




cen_dly and cen_flag_dly; can be fixed by just using always_comb to get a time=0 evaluation








SLOT variable. See the README for more information.wafer-space/gf180mcu-project-template: https://github.com/wafer-space/gf180mcu-project-template/actions/runs/19697592187pdn_cfg.tcl: better connectivity for the SRAM orientations. Please make sure to update your PDN config!



















chip_top_tb.py:
gl = os.getenv("GL", False)














CO.6a (i) Metal1 (< 0.34um) end-of-line overlap contact. Only other mention I found on this discord was https://discord.com/channels/1361349522684510449/1424739011846471740/1424745841952030860. Any ideas what could be causing that? I'm using 9-track cells if that helps











icgtp_1. I also have four PL.3a : Space on COMP/Field: 0.24µm which are just for the four orientations of the same cell. Inclined to waive given it's a foundry cell...

icgtp_1 cell:




_icgtp_2 (if it exists) have the same issues?









grep -v or so to the log lint in librelane?make copy-final




grep -v or so to the log lint in librelane? .lydrb that was produced by KLayout. So I don't think that would help. You would need a filter inside of that function.


make copy-final final folder.


final folder. Poly overlap of contact < 0.065um (CO.3)
MV N-Diffusion overlap of contact < 0.065um (CO.4)
dffrnq_4. For scale the thick part of that poly is 500 nm across.

dffrnq (flop with async reset) are all drive=1. (edited)

dffrnq (flop with async reset) are all drive=1. (edited)







































# Apply RTL-inserted false path constraints (setup/hold only, still constrain slew)
set_false_path -setup -hold -through [get_pins *.magic_falsepath_anchor_u/Z]
And then there is an RTL module that inserts magic buffers for the constraints:
https://github.com/Wren6991/RISCBoy-180/blob/bb4540d8b1ee8493448395a5b010c80b37377010/hdl/cells/falsepath_anchor.vset_false_path -setup -hold -from sync_reg_name_here/Q -to *_PAD/OE but it's a bit cumbersome in this flow because flops don't have predictable names unless you instantiate them yourself

1x1.PDK_ROOT and PDK are set.


set_false_path -setup -hold -from sync_reg_name_here/Q -to *_PAD/OE but it's a bit cumbersome in this flow because flops don't have predictable names unless you instantiate them yourself 







OBS block containing a rectangle on the right metal layer. I don't think klayout can write .lef files but they are easy to write by hand.VERSION 5.7 ;
NOWIREEXTENSIONATPIN ON ;
DIVIDERCHAR "/" ;
BUSBITCHARS "[]" ;
MACRO whatever
CLASS COVER ;
FOREIGN whatever ;
ORIGIN 0.000 0.000 ;
SIZE 100.000 BY 100.000 ;
OBS
LAYER Metal2 ;
RECT 25.000 25.000 75.000 75.000 ;
END
END whatever
END LIBRARY




state_out.json. Have a look at the metrics key in the JSON file, maybe that has what you're looking for? "design__instance__count__stdcell": 116005,
"design__instance__area__stdcell": 2878000,
"design__instance__count__macros": 28,
"design__instance__area__macros": 5360940,
"design__instance__count__padcells": 1136,
"design__instance__area__padcells": 5271000,
"design__instance__count__cover": 0,
"design__instance__area__cover": 0,
"design__instance__utilization": 0.63858,
"design__instance__utilization__stdcell": 0.381646,
"design__rows": 3408,
"design__rows:GF018hv5v_green_sc9": 3408,
"design__sites": 2496942,
"design__sites:GF018hv5v_green_sc9": 2496942,
"design__instance__count__class:macro": 28,
"design__instance__area__class:macro": 5360940,
"design__instance__count__class:input_pad": 3,
"design__instance__area__class:input_pad": 78750,
"design__instance__count__class:input_output_pad": 53,
"design__instance__area__class:input_output_pad": 1391250,
"design__instance__count__class:power_pad": 18,
"design__instance__area__class:power_pad": 472500,
"design__instance__count__class:tie_cell": 383,
"design__instance__area__class:tie_cell": 4323.92,
"design__instance__count__class:buffer": 2135,
"design__instance__area__class:buffer": 42671.9,
"design__instance__count__class:inverter": 7722,
"design__instance__area__class:inverter": 89255.6,
"design__instance__count__class:clock_gate_cell": 613,
"design__instance__area__class:clock_gate_cell": 50137.1,
"design__instance__count__class:sequential_cell": 7291,
"design__instance__area__class:sequential_cell": 568677,
"design__instance__count__class:multi_input_combinational_cell": 48145,
"design__instance__area__class:multi_input_combinational_cell": 912403,
Maybe more detail than you wanted gf180mcu/gf180mcuD/libs.ref/gf180mcu_fd_sc_mcu7t5v0/spice/gf180mcu_fd_sc_mcu7t5v0.spice and then multiply by instance counts scraped from your netlist
# Enable plugin for better SystemVerilog support
USE_SLANG: True
The error seems to be slang's handling of the VDD/VSS connecting in the netlist it passes through to yosys. Not liking the inout type.
use_slang
6. Executing SLANG frontend.
src/chip_core.sv:12:17: error: direction 'InOut' on inlined port connection unsupported
inout wire VDD,
^
src/chip_core.sv:13:17: error: direction 'InOut' on inlined port connection unsupported
inout wire VSS,
^
src/chip_core.sv:32:39: error: direction 'InOut' on inlined port connection unsupported
inout wire [NUM_ANALOG_PADS-1:0] analog // Analog
^
ERROR: Compilation failed 

# Enable plugin for better SystemVerilog support
USE_SLANG: True
The error seems to be slang's handling of the VDD/VSS connecting in the netlist it passes through to yosys. Not liking the inout type.
use_slang
6. Executing SLANG frontend.
src/chip_core.sv:12:17: error: direction 'InOut' on inlined port connection unsupported
inout wire VDD,
^
src/chip_core.sv:13:17: error: direction 'InOut' on inlined port connection unsupported
inout wire VSS,
^
src/chip_core.sv:32:39: error: direction 'InOut' on inlined port connection unsupported
inout wire [NUM_ANALOG_PADS-1:0] analog // Analog
^
ERROR: Compilation failed 

6. Executing SLANG frontend.
ERROR: Assert `count_id(cell->name) == 0' failed in kernel/rtlil.cc:2624.




XOR: missing required input 'mag_gds'
I get it at the end of a run during the KLayout vs. Magic XOR step. (edited)

meta:
version: 3
flow: Chip
substituting_steps:
# Disable KLayout DRC
#KLayout.DRC: null
#Checker.KLayoutDRC: null
# Disable KLayout antenna check
KLayout.Antenna: null
Checker.KLayoutAntenna: null
# Disable KLayout density check
#KLayout.Density: null
#Checker.KLayoutDensity: null
# Save time during development
# Enable for sign-off
#OpenROAD.IRDropReport: null
#Magic.DRC: null
#Checker.MagicDRC: null
#KLayout.XOR: null
#Netgen.LVS: null
#Checker.LVS: null
PRIMARY_GDSII_STREAMOUT_TOOL: klayout
This is some relevant lines from the config.yaml.

XOR: missing required input 'mag_gds'
I get it at the end of a run during the KLayout vs. Magic XOR step. (edited)
runs directory, do you see it running magic stream out ?



runs directory, do you see it running magic stream out ? Using NULL graphics device.
Then at the bottom:
Cannot open .../librelane/runs/RUN_2025-11-28_00-08-28/73-magic-streamout/chip_top.magic.gds to write GDS-II stream output
I only have a chip_top.mag , no .magic.gds. (edited)


Using NULL graphics device.
Then at the bottom:
Cannot open .../librelane/runs/RUN_2025-11-28_00-08-28/73-magic-streamout/chip_top.magic.gds to write GDS-II stream output
I only have a chip_top.mag , no .magic.gds. (edited)ulimit. A proper fix would be for LibreLane to tell magic it doesn't have to lock the files. It's on my list...





ulimit. A proper fix would be for LibreLane to tell magic it doesn't have to lock the files. It's on my list... 



ulimit -Sn 4096 solved that particular issue.
On MacOS I have a different issue which is that I get actual XORs between KLayout and Magic GDS. I didn't diagnose that, I just stopped using MacOS for now (it also tends to crash in the detailed router).



state_out.json. Have a look at the metrics key in the JSON file, maybe that has what you're looking for? 





















File /home/ubuntu/gf180mcu-project-template/gf180mcu/gf180mcuD/libs.ref/gf180mcu_fd_ip_sram/mag/M3_M24310590878114_256x8m81.mag couldn't be read
Failure to read entire subtree of the cell.
Failed on cell M3_M24310590878114_256x8m81.
I/O error in writing file /home/ubuntu/gf180mcu-project-template/librelane/runs/RUN_2025-11-29_06-44-00/56-magic-streamout/chip_top.magic.gds.
File may be incompletely written. 

File /home/ubuntu/gf180mcu-project-template/gf180mcu/gf180mcuD/libs.ref/gf180mcu_fd_ip_sram/mag/M3_M24310590878114_256x8m81.mag couldn't be read
Failure to read entire subtree of the cell.
Failed on cell M3_M24310590878114_256x8m81.
I/O error in writing file /home/ubuntu/gf180mcu-project-template/librelane/runs/RUN_2025-11-29_06-44-00/56-magic-streamout/chip_top.magic.gds.
File may be incompletely written. 



















gf180mcu_fd_ip_sram__sram512x8m8wm1.v:132:28: Unsupported: minimum/typical/maximum delay expressions. Using the typical delay
132 | specparam Tcyc = 55600 : 55600 : 55600;
|
This is a typical error. I got this weeks ago and replaced the entire sram section with those with a:
`ifndef VERILATOR
specparam Tcyc = 55600 : 55600 : 55600;
...
`endif
Then outside the specify block I did:
`ifdef VERILATOR
parameter Tcyc = 8183;
parameter Tckh = 4000;
parameter Tckl = 4000;
...
`endif
Is there a better way? Since now it's failing all github deployments automatically since it's using the repo direct and not my local changes. (edited)



gds flatglobing these cells before reading the gds in magic
*Bondpad*
*CLAMP_COR*
*FILL*
*METAL_RAIL*
*NMOS_*
*POWER_RAIL_COR*
*_BASE*
*comp018green*
*diode_nd2ps_06v0_*[A-Z]*
*diode_pd2nw_06v0_*[A-Z]*
*mim_*_*[A-Z]*
*moscap_*
*nmos_*_*[A-Z]*
*nmos_4T_metal_stack*
*nmos_clamp_*
*pmos_6p0_esd_*
*power_via*
*ppolyf_u_*[A-Z]*
*top_route* 





if inside a generate block do what you need?

reset_n, so the SRAM is operational.

reset_n, so the SRAM is operational. cen_fell thing is a bug in the RAM model where they don't initialise all of their variables



























set_input_delay -min 0 -clock $clocks $clk_core_input_ports which sets the hold time on the inputs to zero. I think that's may be why you've had to turn up the hold slack margin, because it means a bunch of buffering is required on the inputs which is a bit difficult for the flow to get right.

librelane/runs/<timestamp>/54-openroad-stapostpnr/<corner>/ and open min.rpt/max.rpt for hold/setup checks.












