VLSIDA / OpenRAM

An open-source static random access memory (SRAM) compiler.
http://www.openram.org
BSD 3-Clause "New" or "Revised" License
821 stars 201 forks source link

Routing error due to high (vertical) density? #236

Open c-93 opened 5 months ago

c-93 commented 5 months ago

Thanks for this great project.

Describe the bug SupplyRouter fails to route some signals (typically VDD) for certain memory configurations.

[openram.router.supply_router/route]: Running router for vdd and gnd...
ERROR: file supply_router.py: line 84: Couldn't route from (vdd layer=m3 ll=v[191.795,-55.435] ur=v[192.285,-54.945]) to (vdd layer=m3 ll=v[191.635,-44.165] ur=v[192.125,-43.675]).

Version 1.2.48, b6a6f12

To Reproduce This configuration should reproduce the bug:

word_size = 64 # Bits
num_words = 256
words_per_row = 1 # Con also be reproduced with other dimensions
human_byte_size = "{:.0f}kbytes".format((word_size * num_words)/1024/8)

# Allow byte writes
write_size = word_size # Bits

# Dual port
num_rw_ports = 1
num_r_ports = 0
num_w_ports = 0
ports_human = '1rw'

num_spare_cols = 5 # Can also be reproduced with smaller numbers
num_spare_rows = 5 # Can also be reproduced with smaller numbers

import os
exec(open(os.path.join(os.path.dirname(__file__), 'sky130_sram_common.py')).read())

Expected behavior Don't crash. Don't miss any signals / nets. If routing is impossible, increase (vertical) area to ease routing, or move pins more to the left. Optionally, place pins on the west and east sides (not only south) to gain even more interface surface area to further ease routing.

Screenshots The individually unroutable signal depents on the memory configuration. For the provided example, the error can be located in the generated gds files. temp.gds: image

error.gds: image

zoomed-in error.gds: image

Logs As the screenshots have a limited resolution, you may use the actual GDS files to further zoom in. gds.tar.gz

Log: sky130_sram_custom.log

Additional context I created 120 different SKY130 memory macro configurations and executed them on our slurm cluster for 3 days. I swept over different port configurations (rw, rw+r), word width(1, 4, 8, 16, 32, 64 byte), and memory sizes (64 bit... 128 kByte).

Openram finished only 10 macros. The other 110 configurations failed or ran into the SLURM job timeout after 96h.
While some configurations quickly failed for obvious reasons (the desired total size or word width was too small or too large), others failed due to internal problems (or other user error).

I can share all 120 configurations, and provide corresponding results (1+ gigabyte tar.gz file).

Questions: Is there an easy fix to prevent a design from unroutability? E.g. provide more layers, give more vertical space?

mguthaus commented 5 months ago

Thanks for the suggested improvements. We likely won't get to improving the supply router for a while. We are constrained by resources right now.