All sections
Each card shows a command to explain. A missed card returns later in the round and starts the schedule over. A card answered correctly moves up the schedule and next appears after 1, 3, 7, then 21 days. Keys 1 to 4 choose an option, h shows a hint, and Enter moves on. A hint keeps the card where it is on the schedule. An ordering card is answered by clicking its items in order, and one wrong click ends it. Time values are in nanoseconds. Progress is stored in this browser.
All 84 cards in this deck, with answers
-
export DESIGN_NAME = gcdNames the top-level module that the flow builds.
Hint: The flow has to know which module is the design, out of everything it reads.
Every stage works on this module, and it must match a module in the Verilog that is read.
DESIGN_NICKNAMEis the separate variable that renames the output directory. OpenROAD-flow-scripts reference -
export DESIGN_NICKNAME = riscv32iChanges the output directory name without changing the module built.
Hint: Compare it with DESIGN_NAME: only one of the two has to match the Verilog.
Results go to
results/<platform>/<nickname>/. It exists for designs whose top module name is unwieldy or collides with another design's. OpenROAD-flow-scripts reference -
export PLATFORM = nangate45Selects the process design kit the design is built with.
Hint: One word pulls in a whole directory of technology files.
The platform directory supplies the technology and cell files, the site, the power grid script, and its own default variables. Changing this one line rebuilds the same design on a different technology. OpenROAD-flow-scripts reference
-
export VERILOG_FILES = $(sort $(wildcard ./designs/src/gcd/*.v))Lists the design's source files for synthesis to read.
Hint: Ask what synthesis is given to read.
The list is read by synthesis, in order.
sortaround a wildcard keeps the order stable so a build is repeatable. Header directories are given separately withVERILOG_INCLUDE_DIRS. OpenROAD-flow-scripts reference -
export SDC_FILE = ./designs/nangate45/gcd/constraint.sdcGives the timing constraints, starting with the clock definition.
Hint: It is read early and then used by every stage that thinks about timing.
The file holds the SDC (Synopsys Design Constraints) commands: clock definitions, input and output delays, and any exceptions. Synthesis, placement, clock tree synthesis, and routing all read it, and later stages read the version each earlier stage wrote. OpenROAD-flow-scripts reference
-
export ADDITIONAL_LEFS = ./designs/src/tiny/sram.lefAdds hard macro geometry: outline, pins, and blockages.
Hint: A hardened macro is not in the standard cell library. Ask what its shape comes from.
A macro needs three things in the flow: its shape from a LEF (Library Exchange Format) file here, its timing from
ADDITIONAL_LIBS, and its layout fromADDITIONAL_GDSat the end. The shape is stored in the design database; the timing is not. OpenROAD-flow-scripts reference -
export ADDITIONAL_LIBS = ./designs/src/tiny/sram.libAdds hard macro timing and power data for analysis.
Hint: The counterpart of the macro's shape.
The library is read in each session that times the design, because it is not stored in the database, unlike the geometry. A macro missing from here times as if it had no delay at all. OpenROAD-flow-scripts reference
-
export ADDITIONAL_GDS = ./designs/src/tiny/sram.gdsAdds the macro's real layout for the final merged layout file.
Hint: It matters only at the very end, when one file has to contain everything.
Through the flow a macro is only an outline with pins. The finishing stage merges the real layout of each macro into the design's own layout, which is what goes to the foundry. OpenROAD-flow-scripts reference
-
export BLOCKS = aes_cipher_topNames sub-blocks that are hardened first and used as macros above.
Hint: It turns part of your own design into something the top level treats as a macro.
In a hierarchical run each named block goes through the flow on its own and produces an abstract and a timing model. The top level then places it as a macro, which is how a design too big for one flat run is built. OpenROAD-flow-scripts reference
-
export SYNTH_HIERARCHICAL = 1Keeps the module hierarchy through synthesis instead of flattening it.
Hint: The default flattens everything. Ask what is kept instead.
Flat synthesis optimizes across module boundaries and usually gives better results, but it loses the names that make a large design navigable. Hierarchical synthesis keeps modules above the size set by
SYNTH_MINIMUM_KEEP_SIZEand flattens the rest. OpenROAD-flow-scripts reference -
export SYNTH_MINIMUM_KEEP_SIZE = 1000Keeps modules bigger than 1000 basic gates and flattens smaller ones.
Hint: The unit is not gates, and not microns. It is relative to one small cell.
The size is measured in units of the platform's basic two-input gate area, so it means the same thing on different technologies. It applies to hierarchical synthesis: small modules are flattened so they can be optimized across their boundaries anyway. OpenROAD-flow-scripts reference
-
export ABC_AREA = 1Tells the synthesis optimizer to aim for area rather than speed.
Hint: The two strategies pull in opposite directions.
ABC (And-Inverter-Graph optimizer) is the engine inside Yosys that maps logic to library cells. The default is the speed strategy; setting this switches to the area strategy, which gives a smaller but slower netlist. OpenROAD-flow-scripts reference
-
export ABC_DRIVER_CELL = BUF_X1Says what drives the design's inputs while synthesis estimates timing.
Hint: Synthesis has no placement and no real drivers yet, so it needs an assumption.
Without a driver the input slew is unknown, and slew drives every delay after it. This variable and
ABC_LOAD_IN_FF, the load on the outputs, are the boundary assumptions synthesis works from. OpenROAD-flow-scripts reference -
export ABC_LOAD_IN_FF = 3Sets the capacitance synthesis assumes on the design's outputs.
Hint: The unit is in the name, and it is the other end of the design from the driver.
Outputs drive something off-block, and the size of that load decides how strongly synthesis builds the last stage. The value is in femtofarads, hence the name. OpenROAD-flow-scripts reference
-
export ADDER_MAP_FILE = $(PLATFORM_DIR)/cells_adders.vMaps the design's adders onto the platform's own adder cells.
Hint: Ask what synthesis would otherwise build an adder out of.
Left alone, synthesis builds an adder from ordinary gates. A platform with dedicated full-adder cells maps to them instead, which is smaller and faster. The same mechanism exists for clock gates and latches. OpenROAD-flow-scripts reference
-
export TIEHI_CELL_AND_PORT = LOGIC1_X1 ZNames the cell and pin that synthesis uses to drive a constant 1.
Hint: Two values: which cell, and which of its pins.
A gate input must never be tied straight to the supply rail, since that exposes the thin oxide. A tie cell provides a safe constant instead.
TIELO_CELL_AND_PORTis the same for logic 0. OpenROAD-flow-scripts reference -
export SYNTH_NETLIST_FILES = ./results/nangate45/gcd/base/1_synth.vSkips synthesis and starts the flow from the netlist given.
Hint: Ask which stage of the flow stops being needed.
This is how a netlist from elsewhere, or from an earlier run, enters the flow. It is also the way to iterate on placement and routing without paying for synthesis each time. OpenROAD-flow-scripts reference
-
export SWAP_ARITH_OPERATORS = 1Lets the flow rebuild adders and multipliers in a faster architecture.
Hint: The same arithmetic can be built in several shapes, with different speeds.
An adder can be a ripple-carry, a Kogge-Stone, a Brent-Kung, and more, all with the same function but different delay and area. The flow can swap the module for another architecture when timing needs it. OpenROAD-flow-scripts reference
-
export CORE_UTILIZATION = 40Sizes the core so the cells fill 40% of it, leaving the rest free.
Hint: It is a percentage, and it decides a size rather than reporting one.
The die size follows from the cell area and this number, together with
CORE_ASPECT_RATIOandCORE_MARGIN. Low utilization eases routing and wastes area; high utilization does the opposite. GivingDIE_AREAandCORE_AREAinstead sets the size directly. OpenROAD-flow-scripts reference -
export CORE_ASPECT_RATIO = 2.0Makes the core twice as tall as it is wide.
Hint: Read the ratio in the documented order: height over width.
It only applies when the size comes from
CORE_UTILIZATION. A shape other than square is used to fit a block into a fixed slot at the top level, or to suit a design's pin sides. OpenROAD-flow-scripts reference -
export CORE_MARGIN = 2Leaves 2 microns between the core area and the die edge.
Hint: It is the space between two boundaries, and something has to live there.
The margin is where the power ring and the boundary pins go, so a core pressed against the die edge leaves nowhere to bring power in. One value sets all four sides; four values set them separately. OpenROAD-flow-scripts reference
-
export DIE_AREA = 0 0 100.13 100.8 export CORE_AREA = 10.07 11.2 90.25 91Sets the die and the core rectangles directly, in microns.
Hint: Four numbers each: two corners. Ask which rectangle sits inside the other.
Each is a lower-left and an upper-right corner. Giving both replaces the utilization-based sizing, which is how a block gets the exact size a top-level floorplan has reserved for it. OpenROAD-flow-scripts reference
-
export PLACE_SITE = FreePDK45_38x28_10R_NP_162NW_34ONames the site whose height and width the placement rows are built from.
Hint: It comes from the technology file, and it decides the shape of a row.
A site is the smallest legal cell footprint in the technology. Rows are one site high, and every cell's width is a whole number of sites, which is what makes legalization possible. OpenROAD-flow-scripts reference
-
export MACRO_PLACE_HALO = 10 10Keeps a 10 micron band clear around each macro, in x and y.
Hint: Two numbers, and the space they describe stays empty.
Cells packed against a macro leave no room to reach the macro's pins or to add buffers later. The halo reserves that room. It is used by automatic macro placement. OpenROAD-flow-scripts reference
-
export MACRO_PLACEMENT_TCL = ./designs/nangate45/bp/macro.tclPlaces named macros by hand, leaving the rest to the automatic placer.
Hint: You can use it for some macros and leave the others alone.
The file holds
place_macrocommands. Any macro it does not place is left tortl_macro_placer, which is how a floorplan fixes the macros that matter and lets the tool handle the rest. OpenROAD-flow-scripts reference -
export IO_CONSTRAINTS = ./designs/nangate45/gcd/io.tclRestricts where the boundary pins may be placed, by edge or by name.
Hint: Ask which stage reads it, and what it would otherwise decide for itself.
The file holds
set_io_pin_constraintand related commands, read beforeplace_pins. Without it the pin placer is free to put any pin anywhere on the boundary. The layers are set separately byIO_PLACER_HandIO_PLACER_V. OpenROAD-flow-scripts reference -
export PDN_TCL = $(PLATFORM_DIR)/grid_strategy-M1-M4-M7.tclGives the script that describes the power grid to build.
Hint: The file name names three layers. Ask what is built across them.
The script holds the grid definition commands: the rails, the straps per layer, and the layer pairs to connect, which
pdngenthen builds. It usually comes from the platform, since the grid depends on the metal stack. OpenROAD-flow-scripts reference -
export TAPCELL_TCL = $(PLATFORM_DIR)/tapcell.tclGives the script that inserts the well taps and the endcap cells.
Hint: Two kinds of cell, both about the rows rather than the logic.
The script calls
tapcellwith the platform's masters and spacing. The spacing comes from the foundry's rule on how far a transistor may be from a well tap, so the script belongs to the platform. OpenROAD-flow-scripts reference -
export FLOORPLAN_DEF = ./designs/nangate45/bp/floorplan.defStarts from a ready-made floorplan instead of creating one.
Hint: Ask what it replaces, rather than what it adds.
The file brings the die and core areas, the rows, and often the pin and macro placement. It is mutually exclusive with sizing by utilization or by explicit areas, and it is how an externally agreed floorplan enters the flow. OpenROAD-flow-scripts reference
-
export PLACE_DENSITY = 0.60Asks global placement to spread cells to 60% density per bin.
Hint: It is a target for the placer, not a property of the floorplan.
Utilization sizes the die; this decides how tightly the placer packs cells within it. A lower value spreads cells out, which eases routing and lengthens wires; a higher value does the opposite and runs faster. OpenROAD-flow-scripts reference
-
export PLACE_DENSITY_LB_ADDON = 0.20Raises the flow's computed lower bound on density by 0.20.
Hint: The flow computes a lower bound for density on its own. Ask what this does to it.
The flow derives a minimum sensible density from the design, and this adds headroom above it, which spreads cells further. It is the usual knob for a design that places easily but routes badly. OpenROAD-flow-scripts reference
-
export CELL_PAD_IN_SITES_GLOBAL_PLACEMENT = 4Reserves four sites of empty space beside each cell.
Hint: The unit is sites, and the padding is not real silicon.
The padding applies during global placement. It is a placement fiction that leaves room for routing to reach pins and for repair to add cells. It is set separately for global and detailed placement, usually larger for global. OpenROAD-flow-scripts reference
-
export IO_PLACER_H = metal3 export IO_PLACER_V = metal2Puts pins on horizontal tracks on metal3 and on vertical tracks on metal2.
Hint: Horizontal and vertical describe the tracks, not which edge the pin sits on.
The two variables become the
-hor_layersand-ver_layersarguments ofplace_pins. The layer has to match the track direction, since the pin shape sits on a track. OpenROAD-flow-scripts reference -
export GPL_TIMING_DRIVEN = 0Turns off timing-driven placement, which is on by default.
Hint: Check the default before deciding what setting it to 0 means.
Timing-driven placement weights critical nets so they are shortened, at the cost of runtime. It is on by default and turned off for quick exploration runs or when the timing estimate is not yet meaningful. OpenROAD-flow-scripts reference
-
export CLUSTER_FLOPS = 1Groups flip-flops into multi-bit cells where the library has them.
Hint: It only works if the library has the cells for it.
One multi-bit register serves several bits from a single clock pin, so the clock tree drives fewer sinks and spends less power. The flow ignores the setting on a platform whose library has no such cells. OpenROAD-flow-scripts reference
-
export DONT_USE_CELLS = TAPCELL_X1 FILLCELL_X1 AOI211_X1 OAI211_X1Keeps optimization from choosing those cells anywhere in the flow.
Hint: Ask why a cell that exists would be excluded from use.
Cells are excluded when they are hard to route into, when they belong to another purpose (a tap or a filler), or when they behave badly. The list becomes
set_dont_useinside the flow. OpenROAD-flow-scripts reference -
export ENABLE_DPO = 0Turns off the detailed placement optimization pass, which is on by default.
Hint: Another one where the default matters. It names an optimization after legalization.
The pass is
improve_placement: local swaps and shifts that shorten wires while keeping the placement legal. It is turned off when it costs more runtime than it is worth, or to keep a placement stable. OpenROAD-flow-scripts reference -
export CTS_CLUSTER_SIZE = 30Allows at most 30 clock sinks in one cluster under a buffer.
Hint: A cluster is a group of sinks that will share one buffer.
Sinks are grouped before the tree is built, and each group gets its own buffer, which becomes a leaf of the tree above. A larger cluster means fewer buffers and more load on each.
CTS_CLUSTER_DIAMETERlimits the same group by distance instead. OpenROAD-flow-scripts reference -
export CTS_CLUSTER_DIAMETER = 100Keeps a clock sink cluster within 100 microns across.
Hint: The unit is microns, so this limit is geometric.
A cluster that is small in count can still be spread across the block, and then its buffer drives a long wire to each sink. The diameter limit keeps a cluster compact; the two limits are used together. OpenROAD-flow-scripts reference
-
export CTS_BUF_DISTANCE = 60Puts a buffer roughly every 60 microns along the clock tree's wires.
Hint: It concerns the wire between buffers, not the sinks.
Wire delay grows with the square of length, so a long clock wire is split by buffers. Setting the distance makes the tree regular; leaving it unset lets the tool choose from its characterization. OpenROAD-flow-scripts reference
-
export CTS_LIB_NAME = NangateOpenCellLibraryNames the library that the clock buffers are chosen from.
Hint: Ask where the clock buffers are chosen from when several libraries are loaded.
A run may load several libraries, including macro libraries and different threshold-voltage flavours. Naming one keeps clock buffer selection inside it. OpenROAD-flow-scripts reference
-
export SKIP_CTS_REPAIR_TIMING = 1Skips the timing repair that normally follows clock tree synthesis.
Hint: Ask what is being traded away, and when that would be acceptable.
Repair after the clock tree is often the longest step of a run, because real skew appears there for the first time. Skipping it suits early exploration or a fast test run, and it leaves timing unfixed. OpenROAD-flow-scripts reference
-
export MIN_ROUTING_LAYER = metal2 export MAX_ROUTING_LAYER = metal10Confines routing to metal2 through metal10, leaving metal1 alone.
Hint: Ask why the lowest layer is not metal1.
metal1 is left out because the standard cells' own pins and supply rails already occupy it. The upper bound keeps routing off layers the power grid or the package needs. Both become
set_routing_layersinside the flow. OpenROAD-flow-scripts reference -
export MIN_CLK_ROUTING_LAYER = metal4Keeps clock routing off the lowest layers, starting it at metal4.
Hint: It is usually higher than the signal minimum. Ask what is gained higher up.
Upper layers are thicker and so less resistive, which keeps clock delay and skew down. The variable is the lower bound of
set_routing_layers -clock, and it is typically higher than the signal minimum. OpenROAD-flow-scripts reference -
export ROUTING_LAYER_ADJUSTMENT = 0.3Tells the global router each layer has 30% less capacity.
Hint: The number derates something the global router counts. Ask which way the trade runs.
Thirty percent of each layer's tracks are treated as unavailable. Some are already taken by pins, the power grid, and blockages. A larger adjustment spreads routing out and eases detailed routing, at the cost of detours and longer global routing; a smaller one risks congestion the detailed router cannot solve. The default is 0.5. OpenROAD-flow-scripts reference
-
export FASTROUTE_TCL = $(PLATFORM_DIR)/fastroute.tclRuns a script of routing settings before global routing starts.
Hint: It runs before the router, so ask what it can still change.
The script holds the per-platform routing setup: the layer ranges, the clock layers, and the layer adjustments. Platforms ship one because those choices depend on the metal stack. OpenROAD-flow-scripts reference
-
export ENABLE_RESISTANCE_AWARE = 1Passes the resistance-aware flag to global routing.
Hint: It is passed straight through to the global router as a flag.
Resistance-aware routing weighs the resistance of the layer a net is assigned to, instead of treating layers as interchangeable capacity. The OpenROAD documentation marks the option as not ready for production. OpenROAD-flow-scripts reference
-
export DISABLE_VIA_GEN = 1Stops the detailed router generating its own vias, using only the technology's.
Hint: It is a flag for the detailed router, and vias come in two kinds.
The router can either build via shapes from rules or use the fixed vias the technology defines. Restricting it to the fixed set is used when a technology's generated vias would not be manufacturable. OpenROAD-flow-scripts reference
-
export TNS_END_PERCENT = 100Repairs all violating endpoints, not only the worst ones.
Hint: Ask what a lower number would buy, given that the worst path is always repaired.
The worst path is always repaired; this says how much of the failing tail is repaired after it, as a percentage of violating endpoints. The default is 100, and it is reduced (5 is common) to cut runtime, which leaves total negative slack worse. OpenROAD-flow-scripts reference
-
export SETUP_SLACK_MARGIN = 0.05Keeps repairing setup until each path has 0.05 ns of slack in hand.
Hint: Repair normally stops at zero slack. Ask what this changes about stopping.
Repairing to a margin (overfixing) leaves headroom for what later stages add, since routing and extraction usually make timing worse. A negative value underfixes, stopping before slack reaches zero, which is used to save runtime.
HOLD_SLACK_MARGINis the same for hold. OpenROAD-flow-scripts reference -
export HOLD_SLACK_MARGIN = 0.1Repairs hold until each path has 0.1 ns of hold slack in hand.
Hint: Hold is fixed by adding delay. Ask what a margin costs here.
Hold margin costs buffers and area, because delay has to be added to the fast paths. It buys safety against the on-chip variation that a single corner does not show. A negative value underfixes. OpenROAD-flow-scripts reference
-
export CAP_MARGIN = 20 export SLEW_MARGIN = 20Repairs capacitance and slew to limits 20% tighter than the real ones.
Hint: Both are design-rule limits, and the margins work the same way as the slack ones.
Before routing, parasitics are estimated from placement and are optimistic. Overfixing against tighter limits leaves room for the real wires. The two become the margin arguments of
repair_design. OpenROAD-flow-scripts reference -
export SKIP_GATE_CLONING = 1Stops timing repair from duplicating a gate to split its load.
Hint: Cloning is one of the transforms timing repair can apply. Ask what it costs.
Cloning a gate lets each copy drive part of the fanout, which helps a heavily loaded driver, but it adds area and makes the netlist diverge from the synthesized one. Flows disable it when netlist stability or area matters more. Cloning is used by default. OpenROAD-flow-scripts reference
-
export SKIP_LAST_GASP = 1Skips the final timing-repair attempt made after the main passes.
Hint: The name says when it runs, not what it does.
The last-gasp pass is a final push on whatever still fails after the normal transforms have run. It costs runtime for a small gain, so runs that care about turnaround skip it. It is used by default. OpenROAD-flow-scripts reference
-
export SKIP_INCREMENTAL_REPAIR = 1Skips the repair that runs inside global routing.
Hint: Ask which stage's repair this is, given the parasitics that stage provides.
After global routing, parasitics are much closer to the truth, so the flow repairs timing again with better numbers. Skipping it saves runtime and leaves those violations for later stages, or unfixed. OpenROAD-flow-scripts reference
-
export RECOVER_POWER = 20Slows the 20% of paths with the most slack, to save power.
Hint: The percentage refers to paths that are not in trouble.
Slack on a path means it is running faster than it has to, which costs leakage and area. Downsizing those cells trades the unneeded speed back for power. The value becomes
repair_timing -recover_power. OpenROAD-flow-scripts reference -
export MATCH_CELL_FOOTPRINT = 1Allows sizing to swap only cells with the same layout boundary.
Hint: The restriction is physical, not electrical.
Same-footprint swaps drop into place without disturbing placement or routing, so they can be made late. It narrows the choice of cells, which limits how much timing can improve. OpenROAD-flow-scripts reference
-
export OPT_POST_GRT_WNS = 0Turns off the worst-slack repair that normally runs after global routing.
Hint: Check the default. Ask what kind of repair is gentle enough to run after routing.
The pass is deliberately gentle: it swaps threshold voltage and reroutes wires rather than adding or moving cells, so it disturbs the placement and routing as little as possible. It is on by default. OpenROAD-flow-scripts reference
-
export FILL_CELLS = FILLCELL_X1 FILLCELL_X2 FILLCELL_X4Names the cells used to fill the gaps between placed cells.
Hint: Ask what happens if the variable is left empty.
A filler carries the supply rails and the well layers across a gap, so the rows stay legal to manufacture. If the variable is unset or empty, the flow skips filler insertion altogether. Metal fill is the separate
USE_FILL. OpenROAD-flow-scripts reference -
export USE_FILL = 1Turns on metal fill, which evens out each layer's density.
Hint: Compare it with FILL_CELLS: one fills rows, the other fills layers.
Dummy metal shapes are added where a layer is too empty. Manufacturing needs each layer's metal density inside a band, or polishing leaves an uneven surface. Metal fill adds unconnected shapes where a layer is too empty, following the rules in
FILL_CONFIG. It is off by default because it is slow and enlarges the layout. OpenROAD-flow-scripts reference -
export PWR_NETS_VOLTAGES = VDD 1.1 export GND_NETS_VOLTAGES = VSS 0.0Gives the supply voltages that the drop analysis solves against.
Hint: Ask which analysis needs to know a voltage, rather than just a net name.
The analysis pushes current through the grid's resistance and reports how far the local voltage falls below these values.
IR_DROP_LAYERsays which layer the result is reported on. OpenROAD-flow-scripts reference -
export IR_DROP_LAYER = metal1Chooses the layer whose voltage drop is reported.
Hint: The drop is worst furthest from the source. Ask where that is in the stack.
The analysis solves the whole grid, but the number that matters is what the cells see, and they connect on the lowest layer. Reporting there shows the worst case. OpenROAD-flow-scripts reference
-
export GDS_ALLOW_EMPTY = sram.*Allows macros matching that pattern to have no layout of their own.
Hint: The value is a pattern, and the stage is the one that merges layouts.
Merging normally fails if a macro has no layout, which catches a missing file. The pattern makes that deliberate, for a macro whose layout comes later or is supplied by the foundry. OpenROAD-flow-scripts reference
-
export SEAL_GDS = sky130_seal_ring.gdsAdds a seal ring layout around the design in the final merge.
Hint: A ring placed around the outside of the die, once the design is done.
A seal ring is a metal barrier around the die edge that protects the circuit from the cracks and moisture that dicing can introduce. It is foundry-supplied and merged in at the end. OpenROAD-flow-scripts reference
-
export CDL_FILE = $(PLATFORM_DIR)/cdl/sc.cdlGives the cells' own subcircuits for the netlist that is written.
Hint: Ask what the flow's own netlist output is missing for this check.
Without them the netlist would name cells it never defines. The flow writes a netlist for layout-versus-schematic checking, and that netlist has to include the standard cells' transistor-level contents. This file supplies them, as the
-mastersargument ofwrite_cdl. OpenROAD-flow-scripts reference -
export KLAYOUT_TECH_FILE = $(PLATFORM_DIR)/KLayout/tech.lytMaps the flow's layer names onto the layout format's numbers.
Hint: Two formats describe the same layers with different names and numbers.
LEF (Library Exchange Format) and DEF (Design Exchange Format) name layers; a layout file identifies them by number and datatype. The mapping lets the flow write the final layout and lets KLayout read it back with the right layers. OpenROAD-flow-scripts reference
-
export RCX_RULES = $(PLATFORM_DIR)/rcx_patterns.rulesGives the model that extraction turns routed geometry into parasitics with.
Hint: Extraction has to turn geometry into numbers from somewhere.
The rules file is built once per process from field-solver runs over test patterns. Extraction measures each wire's geometry and neighbours and looks the values up in it, which is what sign-off timing uses. OpenROAD-flow-scripts reference
-
export CORNER = BCPicks which process, voltage, and temperature library set is used.
Hint: It selects among libraries that the platform already ships.
A platform that ships several characterizations, such as best case, typical, and worst case, selects one this way. It is available on the ASAP7 and GF180 platforms;
CORNERSis the separate variable for analyzing several at once. OpenROAD-flow-scripts reference -
export OPENROAD_HIERARCHICAL = 1Runs the physical stages hierarchically rather than on a flat design.
Hint: Compare it with SYNTH_HIERARCHICAL, which concerns one stage only.
The database keeps the module hierarchy through placement, routing, and the rest, instead of a flat netlist. The documentation says it will become the default and the option will then be retired. Hardening blocks separately is
BLOCKS. OpenROAD-flow-scripts reference -
export SKIP_REPORT_METRICS = 1Stops the per-stage metric reporting, to make a build faster.
Hint: Ask what is lost, and what is gained, on a long run.
After each stage the flow reports area, timing, and more into JSON (JavaScript Object Notation) metrics files. That costs a timing run each time. Skipping it speeds up exploration and gives up the record of how the run progressed. OpenROAD-flow-scripts reference
-
export LEC_CHECK = 1Checks the netlist is logically unchanged by the tool's edits.
Hint: Ask which two versions of the netlist there are to compare.
The two versions compared are the netlist before and after the tool's changes. Resizing, buffering, and clock tree synthesis rewrite it, and a formal equivalence check proves the rewrite changed no function. The documentation says a failure is an OpenROAD bug worth reporting.
REMOVE_CELLS_FOR_LECdrops cells the checker cannot handle. OpenROAD-flow-scripts reference -
export GPL_RANDOM_SEED = 42Fixes the placer's random seed, so a run can be repeated or varied.
Hint: Ask what changes between two runs that are otherwise identical.
Setting the seed to different values gives different placements of the same design, which is how the effect of placement noise on a result is measured. The documentation calls this a perturbation study. OpenROAD-flow-scripts reference
-
export ASAP7_USE_VT = RVT LVTAllows the flow to use both the regular and low threshold-voltage cells.
Hint: The letters name transistor flavours, and each one trades the same two things.
A lower threshold voltage makes a cell faster and leakier. Offering several flavours lets optimization spend leakage only where speed is needed. It applies to the ASAP7 platform, whose library ships regular, low, and super-low flavours. OpenROAD-flow-scripts reference
-
export CORNERS = slow fastAnalyses timing at both named corners, not just one.
Hint: Ask how the flow then knows which library belongs to which name.
Libraries are loaded per corner: for each name the flow reads the matching per-corner library variable, such as
SLOW_LIB_FILES. Several corners at once is how a design is signed off, since setup is usually worst slow and hold worst fast. OpenROAD-flow-scripts reference -
export TECH_LEF = $(PLATFORM_DIR)/lef/NangateOpenCellLibrary.tech.lef export SC_LEF = $(PLATFORM_DIR)/lef/NangateOpenCellLibrary_macro.lefGives the technology layers in one file and the cell shapes in the other.
Hint: Two files in the same format, describing two different things.
The technology file carries the metal layers, vias, sites, and spacing rules; the cell file carries each standard cell's outline, pins, and blockages. Both are LEF (Library Exchange Format), and both come from the platform. OpenROAD-flow-scripts reference
-
export CLKGATE_MAP_FILE = $(PLATFORM_DIR)/cells_clkgate.vMaps inferred clock gating onto the platform's clock-gating cells.
Hint: The same mapping mechanism as the adder file, for a different kind of cell.
A clock gate built from ordinary gates can glitch the clock. The platform's integrated cell latches the enable so it cannot. The file tells synthesis which cell to use;
LATCH_MAP_FILEdoes the same for latches. OpenROAD-flow-scripts reference -
export LATCH_MAP_FILE = $(PLATFORM_DIR)/cells_latch.vMaps inferred latches onto the platform's own latch cells.
Hint: Ask what synthesis does with an inferred latch when no such cell is named.
A latch inferred from incomplete code has to become some real cell. Without a mapping file, synthesis builds one from gates, which is larger and less predictable than the library's own latch. OpenROAD-flow-scripts reference
-
export SYNTH_HDL_FRONTEND = slangReads the sources with the slang front end, not the default one.
Hint: It changes how the sources are read, before any logic is built.
The sources are parsed by slang before any logic is built. The default reader handles a subset of SystemVerilog. The slang front end supports considerably more of the language, which is what designs written in modern SystemVerilog need. Leaving the variable empty keeps the default. OpenROAD-flow-scripts reference
-
export MACRO_WRAPPERS = ./designs/src/bp/wrappers.tclSwaps each macro for a wrapped version of it before placement.
Hint: Ask why a macro would be replaced by another version of itself.
A wrapper adds what the macro itself does not carry, such as pin access structures or a keepout, so the flow can treat a bare macro as a well-behaved block. OpenROAD-flow-scripts reference
-
export RTLMP_MAX_MACRO = 12Allows at most 12 macros in one cluster of the macro placer.
Hint: The macro placer groups things first. Ask what the number limits.
The placer clusters the netlist into a hierarchy of blocks and shapes them before placing macros. The cluster limits,
RTLMP_MAX_MACRO,RTLMP_MIN_MACRO, and their instance counterparts, control how coarse that hierarchy is. Unset, the tool derives values from the design. OpenROAD-flow-scripts reference -
export CELL_PAD_IN_SITES_DETAIL_PLACEMENT = 2Keeps two sites free beside each cell during legalization.
Hint: Compare it with the global placement padding: same idea, later stage, usually smaller.
Legalization is the stage that uses it. Global placement is padded more to spread cells early, while legalization is padded less because the space still has to exist in real rows. The padding is removed before filler insertion, so it costs no area in the end. OpenROAD-flow-scripts reference
-
export PLACE_PINS_ARGS = -min_distance 4 -min_distance_in_tracksPasses those extra arguments straight to the pin placer.
Hint: The name says where the text goes, not what it means.
A passthrough variable exists so a design can reach an option the flow does not otherwise expose, here the minimum spacing between pins in tracks.
GLOBAL_PLACEMENT_ARGSandCTS_ARGSdo the same for their own stages. OpenROAD-flow-scripts reference -
export GLOBAL_PLACEMENT_ARGS = -routability_drivenAdds arguments to the global placement call the flow already makes.
Hint: Ask what this reaches that the flow's own density variables cannot.
The flow builds its own
global_placementcall from the density and timing variables; this appends to it. It is how a design turns on an option such as routability-driven placement without editing the flow. OpenROAD-flow-scripts reference -
export CTS_ARGS = -sink_clustering_size 20Overrides the arguments the flow passes to clock tree synthesis.
Hint: Compare it with the CTS (Clock Tree Synthesis) variables that have their own names.
The named variables, such as
CTS_CLUSTER_SIZE, build the usual clock tree synthesis call. This variable replaces those arguments outright, which is the way to reach an option that has no variable of its own. OpenROAD-flow-scripts reference