DOCSBooley user guide Tracks the main branch

ASIC synthesis (synth)

synth gives a fast ASIC quality-of-results estimate (area, timing/Fmax, structural problems) to iterate RTL against. It is not tape-out synthesis or sign-off. It uses Yosys and OpenROAD on the built-in Nangate45 technology.

booley flow synth --target synth_soc
booley flow synth --target synth_soc --baseline main   # compare with another revision

Constraints. Physical synthesis (the Target's synth_mode) needs a file_type: SDC fileset in the Target that creates at least one clock; Booley adds no timing constraints of its own. Logical synthesis skips STA and needs no SDC. Physical fanout limits come from OpenROAD's defaults, the library, or the Project's SDC. OpenROAD uses an implicit maximum fanout of 50 when neither the library nor the SDC sets a limit. For very large nets, set a suitable limit in the Target's SDC: set_max_fanout <n> [current_design].

Synthesis mode is Target-owned: there is no per-call --synth-mode option.

Everyday options:

Option Effect
--baseline <git-ref> Compare with the baseline Target at another revision (the two Targets may differ).
--ppa-profile <compact\|balanced\|max_frequency> Use a clean built-in PPA profile for this call. It replaces the Target's advanced backend settings; expert flags below still apply on top.
--flatten / --no-flatten Override the Target's hierarchy flattening.
--frontend <sv2v\|slang> Override the Target's RTL frontend, mainly for diagnosis.

Expert options, for tuning experiments:

  • Yosys/ABC: --abc-recipe <default|balanced|fast> or --abc-script <script>, --generic-abc-before-mapping / --no-generic-abc-before-mapping, --abc-delay-ps <ps>.
  • OpenROAD: --utilization-pct <percent>, --placement-density <fraction>, --repair-setup / --no-repair-setup, --repair-hold / --no-repair-hold, --gate-cloning / --no-gate-cloning, --setup-margin-ns <ns>, --repair-tns-percent <percent>.

Verdict. The report gives area, cells, per-clock timing and Fmax, latches, and warning counts. Combinational loops and multiple drivers in the final netlist fail the run. Other actionable warnings give a warn grade but still exit 0; known-benign warnings are counted with a rationale. SYNTH:{target} is satisfied only when synthesis completes, the final structural check ran, and every configured threshold passes.

Configuration ([flows.synth])

[flows.synth]
timeout_ms = 5400000       # per-config cap in ms (default 1800000 = 30 min)
expected_latches = 0       # intentional latches to allow
# fail_on_timing_violation = true    # negative slack becomes a design FAIL (exit 1)

Persistent build-recipe inputs live on the selected Target:

# <design>.core
filesets:
  timing_constraints:
    files:
      - util/syn/sdc/block.sdc: {file_type: SDC}
  synth_memory:
    files:
      - synth/top_ram_timing_surrogate.sv: {file_type: systemVerilogSource}
parameters:
  SYNTH_MEMORY_SURROGATE:
    datatype: bool
    paramtype: vlogdefine
    default: true
targets:
  synth:
    flow_options:
      tool: yosys
      frontend: sv2v            # sv2v (default) | slang
      # slang_options: [--single-unit]
      ppa_profile: balanced     # compact | balanced | max_frequency
      synth_mode: physical      # physical (default) | logical
      flatten: true
      advanced_settings_yosys:
        abc_recipe: balanced
        # generic_abc_before_mapping: false
        # abc_delay_ps: 3333
      advanced_settings_openroad:
        utilization_pct: 50
        placement_density: 0.80
    filesets: [rtl, timing_constraints, synth_memory]
    parameters: [SYNTH_MEMORY_SURROGATE]
    toplevel: top

physical runs Yosys followed by OpenROAD placement, optimization, parasitic estimation, and its embedded STA. Its area_um2 is post-optimization area and area_source is openroad_post_optimization. Timing intent belongs in the Target's SDC fileset. A physical Target without SDC is rejected before EDA execution, and OpenROAD rejects an SDC that creates no clocks. Booley loads the authored files in Target order and adds no generated timing constraints.

A memory timing surrogate is an ordinary Verilog/SystemVerilog source. Put it in a synthesis-only fileset and let the project's RTL select it through a typed vlogdefine owned by the synthesis Target, as above. Simulation and lint Targets keep the functional memory RTL by omitting both that fileset and that define. No manifest or custom FuseSoC file type is involved. Every read-data bit of the surrogate depends, through registers only, on the memory's write data, address, write enables, and byte-enables, combined bit-wise, with no combinational write-to-read arc. Read data driven only by the address or by constants lets synthesis delete the logic around the memory and understates area and Fmax; Project Setup checks each surrogate with a no-pruning probe against a black-box synthesis. The surrogate is a timing-boundary approximation: synthesis results exclude the memory's real capacity, contents, macro area, power, placement, and internal timing arcs.

logical runs only Yosys mapping. It is much faster and gives a useful mapped area estimate plus estimated_fmax_mhz, calculated from ABC's longest mapped logic delay. The frequency is not STA and is probably inaccurate because it excludes placement and wire delays; Booley prints that warning with every logical estimate. Its area_source is yosys_mapped. SDC is not required or consumed in this mode. A non-empty advanced_settings_openroad table with synth_mode: logical is a configuration error because those settings could not affect the result.

# util/syn/sdc/block.sdc
create_clock -name clk_i -period 25.0 [get_ports clk_i]
set_input_delay  -clock clk_i 0.0 [all_inputs]
set_output_delay -clock clk_i 0.0 [all_outputs]
set_false_path -from [get_ports mode_i]

Physical fanout limits come from OpenROAD's defaults, the library, or the Project's SDC. OpenROAD uses an implicit maximum fanout of 50 when neither the library nor the SDC sets a limit. For very large nets, set a suitable limit in the Target's SDC: set_max_fanout <n> [current_design].

For normal use, change ppa_profile; select synth_mode: logical only when the fast mapped-area / approximate-frequency trade-off is intentional. Profiles are EDA-tool-independent intent and can be translated by a future Genus backend as well as the built-in Yosys/OpenROAD backend. The Target's advanced_settings_yosys and advanced_settings_openroad subtables are expert overrides and deliberately remain backend-specific.

Profile Yosys mapping OpenROAD utilization / density
compact one default liberty-aware ABC pass 40% / 0.65
balanced one balanced liberty-aware ABC pass 50% / 0.80
max_frequency one fast liberty-aware ABC pass 50% / 0.80

All profiles run synth -noabc, followed by dfflibmap and exactly one liberty-aware ABC pass. --ppa-profile and --flatten/--no-flatten override the Target defaults for one MCP tool call. Expert per-call flags override one backend setting after the profile is selected. An explicit per-call profile starts from that clean built-in profile (it does not inherit Target-level advanced-setting overrides); per-call expert flags can then refine it.

balanced is the default. Select a profile explicitly for stable PPA. compact uses default liberty mapping and 40%/0.65 controls. Every profile uses grid-aligned core margins and whole-design buffer removal. generic_abc_before_mapping = true enables two ABC passes; establish a fresh physical baseline when changing the mapping recipe.

Target flow_options.slang_options is passed to read_slang verbatim. --single-unit is the common one: slang compiles each file as its own compilation unit, so a repo whose macros come from a defines header included once at the top of the filelist (a convention sv2v and Verilator both honor) hits "unknown macro" errors without it.

fail_on_timing_violation defaults false: synthesis succeeded structurally, and many projects synthesize against placeholder constraints, so a violation prints RESULT: WARN -- timing VIOLATED and exits 0. Turn it on once the SDC is real, or an rc-only consumer (Goal evidence consumer, CI step) reads a -2.6 ns design as success.

Source: docs/user/FLOW-SYNTH.md on GitHub