From 81f87ce6ede480de2c976938921eef8b9e79f9db Mon Sep 17 00:00:00 2001 From: "N. Engelhardt" Date: Wed, 23 Jul 2025 14:41:49 +0000 Subject: [PATCH] Revert "Add groups to command reference" --- .github/workflows/prepare-docs.yml | 1 + Makefile | 36 +- backends/functional/test_generic.cc | 4 +- docs/.gitignore | 1 + docs/Makefile | 2 +- docs/source/_static/custom.css | 5 - docs/source/appendix/auxlibs.rst | 5 +- docs/source/cmd/index_backends.rst | 5 - docs/source/cmd/index_formal.rst | 5 - docs/source/cmd/index_frontends.rst | 5 - docs/source/cmd/index_internal.rst | 152 ------ docs/source/cmd/index_kernel.rst | 5 - docs/source/cmd/index_other.rst | 9 - docs/source/cmd/index_passes.rst | 14 - docs/source/cmd/index_passes_cmds.rst | 5 - docs/source/cmd/index_passes_equiv.rst | 5 - docs/source/cmd/index_passes_fsm.rst | 5 - docs/source/cmd/index_passes_hierarchy.rst | 5 - docs/source/cmd/index_passes_memory.rst | 5 - docs/source/cmd/index_passes_opt.rst | 5 - docs/source/cmd/index_passes_proc.rst | 5 - docs/source/cmd/index_passes_sat.rst | 5 - docs/source/cmd/index_passes_status.rst | 5 - docs/source/cmd/index_passes_techmap.rst | 7 - docs/source/cmd/index_techlibs.rst | 11 - docs/source/cmd/index_techlibs_achronix.rst | 5 - docs/source/cmd/index_techlibs_anlogic.rst | 5 - docs/source/cmd/index_techlibs_common.rst | 5 - .../source/cmd/index_techlibs_coolrunner2.rst | 5 - docs/source/cmd/index_techlibs_easic.rst | 5 - docs/source/cmd/index_techlibs_ecp5.rst | 5 - docs/source/cmd/index_techlibs_fabulous.rst | 5 - docs/source/cmd/index_techlibs_gatemate.rst | 5 - docs/source/cmd/index_techlibs_gowin.rst | 5 - docs/source/cmd/index_techlibs_greenpak4.rst | 5 - docs/source/cmd/index_techlibs_ice40.rst | 5 - docs/source/cmd/index_techlibs_intel.rst | 5 - docs/source/cmd/index_techlibs_intel_alm.rst | 5 - docs/source/cmd/index_techlibs_lattice.rst | 5 - .../cmd/index_techlibs_lattice_nexus.rst | 5 - docs/source/cmd/index_techlibs_microchip.rst | 5 - .../cmd/index_techlibs_microchip_sf2.rst | 5 - docs/source/cmd/index_techlibs_nanoxplore.rst | 5 - docs/source/cmd/index_techlibs_quicklogic.rst | 5 - docs/source/cmd/index_techlibs_xilinx.rst | 5 - docs/source/cmd_ref.rst | 33 +- .../code_examples/macro_commands/prep.ys | 23 - docs/source/conf.py | 12 +- docs/source/getting_started/example_synth.rst | 63 +-- .../getting_started/scripting_intro.rst | 4 +- docs/source/index.rst | 2 +- .../interactive_investigation.rst | 10 +- .../more_scripting/load_design.rst | 18 +- .../using_yosys/more_scripting/selections.rst | 6 +- docs/source/using_yosys/synthesis/fsm.rst | 2 +- docs/source/using_yosys/synthesis/memory.rst | 2 +- docs/source/using_yosys/synthesis/opt.rst | 8 +- docs/source/using_yosys/synthesis/proc.rst | 2 +- docs/source/using_yosys/synthesis/synth.rst | 33 +- .../using_yosys/synthesis/techmap_synth.rst | 6 +- docs/source/yosys_internals/hashing.rst | 2 +- docs/source/yosys_internals/verilog.rst | 2 +- docs/util/{cell_documenter.py => cellref.py} | 0 docs/util/cmd_documenter.py | 443 ------------------ docs/util/{custom_directives.py => cmdref.py} | 152 +----- kernel/json.h | 4 +- kernel/log_help.cc | 151 ------ kernel/log_help.h | 132 ------ kernel/register.cc | 438 ++++++++--------- kernel/register.h | 46 +- passes/cmds/check.cc | 6 - passes/cmds/chformal.cc | 109 +++-- passes/cmds/cover.cc | 14 +- passes/cmds/dft_tag.cc | 6 - passes/cmds/edgetypes.cc | 6 - passes/cmds/example_dt.cc | 8 +- passes/cmds/exec.cc | 9 +- passes/cmds/future.cc | 6 - passes/cmds/glift.cc | 11 +- passes/cmds/internal_stats.cc | 7 +- passes/cmds/logcmd.cc | 10 +- passes/cmds/logger.cc | 9 +- passes/cmds/ltp.cc | 6 - passes/cmds/plugin.cc | 6 - passes/cmds/portarcs.cc | 6 - passes/cmds/portlist.cc | 6 - passes/cmds/printattrs.cc | 6 - passes/cmds/scc.cc | 11 +- passes/cmds/scratchpad.cc | 10 +- passes/cmds/select.cc | 18 +- passes/cmds/setenv.cc | 11 +- passes/cmds/show.cc | 10 +- passes/cmds/sta.cc | 6 - passes/cmds/stat.cc | 6 - passes/cmds/tee.cc | 10 +- passes/cmds/torder.cc | 6 - passes/cmds/trace.cc | 11 - passes/cmds/viz.cc | 6 - passes/cmds/write_file.cc | 6 - passes/cmds/xprop.cc | 6 - passes/hierarchy/Makefile.inc | 1 - passes/opt/rmports.cc | 11 +- passes/pmgen/test_pmgen.cc | 4 +- passes/sat/assertpmux.cc | 6 - passes/sat/async2sync.cc | 6 - passes/sat/clk2fflogic.cc | 6 - passes/sat/cutpoint.cc | 6 - passes/sat/expose.cc | 10 +- passes/sat/fmcombine.cc | 6 - passes/sat/fminit.cc | 6 - passes/sat/formalff.cc | 6 - passes/sat/freduce.cc | 14 +- passes/sat/miter.cc | 10 +- passes/sat/mutate.cc | 6 - passes/sat/qbfsat.cc | 6 - passes/sat/recover_names.cc | 6 - passes/sat/sat.cc | 14 +- passes/sat/supercover.cc | 6 - passes/sat/synthprop.cc | 12 +- passes/techmap/Makefile.inc | 1 + passes/{hierarchy => techmap}/flatten.cc | 0 passes/tests/test_abcloop.cc | 4 +- passes/tests/test_autotb.cc | 4 +- passes/tests/test_cell.cc | 4 +- 124 files changed, 474 insertions(+), 2035 deletions(-) delete mode 100644 docs/source/cmd/index_backends.rst delete mode 100644 docs/source/cmd/index_formal.rst delete mode 100644 docs/source/cmd/index_frontends.rst delete mode 100644 docs/source/cmd/index_internal.rst delete mode 100644 docs/source/cmd/index_kernel.rst delete mode 100644 docs/source/cmd/index_other.rst delete mode 100644 docs/source/cmd/index_passes.rst delete mode 100644 docs/source/cmd/index_passes_cmds.rst delete mode 100644 docs/source/cmd/index_passes_equiv.rst delete mode 100644 docs/source/cmd/index_passes_fsm.rst delete mode 100644 docs/source/cmd/index_passes_hierarchy.rst delete mode 100644 docs/source/cmd/index_passes_memory.rst delete mode 100644 docs/source/cmd/index_passes_opt.rst delete mode 100644 docs/source/cmd/index_passes_proc.rst delete mode 100644 docs/source/cmd/index_passes_sat.rst delete mode 100644 docs/source/cmd/index_passes_status.rst delete mode 100644 docs/source/cmd/index_passes_techmap.rst delete mode 100644 docs/source/cmd/index_techlibs.rst delete mode 100644 docs/source/cmd/index_techlibs_achronix.rst delete mode 100644 docs/source/cmd/index_techlibs_anlogic.rst delete mode 100644 docs/source/cmd/index_techlibs_common.rst delete mode 100644 docs/source/cmd/index_techlibs_coolrunner2.rst delete mode 100644 docs/source/cmd/index_techlibs_easic.rst delete mode 100644 docs/source/cmd/index_techlibs_ecp5.rst delete mode 100644 docs/source/cmd/index_techlibs_fabulous.rst delete mode 100644 docs/source/cmd/index_techlibs_gatemate.rst delete mode 100644 docs/source/cmd/index_techlibs_gowin.rst delete mode 100644 docs/source/cmd/index_techlibs_greenpak4.rst delete mode 100644 docs/source/cmd/index_techlibs_ice40.rst delete mode 100644 docs/source/cmd/index_techlibs_intel.rst delete mode 100644 docs/source/cmd/index_techlibs_intel_alm.rst delete mode 100644 docs/source/cmd/index_techlibs_lattice.rst delete mode 100644 docs/source/cmd/index_techlibs_lattice_nexus.rst delete mode 100644 docs/source/cmd/index_techlibs_microchip.rst delete mode 100644 docs/source/cmd/index_techlibs_microchip_sf2.rst delete mode 100644 docs/source/cmd/index_techlibs_nanoxplore.rst delete mode 100644 docs/source/cmd/index_techlibs_quicklogic.rst delete mode 100644 docs/source/cmd/index_techlibs_xilinx.rst delete mode 100644 docs/source/code_examples/macro_commands/prep.ys rename docs/util/{cell_documenter.py => cellref.py} (100%) delete mode 100644 docs/util/cmd_documenter.py rename docs/util/{custom_directives.py => cmdref.py} (81%) delete mode 100644 kernel/log_help.cc delete mode 100644 kernel/log_help.h rename passes/{hierarchy => techmap}/flatten.cc (100%) diff --git a/.github/workflows/prepare-docs.yml b/.github/workflows/prepare-docs.yml index b47f5f3dd..fb1fab426 100644 --- a/.github/workflows/prepare-docs.yml +++ b/.github/workflows/prepare-docs.yml @@ -59,6 +59,7 @@ jobs: with: name: cmd-ref-${{ github.sha }} path: | + docs/source/cmd docs/source/generated docs/source/_images docs/source/code_examples diff --git a/Makefile b/Makefile index 1443f3c4a..d7b38c80f 100644 --- a/Makefile +++ b/Makefile @@ -115,6 +115,12 @@ BISON ?= bison STRIP ?= strip AWK ?= awk +ifneq ($(shell :; command -v rsync),) +RSYNC_CP ?= rsync -rc +else +RSYNC_CP ?= cp -ru +endif + ifeq ($(OS), Darwin) PLUGIN_LINKFLAGS += -undefined dynamic_lookup LINKFLAGS += -rdynamic @@ -526,6 +532,7 @@ LIBS_VERIFIC += -Wl,--whole-archive $(patsubst %,$(VERIFIC_DIR)/%/*-linux.a,$(VE endif endif + ifeq ($(ENABLE_COVER),1) CXXFLAGS += -DYOSYS_ENABLE_COVER endif @@ -627,7 +634,6 @@ $(eval $(call add_include_file,frontends/blif/blifparse.h)) $(eval $(call add_include_file,backends/rtlil/rtlil_backend.h)) OBJS += kernel/driver.o kernel/register.o kernel/rtlil.o kernel/log.o kernel/calc.o kernel/yosys.o kernel/io.o kernel/gzip.o -OBJS += kernel/log_help.o OBJS += kernel/binding.o kernel/tclapi.o OBJS += kernel/cellaigs.o kernel/celledges.o kernel/cost.o kernel/satgen.o kernel/scopeinfo.o kernel/qcsat.o kernel/mem.o kernel/ffmerge.o kernel/ff.o kernel/yw.o kernel/json.o kernel/fmt.o kernel/sexpr.o OBJS += kernel/drivertools.o kernel/functional.o @@ -1028,8 +1034,19 @@ ifeq ($(ENABLE_PYOSYS),1) endif endif -docs/source/generated/cmds.json: docs/source/generated $(TARGETS) $(EXTRA_TARGETS) - $(Q) ./$(PROGRAM_PREFIX)yosys -p 'help -dump-cmds-json $@' +# also others, but so long as it doesn't fail this is enough to know we tried +docs/source/cmd/abc.rst: $(TARGETS) $(EXTRA_TARGETS) + $(Q) mkdir -p docs/source/cmd + $(Q) mkdir -p temp/docs/source/cmd + $(Q) cd temp && ./../$(PROGRAM_PREFIX)yosys -p 'help -write-rst-command-reference-manual' + $(Q) $(RSYNC_CP) temp/docs/source/cmd docs/source + $(Q) rm -rf temp +docs/source/cell/word_add.rst: $(TARGETS) $(EXTRA_TARGETS) + $(Q) mkdir -p docs/source/cell + $(Q) mkdir -p temp/docs/source/cell + $(Q) cd temp && ./../$(PROGRAM_PREFIX)yosys -p 'help -write-rst-cells-manual' + $(Q) $(RSYNC_CP) temp/docs/source/cell docs/source + $(Q) rm -rf temp docs/source/generated/cells.json: docs/source/generated $(TARGETS) $(EXTRA_TARGETS) $(Q) ./$(PROGRAM_PREFIX)yosys -p 'help -dump-cells-json $@' @@ -1046,15 +1063,6 @@ docs/source/generated/functional/rosette.diff: backends/functional/smtlib.cc bac PHONY: docs/gen/functional_ir docs/gen/functional_ir: docs/source/generated/functional/smtlib.cc docs/source/generated/functional/rosette.diff -docs/source/generated/%.log: docs/source/generated $(TARGETS) $(EXTRA_TARGETS) - $(Q) ./$(PROGRAM_PREFIX)yosys -qQT -h '$*' -l $@ - -docs/source/generated/chformal.cc: passes/cmds/chformal.cc docs/source/generated - $(Q) cp $< $@ - -PHONY: docs/gen/chformal -docs/gen/chformal: docs/source/generated/chformal.log docs/source/generated/chformal.cc - PHONY: docs/gen docs/usage docs/reqs docs/gen: $(TARGETS) $(Q) $(MAKE) -C docs gen @@ -1090,7 +1098,7 @@ docs/reqs: $(Q) $(MAKE) -C docs reqs .PHONY: docs/prep -docs/prep: docs/source/generated/cells.json docs/source/generated/cmds.json docs/gen docs/usage docs/gen/functional_ir docs/gen/chformal +docs/prep: docs/source/cmd/abc.rst docs/source/generated/cells.json docs/gen docs/usage docs/gen/functional_ir DOC_TARGET ?= html docs: docs/prep @@ -1114,7 +1122,7 @@ clean: rm -f tests/tools/cmp_tbdata rm -f $(addsuffix /run-test.mk,$(MK_TEST_DIRS)) -$(MAKE) -C docs clean - rm -rf docs/util/__pycache__ + rm -rf docs/source/cmd docs/util/__pycache__ rm -f *.whl rm -f libyosys.so diff --git a/backends/functional/test_generic.cc b/backends/functional/test_generic.cc index 42d6c2b95..a9dfd0c70 100644 --- a/backends/functional/test_generic.cc +++ b/backends/functional/test_generic.cc @@ -116,9 +116,7 @@ struct MemContentsTest { struct FunctionalTestGeneric : public Pass { - FunctionalTestGeneric() : Pass("test_generic", "test the generic compute graph") { - internal(); - } + FunctionalTestGeneric() : Pass("test_generic", "test the generic compute graph") {} void help() override { diff --git a/docs/.gitignore b/docs/.gitignore index 09bb59048..65bbcdeae 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,4 +1,5 @@ /build/ +/source/cmd /source/generated /source/_images/**/*.log /source/_images/**/*.aux diff --git a/docs/Makefile b/docs/Makefile index fb3e03b79..a8874bb83 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -47,7 +47,7 @@ help: .PHONY: clean clean: clean-examples rm -rf $(BUILDDIR)/* - rm -rf util/__pycache__ + rm -rf source/cmd util/__pycache__ rm -rf source/generated $(MAKE) -C source/_images clean diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css index 60faf6812..b08194c05 100644 --- a/docs/source/_static/custom.css +++ b/docs/source/_static/custom.css @@ -18,8 +18,3 @@ .literal-block-wrapper .code-block-caption .caption-number { padding-right: 0.5em } - -/* Don't double shrink text in a literal in an optionlist */ -kbd .option>.literal { - font-size: revert; -} diff --git a/docs/source/appendix/auxlibs.rst b/docs/source/appendix/auxlibs.rst index 192ac0944..8c78ed6b3 100644 --- a/docs/source/appendix/auxlibs.rst +++ b/docs/source/appendix/auxlibs.rst @@ -29,7 +29,8 @@ ezSAT The files in ``libs/ezsat`` provide a library for simplifying generating CNF formulas for SAT solvers. It also contains bindings of MiniSAT. The ezSAT -library is written by C. Wolf. It is used by the `sat` pass. +library is written by C. Wolf. It is used by the `sat` pass (see +:doc:`/cmd/sat`). fst --- @@ -77,4 +78,4 @@ SubCircuit The files in ``libs/subcircuit`` provide a library for solving the subcircuit isomorphism problem. It is written by C. Wolf and based on the Ullmann Subgraph Isomorphism Algorithm :cite:p:`UllmannSubgraphIsomorphism`. It is used by the -`extract` pass. +extract pass (see :doc:`../cmd/extract`). diff --git a/docs/source/cmd/index_backends.rst b/docs/source/cmd/index_backends.rst deleted file mode 100644 index 373c26def..000000000 --- a/docs/source/cmd/index_backends.rst +++ /dev/null @@ -1,5 +0,0 @@ -Writing output files --------------------- - -.. autocmdgroup:: backends - :members: diff --git a/docs/source/cmd/index_formal.rst b/docs/source/cmd/index_formal.rst deleted file mode 100644 index b8b134c17..000000000 --- a/docs/source/cmd/index_formal.rst +++ /dev/null @@ -1,5 +0,0 @@ -Formal verification -------------------- - -.. autocmdgroup:: formal - :members: diff --git a/docs/source/cmd/index_frontends.rst b/docs/source/cmd/index_frontends.rst deleted file mode 100644 index b64fdc9b9..000000000 --- a/docs/source/cmd/index_frontends.rst +++ /dev/null @@ -1,5 +0,0 @@ -Reading input files -------------------- - -.. autocmdgroup:: frontends - :members: diff --git a/docs/source/cmd/index_internal.rst b/docs/source/cmd/index_internal.rst deleted file mode 100644 index bfb369dde..000000000 --- a/docs/source/cmd/index_internal.rst +++ /dev/null @@ -1,152 +0,0 @@ -Internal commands for developers --------------------------------- - -.. autocmdgroup:: internal - :members: - -Writing command help --------------------- - -- use `chformal` as an example -- generated help content below - -.. _chformal autocmd: - -.. autocmd:: chformal - :noindex: - -The ``formatted_help()`` method -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- ``PrettyHelp::get_current()`` -- ``PrettyHelp::set_group()`` - - + used with ``.. autocmdgroup:: `` - + can assign group and return false - + if no group is set, will try to use ``source_location`` and assign group - from path to source file - -- return value - - + true means help content added to current ``PrettyHelp`` - + false to use ``Pass::help()`` - -- adding content - - + help content is a list of ``ContentListing`` nodes, each one having a type, - body, and its own list of children ``ContentListing``\ s - + ``PrettyHelp::get_root()`` returns the root ``ContentListing`` (``type="root"``) - + ``ContentListing::{usage, option, codeblock, paragraph}`` each add a - ``ContentListing`` to the current node, with type the same as the method - - * the first argument is the body of the new node - * ``usage`` shows how to call the command (i.e. its "signature") - * ``paragraph`` content is formatted as a paragraph of text with line breaks - added automatically - * ``codeblock`` content is displayed verbatim, use line breaks as desired; - takes an optional ``language`` argument for assigning the language in RST - output for code syntax highlighting (use ``yoscrypt`` for yosys script - syntax highlighting) - * ``option`` lists a single option for the command, usually starting with a - dash (``-``); takes an optional second argument which adds a paragraph - node as a means of description - - + ``ContentListing::open_usage`` creates and returns a new usage node, can be - used to e.g. add text/options specific to a given usage of the command - + ``ContentListing::open_option`` creates and returns a new option node, can - be used to e.g. add multiple paragraphs to an option's description - + paragraphs are treated as raw RST, allowing for inline formatting and - references as if it were written in the RST file itself - -.. literalinclude:: /generated/chformal.cc - :language: c++ - :start-at: bool formatted_help() - :end-before: void execute - :caption: ``ChformalPass::formatted_help()`` from :file:`passes/cmds/chformal.cc` - -Dumping command help to json -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- `help -dump-cells-json cmds.json` - - + generates a ``ContentListing`` for each command registered in Yosys - + tries to parse unformatted ``Pass::help()`` output if - ``Pass::formatted_help()`` is unimplemented or returns false - - * if a line starts with four spaces followed by the name of the command then - a space, it is parsed as a signature (usage node) - * if a line is indented and starts with a dash (``-``), it is parsed as an - option - * anything else is parsed as a codeblock and added to either the root node - or the current option depending on the indentation - - + dictionary of command name to ``ContentListing`` - - * uses ``ContentListing::to_json()`` recursively for each node in root - * root node used for source location of class definition - * includes flags set during pass constructor (e.g. ``experimental_flag`` set - by ``Pass::experimental()``) - * also title (``short_help`` argument in ``Pass::Pass``), group, and class - name - - + dictionary of group name to list of commands in that group - -- used by sphinx autodoc to generate help content - -.. literalinclude:: /generated/cmds.json - :language: json - :start-at: "chformal": { - :end-before: "chparam": { - :caption: `chformal` in generated :file:`cmds.json` - -.. note:: Synthesis command scripts are special cased - - If the final block of help output starts with the string `"The following - commands are executed by this synthesis command:\n"`, then the rest of the - code block is formatted as ``yoscrypt`` (e.g. `synth_ice40`). The caveat - here is that if the ``script()`` calls ``run()`` on any commands *prior* to - the first ``check_label`` then the auto detection will break and revert to - unformatted code (e.g. `synth_fabulous`). - -Command line rendering -~~~~~~~~~~~~~~~~~~~~~~ - -- if ``Pass::formatted_help()`` returns true, will call - ``PrettyHelp::log_help()`` - - + traverse over the children of the root node and render as plain text - + effectively the reverse of converting unformatted ``Pass::help()`` text - + lines are broken at 80 characters while maintaining indentation (controlled - by ``MAX_LINE_LEN`` in :file:`kernel/log_help.cc`) - + each line is broken into words separated by spaces, if a given word starts - and ends with backticks they will be stripped - -- if it returns false it will call ``Pass::help()`` which should call ``log()`` - directly to print and format help text - - + if ``Pass::help()`` is not overridden then a default message about missing - help will be displayed - -.. literalinclude:: /generated/chformal.log - :lines: 2- - -RST generated from autocmd -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -- below is the raw RST output from ``autocmd`` (``YosysCmdDocumenter`` class in - :file:`docs/util/cmd_documenter.py`) for `chformal` command -- heading will be rendered as a subheading of the most recent heading (see - `chformal autocmd`_ above rendered under `Writing command help`_) -- ``.. cmd:def:: `` line is indexed for cross references with ``:cmd:ref:`` - directive (`chformal autocmd`_ above uses ``:noindex:`` option so that - `chformal` still links to the correct location) - - + ``:title:`` option controls text that appears when hovering over the - `chformal` link - -- commands with warning flags (experimental or internal) add a ``.. warning`` - block before any of the help content -- if a command has no ``source_location`` the ``.. note`` at the bottom will - instead link to :doc:`/cmd/index_other` - -.. autocmd_rst:: chformal diff --git a/docs/source/cmd/index_kernel.rst b/docs/source/cmd/index_kernel.rst deleted file mode 100644 index c6891b5e5..000000000 --- a/docs/source/cmd/index_kernel.rst +++ /dev/null @@ -1,5 +0,0 @@ -Yosys kernel commands ---------------------- - -.. autocmdgroup:: kernel - :members: diff --git a/docs/source/cmd/index_other.rst b/docs/source/cmd/index_other.rst deleted file mode 100644 index 540cf9e49..000000000 --- a/docs/source/cmd/index_other.rst +++ /dev/null @@ -1,9 +0,0 @@ -:orphan: - -Other commands -============== - -Unknown source location - -.. autocmdgroup:: unknown - :members: diff --git a/docs/source/cmd/index_passes.rst b/docs/source/cmd/index_passes.rst deleted file mode 100644 index b652be004..000000000 --- a/docs/source/cmd/index_passes.rst +++ /dev/null @@ -1,14 +0,0 @@ -Passes ------- - -.. toctree:: - :maxdepth: 2 - :glob: - - /cmd/index_passes_hierarchy - /cmd/index_passes_proc - /cmd/index_passes_fsm - /cmd/index_passes_memory - /cmd/index_passes_opt - /cmd/index_passes_techmap - /cmd/index_passes_* diff --git a/docs/source/cmd/index_passes_cmds.rst b/docs/source/cmd/index_passes_cmds.rst deleted file mode 100644 index d7b448f07..000000000 --- a/docs/source/cmd/index_passes_cmds.rst +++ /dev/null @@ -1,5 +0,0 @@ -Design modification -------------------- - -.. autocmdgroup:: passes/cmds - :members: diff --git a/docs/source/cmd/index_passes_equiv.rst b/docs/source/cmd/index_passes_equiv.rst deleted file mode 100644 index 6ed2c3c18..000000000 --- a/docs/source/cmd/index_passes_equiv.rst +++ /dev/null @@ -1,5 +0,0 @@ -Equivalence checking --------------------- - -.. autocmdgroup:: passes/equiv - :members: diff --git a/docs/source/cmd/index_passes_fsm.rst b/docs/source/cmd/index_passes_fsm.rst deleted file mode 100644 index 43af5dce6..000000000 --- a/docs/source/cmd/index_passes_fsm.rst +++ /dev/null @@ -1,5 +0,0 @@ -FSM handling ------------- - -.. autocmdgroup:: passes/fsm - :members: diff --git a/docs/source/cmd/index_passes_hierarchy.rst b/docs/source/cmd/index_passes_hierarchy.rst deleted file mode 100644 index 27a0faeb7..000000000 --- a/docs/source/cmd/index_passes_hierarchy.rst +++ /dev/null @@ -1,5 +0,0 @@ -Working with hierarchy ----------------------- - -.. autocmdgroup:: passes/hierarchy - :members: diff --git a/docs/source/cmd/index_passes_memory.rst b/docs/source/cmd/index_passes_memory.rst deleted file mode 100644 index b4edb88e7..000000000 --- a/docs/source/cmd/index_passes_memory.rst +++ /dev/null @@ -1,5 +0,0 @@ -Memory handling ---------------- - -.. autocmdgroup:: passes/memory - :members: diff --git a/docs/source/cmd/index_passes_opt.rst b/docs/source/cmd/index_passes_opt.rst deleted file mode 100644 index ddeb5ce10..000000000 --- a/docs/source/cmd/index_passes_opt.rst +++ /dev/null @@ -1,5 +0,0 @@ -Optimization passes -------------------- - -.. autocmdgroup:: passes/opt - :members: diff --git a/docs/source/cmd/index_passes_proc.rst b/docs/source/cmd/index_passes_proc.rst deleted file mode 100644 index 1ad8d85b4..000000000 --- a/docs/source/cmd/index_passes_proc.rst +++ /dev/null @@ -1,5 +0,0 @@ -Converting process blocks -------------------------- - -.. autocmdgroup:: passes/proc - :members: diff --git a/docs/source/cmd/index_passes_sat.rst b/docs/source/cmd/index_passes_sat.rst deleted file mode 100644 index a2571fedb..000000000 --- a/docs/source/cmd/index_passes_sat.rst +++ /dev/null @@ -1,5 +0,0 @@ -Simulating circuits -------------------- - -.. autocmdgroup:: passes/sat - :members: diff --git a/docs/source/cmd/index_passes_status.rst b/docs/source/cmd/index_passes_status.rst deleted file mode 100644 index a157ed840..000000000 --- a/docs/source/cmd/index_passes_status.rst +++ /dev/null @@ -1,5 +0,0 @@ -Design status -------------- - -.. autocmdgroup:: passes/status - :members: diff --git a/docs/source/cmd/index_passes_techmap.rst b/docs/source/cmd/index_passes_techmap.rst deleted file mode 100644 index 1682cd181..000000000 --- a/docs/source/cmd/index_passes_techmap.rst +++ /dev/null @@ -1,7 +0,0 @@ -Technology mapping ------------------- - -.. seealso:: :doc:`/cmd/index_techlibs` - -.. autocmdgroup:: passes/techmap - :members: diff --git a/docs/source/cmd/index_techlibs.rst b/docs/source/cmd/index_techlibs.rst deleted file mode 100644 index 043620a3b..000000000 --- a/docs/source/cmd/index_techlibs.rst +++ /dev/null @@ -1,11 +0,0 @@ -Technology libraries -==================== - -Listed in alphabetical order. - -.. toctree:: - :maxdepth: 2 - :glob: - - /cmd/index_techlibs_common - /cmd/index_techlibs_* diff --git a/docs/source/cmd/index_techlibs_achronix.rst b/docs/source/cmd/index_techlibs_achronix.rst deleted file mode 100644 index d4d96d24a..000000000 --- a/docs/source/cmd/index_techlibs_achronix.rst +++ /dev/null @@ -1,5 +0,0 @@ -Achronix ------------------- - -.. autocmdgroup:: techlibs/achronix - :members: diff --git a/docs/source/cmd/index_techlibs_anlogic.rst b/docs/source/cmd/index_techlibs_anlogic.rst deleted file mode 100644 index 8a2e6b577..000000000 --- a/docs/source/cmd/index_techlibs_anlogic.rst +++ /dev/null @@ -1,5 +0,0 @@ -Anlogic ------------------- - -.. autocmdgroup:: techlibs/anlogic - :members: diff --git a/docs/source/cmd/index_techlibs_common.rst b/docs/source/cmd/index_techlibs_common.rst deleted file mode 100644 index 532f4291e..000000000 --- a/docs/source/cmd/index_techlibs_common.rst +++ /dev/null @@ -1,5 +0,0 @@ -Generic ------------------- - -.. autocmdgroup:: techlibs/common - :members: diff --git a/docs/source/cmd/index_techlibs_coolrunner2.rst b/docs/source/cmd/index_techlibs_coolrunner2.rst deleted file mode 100644 index 23d91a500..000000000 --- a/docs/source/cmd/index_techlibs_coolrunner2.rst +++ /dev/null @@ -1,5 +0,0 @@ -CoolRunner-II ------------------- - -.. autocmdgroup:: techlibs/coolrunner2 - :members: diff --git a/docs/source/cmd/index_techlibs_easic.rst b/docs/source/cmd/index_techlibs_easic.rst deleted file mode 100644 index c6398ddf3..000000000 --- a/docs/source/cmd/index_techlibs_easic.rst +++ /dev/null @@ -1,5 +0,0 @@ -eASIC ------------------- - -.. autocmdgroup:: techlibs/easic - :members: diff --git a/docs/source/cmd/index_techlibs_ecp5.rst b/docs/source/cmd/index_techlibs_ecp5.rst deleted file mode 100644 index 29fd309cf..000000000 --- a/docs/source/cmd/index_techlibs_ecp5.rst +++ /dev/null @@ -1,5 +0,0 @@ -ECP5 ------------------- - -.. autocmdgroup:: techlibs/ecp5 - :members: diff --git a/docs/source/cmd/index_techlibs_fabulous.rst b/docs/source/cmd/index_techlibs_fabulous.rst deleted file mode 100644 index 96f04f40a..000000000 --- a/docs/source/cmd/index_techlibs_fabulous.rst +++ /dev/null @@ -1,5 +0,0 @@ -FABulous ------------------- - -.. autocmdgroup:: techlibs/fabulous - :members: diff --git a/docs/source/cmd/index_techlibs_gatemate.rst b/docs/source/cmd/index_techlibs_gatemate.rst deleted file mode 100644 index 951d0000b..000000000 --- a/docs/source/cmd/index_techlibs_gatemate.rst +++ /dev/null @@ -1,5 +0,0 @@ -Gatemate ------------------- - -.. autocmdgroup:: techlibs/gatemate - :members: diff --git a/docs/source/cmd/index_techlibs_gowin.rst b/docs/source/cmd/index_techlibs_gowin.rst deleted file mode 100644 index cdcb1c2ee..000000000 --- a/docs/source/cmd/index_techlibs_gowin.rst +++ /dev/null @@ -1,5 +0,0 @@ -Gowin ------------------- - -.. autocmdgroup:: techlibs/gowin - :members: diff --git a/docs/source/cmd/index_techlibs_greenpak4.rst b/docs/source/cmd/index_techlibs_greenpak4.rst deleted file mode 100644 index add1ab102..000000000 --- a/docs/source/cmd/index_techlibs_greenpak4.rst +++ /dev/null @@ -1,5 +0,0 @@ -GreenPAK4 ------------------- - -.. autocmdgroup:: techlibs/greenpak4 - :members: diff --git a/docs/source/cmd/index_techlibs_ice40.rst b/docs/source/cmd/index_techlibs_ice40.rst deleted file mode 100644 index 1c4b2d07a..000000000 --- a/docs/source/cmd/index_techlibs_ice40.rst +++ /dev/null @@ -1,5 +0,0 @@ -iCE40 ------------------- - -.. autocmdgroup:: techlibs/ice40 - :members: diff --git a/docs/source/cmd/index_techlibs_intel.rst b/docs/source/cmd/index_techlibs_intel.rst deleted file mode 100644 index 6b3a26222..000000000 --- a/docs/source/cmd/index_techlibs_intel.rst +++ /dev/null @@ -1,5 +0,0 @@ -Intel (MAX10, Cyclone IV) -------------------------- - -.. autocmdgroup:: techlibs/intel - :members: diff --git a/docs/source/cmd/index_techlibs_intel_alm.rst b/docs/source/cmd/index_techlibs_intel_alm.rst deleted file mode 100644 index afadfc13e..000000000 --- a/docs/source/cmd/index_techlibs_intel_alm.rst +++ /dev/null @@ -1,5 +0,0 @@ -Intel ALM (Cyclone V, Arria V, Cyclone 10 GX) ---------------------------------------------- - -.. autocmdgroup:: techlibs/intel_alm - :members: diff --git a/docs/source/cmd/index_techlibs_lattice.rst b/docs/source/cmd/index_techlibs_lattice.rst deleted file mode 100644 index 985bf0bbd..000000000 --- a/docs/source/cmd/index_techlibs_lattice.rst +++ /dev/null @@ -1,5 +0,0 @@ -Lattice ------------------- - -.. autocmdgroup:: techlibs/lattice - :members: diff --git a/docs/source/cmd/index_techlibs_lattice_nexus.rst b/docs/source/cmd/index_techlibs_lattice_nexus.rst deleted file mode 100644 index d5ac4184c..000000000 --- a/docs/source/cmd/index_techlibs_lattice_nexus.rst +++ /dev/null @@ -1,5 +0,0 @@ -Lattice Nexus ------------------- - -.. autocmdgroup:: techlibs/nexus - :members: diff --git a/docs/source/cmd/index_techlibs_microchip.rst b/docs/source/cmd/index_techlibs_microchip.rst deleted file mode 100644 index 06613a59c..000000000 --- a/docs/source/cmd/index_techlibs_microchip.rst +++ /dev/null @@ -1,5 +0,0 @@ -Microchip ------------------- - -.. autocmdgroup:: techlibs/microchip - :members: diff --git a/docs/source/cmd/index_techlibs_microchip_sf2.rst b/docs/source/cmd/index_techlibs_microchip_sf2.rst deleted file mode 100644 index 4ebe47f33..000000000 --- a/docs/source/cmd/index_techlibs_microchip_sf2.rst +++ /dev/null @@ -1,5 +0,0 @@ -Microchip - SmartFusion2/IGLOO2 ------------------------------------ - -.. autocmdgroup:: techlibs/sf2 - :members: diff --git a/docs/source/cmd/index_techlibs_nanoxplore.rst b/docs/source/cmd/index_techlibs_nanoxplore.rst deleted file mode 100644 index 9eff4681c..000000000 --- a/docs/source/cmd/index_techlibs_nanoxplore.rst +++ /dev/null @@ -1,5 +0,0 @@ -NanoXplore ------------------- - -.. autocmdgroup:: techlibs/nanoxplore - :members: diff --git a/docs/source/cmd/index_techlibs_quicklogic.rst b/docs/source/cmd/index_techlibs_quicklogic.rst deleted file mode 100644 index 54d199eb0..000000000 --- a/docs/source/cmd/index_techlibs_quicklogic.rst +++ /dev/null @@ -1,5 +0,0 @@ -QuickLogic ------------------- - -.. autocmdgroup:: techlibs/quicklogic - :members: diff --git a/docs/source/cmd/index_techlibs_xilinx.rst b/docs/source/cmd/index_techlibs_xilinx.rst deleted file mode 100644 index df5112b7e..000000000 --- a/docs/source/cmd/index_techlibs_xilinx.rst +++ /dev/null @@ -1,5 +0,0 @@ -Xilinx ------------------- - -.. autocmdgroup:: techlibs/xilinx - :members: diff --git a/docs/source/cmd_ref.rst b/docs/source/cmd_ref.rst index 668516a0b..acf2d1d41 100644 --- a/docs/source/cmd_ref.rst +++ b/docs/source/cmd_ref.rst @@ -1,3 +1,5 @@ +.. _cmd_ref: + ================================================================================ Command line reference ================================================================================ @@ -5,31 +7,10 @@ Command line reference .. literalinclude:: /generated/yosys :start-at: Usage -.. _cmd_ref: - -Command reference ------------------ - -.. todo:: Can we warn on command groups that aren't included anywhere? - -:ref:`List of all commands` - .. toctree:: - :maxdepth: 2 + :caption: Command reference + :maxdepth: 1 + :glob: - /appendix/env_vars - /cmd/index_frontends - /cmd/index_backends - /cmd/index_kernel - /cmd/index_formal - -.. toctree:: - :maxdepth: 3 - - /cmd/index_passes - /cmd/index_techlibs - -.. toctree:: - :maxdepth: 2 - - /cmd/index_internal + /appendix/env_vars + /cmd/* diff --git a/docs/source/code_examples/macro_commands/prep.ys b/docs/source/code_examples/macro_commands/prep.ys deleted file mode 100644 index 1bec907f6..000000000 --- a/docs/source/code_examples/macro_commands/prep.ys +++ /dev/null @@ -1,23 +0,0 @@ -#start:The following commands are executed by this synthesis command: -#end:$ -begin: - hierarchy -check [-top | -auto-top] - -coarse: - proc [-ifx] - flatten (if -flatten) - future - opt_expr -keepdc - opt_clean - check - opt -noff -keepdc - wreduce -keepdc [-memx] - memory_dff (if -rdff) - memory_memx (if -memx) - opt_clean - memory_collect - opt -noff -keepdc -fast - -check: - stat - check diff --git a/docs/source/conf.py b/docs/source/conf.py index 725ac42bb..05dcb7d5f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -43,12 +43,8 @@ html_static_path = ['_static', "_images"] # default to no highlight highlight_language = 'none' -# default single quotes to attempt auto reference, or fallback to yoscrypt +# default single quotes to attempt auto reference, or fallback to code default_role = 'autoref' -rst_prolog = """ -.. role:: yoscrypt(code) - :language: yoscrypt -""" extensions = ['sphinx.ext.autosectionlabel', 'sphinxcontrib.bibtex'] @@ -110,14 +106,12 @@ latex_elements = { # custom cmd-ref parsing/linking sys.path += [os.path.dirname(__file__) + "/../"] -extensions.append('util.custom_directives') +extensions.append('util.cmdref') # use autodocs extensions.append('sphinx.ext.autodoc') -extensions.append('util.cell_documenter') +extensions.append('util.cellref') cells_json = Path(__file__).parent / 'generated' / 'cells.json' -extensions.append('util.cmd_documenter') -cmds_json = Path(__file__).parent / 'generated' / 'cmds.json' from sphinx.application import Sphinx def setup(app: Sphinx) -> None: diff --git a/docs/source/getting_started/example_synth.rst b/docs/source/getting_started/example_synth.rst index ccf0d252b..e215586cc 100644 --- a/docs/source/getting_started/example_synth.rst +++ b/docs/source/getting_started/example_synth.rst @@ -70,7 +70,7 @@ At the bottom of the `help` output for `synth_ice40` is the complete list of commands called by this script. Let's start with the section labeled ``begin``: -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: begin: :end-before: flatten: @@ -143,8 +143,8 @@ line refers to the line numbers of the start/end of the corresponding ``always @`` block. In the case of an ``initial`` block, we instead see the ``PROC`` referring to line 0. -To handle these, let us now introduce the next command: :cmd:title:`proc`. -`proc` is a macro command like `synth_ice40`. Rather than modifying the design +To handle these, let us now introduce the next command: :doc:`/cmd/proc`. `proc` +is a macro command like `synth_ice40`. Rather than modifying the design directly, it instead calls a series of other commands. In the case of `proc`, these sub-commands work to convert the behavioral logic of processes into multiplexers and registers. Let's see what happens when we run it. For now, we @@ -188,7 +188,7 @@ opt_expr `. .. note:: - :cmd:title:`clean` can also be called with two semicolons after any command, + :doc:`/cmd/clean` can also be called with two semicolons after any command, for example we could have called :yoscrypt:`opt_expr;;` instead of :yoscrypt:`opt_expr; clean`. You may notice some scripts will end each line with ``;;``. It is beneficial to run `clean` before inspecting intermediate @@ -215,8 +215,8 @@ Note that if we tried to run this command now then we would get an error. This is because we already removed all of the modules other than ``addr_gen``. We could restart our shell session, but instead let's use two new commands: -- :cmd:title:`design`, and -- :cmd:title:`read_verilog`. +- :doc:`/cmd/design`, and +- :doc:`/cmd/read_verilog`. .. literalinclude:: /code_examples/fifo/fifo.out :language: doscon @@ -251,7 +251,7 @@ our design won't run into this issue, we can skip the ``-defer``. We can also run `proc` now to finish off the full :ref:`synth_begin`. Because the design schematic is quite large, we will be showing just the data path for the ``rdata`` output. If you would like to see the entire design for yourself, -you can do so with :cmd:title:`show`. Note that the `show` command only works +you can do so with :doc:`/cmd/show`. Note that the `show` command only works with a single module, so you may need to call it with :yoscrypt:`show fifo`. :ref:`show_intro` section in :doc:`/getting_started/scripting_intro` has more on how to use `show`. @@ -283,7 +283,7 @@ Flattening At this stage of a synthesis flow there are a few other commands we could run. In `synth_ice40` we get these: -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: flatten: :end-before: coarse: @@ -355,7 +355,7 @@ Part 1 In the iCE40 flow, we start with the following commands: -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: coarse: :end-before: wreduce @@ -371,7 +371,7 @@ wasting time on something we know is impossible. Next up is :yoscrypt:`opt -nodffe -nosdff` performing a set of simple optimizations on the design. This command also ensures that only a specific subset of FF types are included, in preparation for the next command: -:cmd:title:`fsm`. Both `opt` and `fsm` are macro commands which are explored in +:doc:`/cmd/fsm`. Both `opt` and `fsm` are macro commands which are explored in more detail in :doc:`/using_yosys/synthesis/opt` and :doc:`/using_yosys/synthesis/fsm` respectively. @@ -403,7 +403,7 @@ Part 2 The next group of commands performs a series of optimizations: -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-at: wreduce :end-before: t:$mul @@ -411,7 +411,7 @@ The next group of commands performs a series of optimizations: :caption: ``coarse`` section (part 2) :name: synth_coarse2 -First up is :cmd:title:`wreduce`. If we run this we get the following: +First up is :doc:`/cmd/wreduce`. If we run this we get the following: .. literalinclude:: /code_examples/fifo/fifo.out :language: doscon @@ -432,7 +432,7 @@ the schematic and see the output of that cell has now changed. ``rdata`` output after `wreduce` -The next two (new) commands are :cmd:title:`peepopt` and :cmd:title:`share`. +The next two (new) commands are :doc:`/cmd/peepopt` and :doc:`/cmd/share`. Neither of these affect our design, and they're explored in more detail in :doc:`/using_yosys/synthesis/opt`, so let's skip over them. :yoscrypt:`techmap -map +/cmp2lut.v -D LUT_WIDTH=4` optimizes certain comparison operators by @@ -440,7 +440,7 @@ converting them to LUTs instead. The usage of `techmap` is explored more in :doc:`/using_yosys/synthesis/techmap_synth`. Our next command to run is -:cmd:title:`memory_dff`. +:doc:`/cmd/memory_dff`. .. literalinclude:: /code_examples/fifo/fifo.out :language: doscon @@ -475,7 +475,7 @@ will only be performed if called with the ``-dsp`` flag: :yoscrypt:`synth_ice40 -dsp`. While our example has nothing that could be mapped to DSPs we can still take a quick look at the commands here and describe what they do. -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-at: t:$mul :end-before: alumacc @@ -514,7 +514,7 @@ Part 4 That brings us to the fourth and final part for the iCE40 synthesis flow: -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-at: alumacc :end-before: map_ram: @@ -543,7 +543,7 @@ Once these cells have been inserted, the call to `opt` can combine cells which are now identical but may have been missed due to e.g. the difference between `$add` and `$sub`. -The other new command in this part is :cmd:title:`memory`. `memory` is another +The other new command in this part is :doc:`/cmd/memory`. `memory` is another macro command which we examine in more detail in :doc:`/using_yosys/synthesis/memory`. For this document, let us focus just on the step most relevant to our example: `memory_collect`. Up until this point, @@ -594,7 +594,7 @@ Memory blocks Mapping to hard memory blocks uses a combination of `memory_libmap` and `techmap`. -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: map_ram: :end-before: map_ffram: @@ -636,7 +636,7 @@ into flip flops (the ``logic fallback``) with `memory_map`. .. |techlibs/ice40/brams_map.v| replace:: :file:`techlibs/ice40/brams_map.v` .. _techlibs/ice40/brams_map.v: https://github.com/YosysHQ/yosys/tree/main/techlibs/ice40/brams_map.v -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: map_ffram: :end-before: map_gates: @@ -671,7 +671,7 @@ an explosion in cells as multi-bit `$mux` and `$adffe` are replaced with single-bit `$_MUX_` and `$_DFFE_PP0P_` cells, while the `$alu` is replaced with primitive `$_OR_` and `$_NOT_` gates and a `$lut` cell. -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: map_gates: :end-before: map_ffs: @@ -700,7 +700,7 @@ mapped to hardware into gate-level primitives. This includes optimizing `$_MUX_` cells where one of the inputs is a constant ``1'0``, replacing it instead with an `$_AND_` cell. -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: map_ffs: :end-before: map_luts: @@ -725,7 +725,7 @@ LUTs `abc`. For more on what these do, and what the difference between these two commands are, refer to :doc:`/using_yosys/synthesis/abc`. -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: map_luts: :end-before: map_cells: @@ -742,7 +742,7 @@ commands are, refer to :doc:`/using_yosys/synthesis/abc`. Finally we use `techmap` to map the generic `$lut` cells to iCE40 ``SB_LUT4`` cells. -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: map_cells: :end-before: check: @@ -784,18 +784,19 @@ Final steps The next section of the iCE40 synth flow performs some sanity checking and final tidy up: -.. literalinclude:: /code_examples/macro_commands/synth_ice40.ys +.. literalinclude:: /cmd/synth_ice40.rst :language: yoscrypt :start-after: check: + :end-before: blif: :dedent: :name: check :caption: ``check`` section The new commands here are: -- :cmd:title:`autoname`, -- :cmd:title:`stat`, and -- :cmd:title:`blackbox`. +- :doc:`/cmd/autoname`, +- :doc:`/cmd/stat`, and +- :doc:`/cmd/blackbox`. The output from `stat` is useful for checking resource utilization; providing a list of cells used in the design and the number of each, as well as the number @@ -834,9 +835,9 @@ Synthesis output The iCE40 synthesis flow has the following output modes available: -- `write_blif`, -- `write_edif`, and -- `write_json`. +- :doc:`/cmd/write_blif`, +- :doc:`/cmd/write_edif`, and +- :doc:`/cmd/write_json`. As an example, if we called :yoscrypt:`synth_ice40 -top fifo -json fifo.json`, our synthesized ``fifo`` design will be output as :file:`fifo.json`. We can @@ -847,4 +848,4 @@ is beyond the scope of this documentation. .. _nextpnr: https://github.com/YosysHQ/nextpnr -.. seealso:: :cmd:title:`synth_ice40` +.. seealso:: :doc:`/cmd/synth_ice40` diff --git a/docs/source/getting_started/scripting_intro.rst b/docs/source/getting_started/scripting_intro.rst index b9e2d395a..01954c661 100644 --- a/docs/source/getting_started/scripting_intro.rst +++ b/docs/source/getting_started/scripting_intro.rst @@ -122,7 +122,7 @@ module. Detailed documentation of the select framework can be found under :doc:`/using_yosys/more_scripting/selections` or in the command reference at -:cmd:title:`select`. +:doc:`/cmd/select`. .. _show_intro: @@ -219,7 +219,7 @@ those used in options, must be a single expression instead. .. _GraphViz color docs: https://graphviz.org/doc/info/colors For all of the options available to `show`, check the command reference at -:cmd:title:`show`. +:doc:`/cmd/show`. .. seealso:: :ref:`interactive_show` on the :doc:`/using_yosys/more_scripting/interactive_investigation` page. diff --git a/docs/source/index.rst b/docs/source/index.rst index 403100093..61dc114ef 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -5,7 +5,7 @@ Yosys Open SYnthesis Suite Yosys is an open source framework for RTL synthesis. To learn more about Yosys, see :doc:`/introduction`. For a quick guide on how to get started using Yosys, check out :doc:`/getting_started/index`. For the complete list of commands -available, go to :ref:`cmd_ref`. +available, go to :ref:`commandindex`. .. todo:: look into command ref improvements diff --git a/docs/source/using_yosys/more_scripting/interactive_investigation.rst b/docs/source/using_yosys/more_scripting/interactive_investigation.rst index 5da8c04d4..e9c9bc9ac 100644 --- a/docs/source/using_yosys/more_scripting/interactive_investigation.rst +++ b/docs/source/using_yosys/more_scripting/interactive_investigation.rst @@ -323,10 +323,10 @@ tools). design into an equivalent design that is easier to analyse. - Commands such as `eval` and `sat` can be used to investigate the behavior of the circuit. -- :cmd:title:`show`. -- :cmd:title:`dump`. -- :cmd:title:`add` and :cmd:title:`delete` can be used to modify and reorganize - a design dynamically. +- :doc:`/cmd/show`. +- :doc:`/cmd/dump`. +- :doc:`/cmd/add` and :doc:`/cmd/delete` can be used to modify and reorganize a + design dynamically. The code used is included in the Yosys code base under |code_examples/scrambler|_. @@ -358,7 +358,7 @@ reorganizing a module in Yosys and checking the resulting circuit. .. figure:: /_images/code_examples/scrambler/scrambler_p02.* :class: width-helper invert-helper -Analyzing the resulting circuit with :cmd:title:`eval`: +Analyzing the resulting circuit with :doc:`/cmd/eval`: .. todo:: replace inline code diff --git a/docs/source/using_yosys/more_scripting/load_design.rst b/docs/source/using_yosys/more_scripting/load_design.rst index d1e3e1cc0..bbc55a36b 100644 --- a/docs/source/using_yosys/more_scripting/load_design.rst +++ b/docs/source/using_yosys/more_scripting/load_design.rst @@ -1,11 +1,9 @@ Loading a design ~~~~~~~~~~~~~~~~ -.. TODO:: fill out this page better - keyword: Frontends -- :doc:`/cmd/index_frontends` +- :doc:`/cmd/read_verilog` .. todo:: include ``read_verilog < None: - self.name = name - self.title = title - self.content = [YosysCmdContentListing(**c) for c in content] - self.group = group - self.source_file = source_file - self.source_line = source_line - self.source_func = source_func - self.experimental_flag = experimental_flag - self.internal_flag = internal_flag - -class YosysCmdGroupDocumenter(Documenter): - objtype = 'cmdgroup' - priority = 10 - object: tuple[str, list[str]] - lib_key = 'groups' - - option_spec = Documenter.option_spec.copy() - option_spec.update({ - 'caption': autodoc.annotation_option, - 'members': autodoc.members_option, - 'source': autodoc.bool_option, - 'linenos': autodoc.bool_option, - }) - - __cmd_lib: dict[str, list[str] | dict[str]] | None = None - @property - def cmd_lib(self) -> dict[str, list[str] | dict[str]]: - if not self.__cmd_lib: - self.__cmd_lib = {} - cmds_obj: dict[str, dict[str, dict[str]]] - try: - with open(self.config.cmds_json, "r") as f: - cmds_obj = json.loads(f.read()) - except FileNotFoundError: - logger.warning( - f"unable to find cmd lib at {self.config.cmds_json}", - type = 'cmdref', - subtype = 'cmd_lib' - ) - cmds_obj = {} - for (name, obj) in cmds_obj.get(self.lib_key, {}).items(): - self.__cmd_lib[name] = obj - return self.__cmd_lib - - @classmethod - def can_document_member( - cls, - member: Any, - membername: str, - isattr: bool, - parent: Any - ) -> bool: - return False - - def parse_name(self) -> bool: - if not self.options.caption: - self.content_indent = '' - self.fullname = self.modname = self.name - return True - - def import_object(self, raiseerror: bool = False) -> bool: - # get cmd - try: - self.object = (self.modname, self.cmd_lib[self.modname]) - except KeyError: - if raiseerror: - raise - return False - - self.real_modname = self.modname - return True - - def get_sourcename(self) -> str: - return self.env.doc2path(self.env.docname) - - def format_name(self) -> str: - return self.options.caption or '' - - def format_signature(self, **kwargs: Any) -> str: - return self.modname - - def add_directive_header(self, sig: str) -> None: - pass - - def add_content(self, more_content: Any | None) -> None: - pass - - def filter_members( - self, - members: list[tuple[str, Any]], - want_all: bool - ) -> list[tuple[str, Any, bool]]: - return [(x[0], x[1], False) for x in members] - - def get_object_members( - self, - want_all: bool - ) -> tuple[bool, list[tuple[str, Any]]]: - ret: list[tuple[str, str]] = [] - - if want_all: - for member in self.object[1]: - ret.append((member, self.modname)) - else: - memberlist = self.options.members or [] - for name in memberlist: - if name in self.object: - ret.append((name, self.modname)) - else: - logger.warning(('unknown module mentioned in :members: option: ' - f'group {self.modname}, module {name}'), - type='cmdref') - - return False, ret - - def document_members(self, all_members: bool = False) -> None: - want_all = (all_members or - self.options.inherited_members or - self.options.members is autodoc.ALL) - # find out which members are documentable - members_check_module, members = self.get_object_members(want_all) - - # document non-skipped members - memberdocumenters: list[tuple[Documenter, bool]] = [] - for (mname, member, isattr) in self.filter_members(members, want_all): - classes = [cls for cls in self.documenters.values() - if cls.can_document_member(member, mname, isattr, self)] - if not classes: - # don't know how to document this member - continue - # prefer the documenter with the highest priority - classes.sort(key=lambda cls: cls.priority) - # give explicitly separated module name, so that members - # of inner classes can be documented - full_mname = self.format_signature() + '::' + mname - documenter = classes[-1](self.directive, full_mname, self.indent) - memberdocumenters.append((documenter, isattr)) - - member_order = self.options.member_order or self.config.autodoc_member_order - memberdocumenters = self.sort_members(memberdocumenters, member_order) - - for documenter, isattr in memberdocumenters: - documenter.generate( - all_members=True, real_modname=self.real_modname, - check_module=members_check_module and not isattr) - - def generate( - self, - more_content: Any | None = None, - real_modname: str | None = None, - check_module: bool = False, - all_members: bool = False - ) -> None: - if not self.parse_name(): - # need a cmd lib to import from - logger.warning( - f"don't know which cmd lib to import for autodocumenting {self.name}", - type = 'cmdref' - ) - return - - sourcename = self.get_sourcename() - - imported_object = self.import_object(); - if self.lib_key == 'groups' and self.name == 'unknown': - if imported_object: - logger.warning(f"Found commands assigned to group {self.name}: {[x[0] for x in self.object]}", type='cmdref') - else: - return - elif not imported_object: - log_msg = f"unable to load {self.name} with {type(self)}" - if self.lib_key == 'groups': - logger.info(log_msg, type = 'cmdref') - self.add_line(f'.. warning:: No commands found for group {self.name!r}', sourcename) - self.add_line('', sourcename) - self.add_line(' Documentation may have been built without ``source_location`` support.', sourcename) - self.add_line(' Try check :doc:`/cmd/index_other`.', sourcename) - else: - logger.warning(log_msg, type = 'cmdref') - return - - # check __module__ of object (for members not given explicitly) - # if check_module: - # if not self.check_module(): - # return - - self.add_line('', sourcename) - - # format the object's signature, if any - try: - sig = self.format_signature() - except Exception as exc: - logger.warning(('error while formatting signature for %s: %s'), - self.fullname, exc, type='cmdref') - return - - # generate the directive header and options, if applicable - self.add_directive_header(sig) - self.add_line('', sourcename) - - # e.g. the module directive doesn't have content - self.indent += self.content_indent - - # add all content (from docstrings, attribute docs etc.) - self.add_content(more_content) - - # document members, if possible - self.document_members(all_members) - -class YosysCmdDocumenter(YosysCmdGroupDocumenter): - objtype = 'cmd' - priority = 15 - object: YosysCmd - lib_key = 'cmds' - - @classmethod - def can_document_member( - cls, - member: Any, - membername: str, - isattr: bool, - parent: Any - ) -> bool: - if membername.startswith('$'): - return False - return isinstance(parent, YosysCmdGroupDocumenter) - - def parse_name(self) -> bool: - try: - matched = cmd_ext_sig_re.match(self.name) - group, modname, thing, attribute = matched.groups() - except AttributeError: - logger.warning(('invalid signature for auto%s (%r)') % (self.objtype, self.name), - type='cmdref') - return False - - self.modname = modname - self.groupname = group or '' - self.attribute = attribute or '' - self.fullname = ((self.modname) + (thing or '')) - - return True - - def import_object(self, raiseerror: bool = False) -> bool: - if super().import_object(raiseerror): - self.object = YosysCmd(self.modname, **self.object[1]) - return True - return False - - def get_sourcename(self) -> str: - try: - return self.object.source_file - except AttributeError: - return super().get_sourcename() - - def format_name(self) -> str: - return self.object.name - - def format_signature(self, **kwargs: Any) -> str: - return self.fullname + self.attribute - - def add_directive_header(self, sig: str) -> None: - domain = getattr(self, 'domain', self.objtype) - directive = getattr(self, 'directivetype', 'def') - source_name = self.object.source_file - source_line = self.object.source_line - - title = f'{self.object.name} - {self.object.title}' - self.add_line(title, source_name, source_line) - self.add_line('#' * len(title), source_name, source_line) - - # cmd definition - self.add_line(f'.. {domain}:{directive}:: {sig}', source_name, source_line) - if self.object.title: - self.add_line(f' :title: {self.object.title}', source_name, source_line) - - if self.options.noindex: - self.add_line(' :noindex:', source_name) - - def add_content(self, more_content: Any | None) -> None: - # set sourcename and add content from attribute documentation - domain = getattr(self, 'domain', self.objtype) - source_name = self.object.source_file - source_line = self.object.source_line - - if self.object.experimental_flag: - self.add_line(f'.. warning:: This command is experimental', source_name, source_line) - self.add_line('\n', source_name) - - if self.object.internal_flag: - self.add_line(f'.. warning:: This command is intended for internal developer use only', source_name, source_line) - self.add_line('\n', source_name) - - def render(content_list: YosysCmdContentListing, indent: int=0): - content_source = content_list.source_file or source_name - indent_str = ' '*indent - if content_list.type == 'usage': - if content_list.body: - self.add_line(f'{indent_str}.. {domain}:{content_list.type}:: {self.name}::{content_list.body}', content_source) - else: - self.add_line(f'{indent_str}.. {domain}:{content_list.type}:: {self.name}::', content_source) - self.add_line(f'{indent_str} :noindex:', source_name) - self.add_line('', source_name) - elif content_list.type == 'option': - self.add_line(f'{indent_str}:{content_list.type} {content_list.body}:', content_source) - elif content_list.type == 'text': - self.add_line(f'{indent_str}{content_list.body}', content_source) - self.add_line('', source_name) - elif content_list.type == 'code': - language_str = content_list.options.get('language', '') - self.add_line(f'{indent_str}.. code-block:: {language_str}', source_name) - self.add_line('', source_name) - for body_line in content_list.body.splitlines(): - self.add_line(f'{indent_str} {body_line}', content_source) - self.add_line('', source_name) - else: - logger.warning(f"unknown content type '{content_list.type}'") - for content in content_list.content: - render(content, indent+1) - - for content in self.object.content: - render(content) - - if self.get_sourcename() != 'unknown': - self.add_line('\n', source_name) - self.add_line(f'.. note:: Help text automatically generated from :file:`{source_name}:{source_line}`', source_name) - - # add additional content (e.g. from document), if present - if more_content: - for line, src in zip(more_content.data, more_content.items): - self.add_line(line, src[0], src[1]) - - def get_object_members( - self, - want_all: bool - ) -> tuple[bool, list[tuple[str, Any]]]: - - return False, [] - -class YosysCmdRstDocumenter(YosysCmdDocumenter): - objtype = 'cmd_rst' - priority = 0 - - @classmethod - def can_document_member(cls, *args) -> bool: - return False - - def add_directive_header(self, sig): - source_name = self.object.source_file - cmd = self.object.name - self.add_line(f'.. code-block:: rst', source_name) - self.add_line(f' :caption: Generated rst for ``.. autocmd:: {cmd}``', source_name) - - def add_content(self, more_content): - source_name = self.object.source_file - cmd = self.object.name - self.domain = 'cmd' - super().add_directive_header(cmd) - self.add_line('', source_name) - self.indent += self.content_indent - super().add_content(more_content) - -def setup(app: Sphinx) -> dict[str, Any]: - app.add_config_value('cmds_json', False, 'html', [Path, PosixPath, WindowsPath]) - app.setup_extension('sphinx.ext.autodoc') - app.add_autodocumenter(YosysCmdGroupDocumenter) - app.add_autodocumenter(YosysCmdDocumenter) - app.add_autodocumenter(YosysCmdRstDocumenter) - return { - 'version': '2', - 'parallel_read_safe': True, - } diff --git a/docs/util/custom_directives.py b/docs/util/cmdref.py similarity index 81% rename from docs/util/custom_directives.py rename to docs/util/cmdref.py index b90584aa7..a31b08e0d 100644 --- a/docs/util/custom_directives.py +++ b/docs/util/cmdref.py @@ -4,21 +4,20 @@ from __future__ import annotations import re from typing import cast -import warnings from docutils import nodes -from docutils.nodes import Node, Element, Text +from docutils.nodes import Node, Element, system_message from docutils.parsers.rst import directives from docutils.parsers.rst.states import Inliner from sphinx.application import Sphinx from sphinx.domains import Domain, Index from sphinx.domains.std import StandardDomain from sphinx.environment import BuildEnvironment -from sphinx.roles import XRefRole, SphinxRole +from sphinx.roles import XRefRole from sphinx.directives import ObjectDescription from sphinx.directives.code import container_wrapper from sphinx.util.nodes import make_refnode -from sphinx.util.docfields import Field, GroupedField +from sphinx.util.docfields import Field from sphinx import addnodes class TocNode(ObjectDescription): @@ -32,7 +31,7 @@ class TocNode(ObjectDescription): signode['ids'].append(idx) def _object_hierarchy_parts(self, sig_node: addnodes.desc_signature) -> tuple[str, ...]: - if 'tocname' not in sig_node: + if 'fullname' not in sig_node: return () modname = sig_node.get('module') @@ -58,56 +57,16 @@ class TocNode(ObjectDescription): return '.'.join(parents + [name]) return '' -class NodeWithOptions(TocNode): - """A custom node with options.""" - - doc_field_types = [ - GroupedField('opts', label='Options', names=('option', 'options', 'opt', 'opts')), - ] - - def transform_content(self, contentnode: addnodes.desc_content) -> None: - """hack `:option -thing: desc` into a proper option list with yoscrypt highlighting""" - newchildren = [] - for node in contentnode: - newnode = node - if isinstance(node, nodes.field_list): - newnode = nodes.option_list() - for field in node: - is_option = False - option_list_item = nodes.option_list_item() - for child in field: - if isinstance(child, nodes.field_name): - option_group = nodes.option_group() - option_list_item += option_group - option = nodes.option() - option_group += option - name, text = child.rawsource.split(' ', 1) - is_option = name == 'option' - literal = nodes.literal(text=text) - literal['classes'] += ['code', 'highlight', 'yoscrypt'] - literal['language'] = 'yoscrypt' - option += literal - if not is_option: warnings.warn(f'unexpected option \'{name}\' in {field.source}') - elif isinstance(child, nodes.field_body): - description = nodes.description() - description += child.children - option_list_item += description - if is_option: - newnode += option_list_item - newchildren.append(newnode) - contentnode.children = newchildren - -class CommandNode(NodeWithOptions): +class CommandNode(TocNode): """A custom node that describes a command.""" name = 'cmd' required_arguments = 1 - option_spec = NodeWithOptions.option_spec.copy() - option_spec.update({ + option_spec = { 'title': directives.unchanged, 'tags': directives.unchanged - }) + } def handle_signature(self, sig, signode: addnodes.desc_signature): signode['fullname'] = sig @@ -134,46 +93,6 @@ class CommandNode(NodeWithOptions): idx, 0)) -class CommandUsageNode(NodeWithOptions): - """A custom node that describes command usages""" - - name = 'cmdusage' - - option_spec = NodeWithOptions.option_spec - option_spec.update({ - 'usage': directives.unchanged, - }) - - def handle_signature(self, sig: str, signode: addnodes.desc_signature): - parts = sig.split('::') - if len(parts) > 2: parts.pop(0) - use = parts[-1] - signode['fullname'] = '::'.join(parts) - usage = self.options.get('usage', use) - if usage: - signode['tocname'] = usage - signode += addnodes.desc_name(text=usage) - return signode['fullname'] - - def add_target_and_index( - self, - name: str, - sig: str, - signode: addnodes.desc_signature - ) -> None: - idx = ".".join(name.split("::")) - signode['ids'].append(idx) - if 'noindex' not in self.options: - tocname: str = signode.get('tocname', name) - objs = self.env.domaindata[self.domain]['objects'] - # (name, sig, typ, docname, anchor, prio) - objs.append((name, - tocname, - type(self).name, - self.env.docname, - idx, - 1)) - class PropNode(TocNode): name = 'prop' fieldname = 'props' @@ -474,7 +393,7 @@ class TagIndex(Index): lis.append(( dispname, 0, docname, anchor, - '', '', '' + docname, '', typ )) ret = [(k, v) for k, v in sorted(content.items())] @@ -513,19 +432,18 @@ class CommandIndex(Index): Qualifier and description are not rendered e.g. in LaTeX output. """ - content: dict[str, list[tuple]] = {} + content = {} items = ((name, dispname, typ, docname, anchor) for name, dispname, typ, docname, anchor, prio in self.domain.get_objects() if typ == self.name) items = sorted(items, key=lambda item: item[0]) for name, dispname, typ, docname, anchor in items: - title = self.domain.data['obj2title'].get(name) lis = content.setdefault(self.shortname, []) lis.append(( dispname, 0, docname, anchor, - '', '', title + '', '', typ )) ret = [(k, v) for k, v in sorted(content.items())] @@ -589,27 +507,16 @@ class PropIndex(TagIndex): return (ret, True) -class TitleRefRole(XRefRole): - """XRefRole used which has the cmd title as the displayed text.""" - pass - -class OptionRole(SphinxRole): - def run(self) -> tuple[list[Node], list]: - return self.inliner.interpreted(self.rawtext, self.text, 'yoscrypt', self.lineno) - class CommandDomain(Domain): name = 'cmd' label = 'Yosys commands' roles = { - 'ref': XRefRole(), - 'title': TitleRefRole(), - 'option': OptionRole(), + 'ref': XRefRole() } directives = { 'def': CommandNode, - 'usage': CommandUsageNode, } indices = { @@ -635,7 +542,7 @@ class CommandDomain(Domain): def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): - + match = [(docname, anchor, name) for name, sig, typ, docname, anchor, prio in self.get_objects() if sig == target] @@ -645,17 +552,9 @@ class CommandDomain(Domain): targ = match[0][1] qual_name = match[0][2] title = self.data['obj2title'].get(qual_name, targ) - - if typ == 'title': - # caller wants the title in the content of the node - cmd = contnode.astext() - contnode = Text(f'{cmd} - {title}') - return make_refnode(builder, fromdocname, todocname, - targ, contnode) - else: - # cmd title as hover text - return make_refnode(builder, fromdocname, todocname, - targ, contnode, title) + + return make_refnode(builder,fromdocname,todocname, + targ, contnode, title) else: print(f"Missing ref for {target} in {fromdocname} ") return None @@ -693,18 +592,10 @@ class CellDomain(CommandDomain): def autoref(name, rawtext: str, text: str, lineno, inliner: Inliner, options=None, content=None): - words = text.split(' ') - if len(words) == 2 and words[0] == "help": - IsLinkable = True - thing = words[1] - else: - IsLinkable = len(words) == 1 and words[0][0] != '-' - thing = words[0] - if IsLinkable: - role = 'cell:ref' if thing[0] == '$' else 'cmd:ref' - text = f'{text} <{thing}>' - else: - role = 'yoscrypt' + role = 'cell:ref' if text[0] == '$' else 'cmd:ref' + if text.startswith("help ") and text.count(' ') == 1: + _, cmd = text.split(' ', 1) + text = f'{text} <{cmd}>' return inliner.interpreted(rawtext, text, role, lineno) def setup(app: Sphinx): @@ -731,7 +622,4 @@ def setup(app: Sphinx): app.add_role('autoref', autoref) - return { - 'version': '0.3', - 'parallel_read_safe': False, - } + return {'version': '0.2'} diff --git a/kernel/json.h b/kernel/json.h index e8905c8e1..c9aa0e045 100644 --- a/kernel/json.h +++ b/kernel/json.h @@ -90,10 +90,10 @@ public: template void array(const T &&values) { - begin_array(); + begin_object(); for (auto &item : values) value(item); - end_array(); + end_object(); } }; diff --git a/kernel/log_help.cc b/kernel/log_help.cc deleted file mode 100644 index 45228b024..000000000 --- a/kernel/log_help.cc +++ /dev/null @@ -1,151 +0,0 @@ -/* - * yosys -- Yosys Open SYnthesis Suite - * - * Copyright (C) 2025 Krystine Dawn - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -#include "kernel/log_help.h" - -USING_YOSYS_NAMESPACE - -Json ContentListing::to_json() { - Json::object object; - object["type"] = type; - if (body.length()) object["body"] = body; - if (strcmp(source_file, "unknown") != 0) object["source_file"] = source_file; - if (source_line != 0) object["source_line"] = source_line; - object["options"] = Json(options); - Json::array content_array; - for (auto child : _content) content_array.push_back(child->to_json()); - object["content"] = content_array; - return object; -} - -void ContentListing::usage(const string &text, - const source_location location) -{ - log_assert(type.compare("root") == 0); - add_content("usage", text, location); -} - -void ContentListing::option(const string &text, const string &description, - const source_location location) -{ - auto option = open_option(text); - if (description.length()) - option->add_content("text", description, location); -} - -void ContentListing::codeblock(const string &code, const string &language, - const source_location location) -{ - add_content("code", code, location); - back()->set_option("language", language); -} - -void ContentListing::paragraph(const string &text, - const source_location location) -{ - add_content("text", text, location); -} - -ContentListing* ContentListing::open_usage(const string &text, - const source_location location) -{ - usage(text, location); - return back(); -} - -ContentListing* ContentListing::open_option(const string &text, - const source_location location) -{ - log_assert(type.compare("root") == 0 || type.compare("usage") == 0); - auto option = new ContentListing("option", text, location); - add_content(option); - return option; -} - -#define MAX_LINE_LEN 80 -void log_pass_str(const std::string &pass_str, std::string indent_str, bool leading_newline=false) { - if (pass_str.empty()) - return; - std::istringstream iss(pass_str); - if (leading_newline) - log("\n"); - for (std::string line; std::getline(iss, line);) { - log("%s", indent_str.c_str()); - auto curr_len = indent_str.length(); - std::istringstream lss(line); - for (std::string word; std::getline(lss, word, ' ');) { - while (word[0] == '`' && word.back() == '`') - word = word.substr(1, word.length()-2); - if (curr_len + word.length() >= MAX_LINE_LEN-1) { - curr_len = 0; - log("\n%s", indent_str.c_str()); - } - if (word.length()) { - log("%s ", word.c_str()); - curr_len += word.length() + 1; - } - } - log("\n"); - } -} -void log_pass_str(const std::string &pass_str, int indent=0, bool leading_newline=false) { - std::string indent_str(indent*4, ' '); - log_pass_str(pass_str, indent_str, leading_newline); -} - -PrettyHelp *current_help = nullptr; - -PrettyHelp::PrettyHelp() -{ - _prior = current_help; - _root_listing = ContentListing("root", ""); - - current_help = this; -} - -PrettyHelp::~PrettyHelp() -{ - current_help = _prior; -} - -PrettyHelp *PrettyHelp::get_current() -{ - if (current_help == nullptr) - new PrettyHelp(); - return current_help; -} - -void PrettyHelp::log_help() -{ - for (auto content : _root_listing.get_content()) { - if (content->type.compare("usage") == 0) { - log_pass_str(content->body, 1, true); - log("\n"); - } else if (content->type.compare("option") == 0) { - log_pass_str(content->body, 1); - for (auto text : content->get_content()) { - log_pass_str(text->body, 2); - log("\n"); - } - } else { - log_pass_str(content->body, 0); - log("\n"); - } - } -} diff --git a/kernel/log_help.h b/kernel/log_help.h deleted file mode 100644 index 0a40fc531..000000000 --- a/kernel/log_help.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * yosys -- Yosys Open SYnthesis Suite - * - * Copyright (C) 2025 Krystine Dawn - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - */ - -#ifndef LOG_HELP_H -#define LOG_HELP_H - -#include "kernel/yosys_common.h" -#include "kernel/json.h" - -YOSYS_NAMESPACE_BEGIN - -class ContentListing { - vector _content; -public: - string type; - string body; - const char* source_file; - int source_line; - std::map options; - - ContentListing( - string type = "root", string body = "", - const char* source_file = "unknown", int source_line = 0 - ) : type(type), body(body), source_file(source_file), source_line(source_line) { - _content = {}; - options = {}; - } - - ContentListing(string type, string body, source_location location) : - ContentListing(type, body, location.file_name(), location.line()) { } - - void add_content(ContentListing *new_content) { - _content.push_back(new_content); - } - - void add_content(string type, string body, source_location location) { - auto new_content = new ContentListing(type, body, location); - add_content(new_content); - } - - bool has_content() { return _content.size() != 0; } - const vector get_content() { - const vector content = _content; - return content; - } - ContentListing* back() { - return _content.back(); - } - - void set_option(string key, string val = "") { - options[key] = val; - } - - void usage( - const string &text, - const source_location location = source_location::current() - ); - void option( - const string &text, - const string &description = "", - const source_location location = source_location::current() - ); - void codeblock( - const string &code, - const string &language = "none", - const source_location location = source_location::current() - ); - void paragraph( - const string &text, - const source_location location = source_location::current() - ); - - ContentListing* open_usage( - const string &text, - const source_location location = source_location::current() - ); - ContentListing* open_option( - const string &text, - const source_location location = source_location::current() - ); - - Json to_json(); -}; - -class PrettyHelp -{ -public: - string group = "unknown"; - -private: - PrettyHelp *_prior; - ContentListing _root_listing; - -public: - PrettyHelp(); - ~PrettyHelp(); - - static PrettyHelp *get_current(); - - bool has_content() { return _root_listing.has_content(); } - const vector get_content() { - return _root_listing.get_content(); - } - ContentListing* get_root() { - return &_root_listing; - } - - void set_group(const string g) { group = g; } - bool has_group() { return group.compare("unknown") != 0; } - - void log_help(); -}; - -YOSYS_NAMESPACE_END - -#endif diff --git a/kernel/register.cc b/kernel/register.cc index ea2a2624f..af1823b5b 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -21,7 +21,6 @@ #include "kernel/satgen.h" #include "kernel/json.h" #include "kernel/gzip.h" -#include "kernel/log_help.h" #include #include @@ -42,8 +41,7 @@ std::map backend_register; std::vector Frontend::next_args; -Pass::Pass(std::string name, std::string short_help, source_location location) : - pass_name(name), short_help(short_help), location(location) +Pass::Pass(std::string name, std::string short_help) : pass_name(name), short_help(short_help) { next_queued_pass = first_queued_pass; first_queued_pass = this; @@ -118,19 +116,9 @@ void Pass::post_execute(Pass::pre_post_exec_state_t state) void Pass::help() { - auto prettyHelp = PrettyHelp(); - if (formatted_help()) { - prettyHelp.log_help(); - } else { - log("\n"); - log("No help message for command `%s'.\n", pass_name.c_str()); - log("\n"); - } -} - -bool Pass::formatted_help() -{ - return false; + log("\n"); + log("No help message for command `%s'.\n", pass_name.c_str()); + log("\n"); } void Pass::clear_flags() @@ -393,8 +381,8 @@ void ScriptPass::help_script() script(); } -Frontend::Frontend(std::string name, std::string short_help, source_location location) : - Pass(name.rfind("=", 0) == 0 ? name.substr(1) : "read_" + name, short_help, location), +Frontend::Frontend(std::string name, std::string short_help) : + Pass(name.rfind("=", 0) == 0 ? name.substr(1) : "read_" + name, short_help), frontend_name(name.rfind("=", 0) == 0 ? name.substr(1) : name) { } @@ -539,8 +527,8 @@ void Frontend::frontend_call(RTLIL::Design *design, std::istream *f, std::string } } -Backend::Backend(std::string name, std::string short_help, source_location location) : - Pass(name.rfind("=", 0) == 0 ? name.substr(1) : "write_" + name, short_help, location), +Backend::Backend(std::string name, std::string short_help) : + Pass(name.rfind("=", 0) == 0 ? name.substr(1) : "write_" + name, short_help), backend_name(name.rfind("=", 0) == 0 ? name.substr(1) : name) { } @@ -693,23 +681,6 @@ static string get_cell_name(string name) { return is_code_getter(name) ? name.substr(0, name.length()-1) : name; } -static void log_warning_flags(Pass *pass) { - bool has_warnings = false; - const string name = pass->pass_name; - if (pass->experimental_flag) { - if (!has_warnings) log("\n"); - has_warnings = true; - log("WARNING: THE '%s' COMMAND IS EXPERIMENTAL.\n", name.c_str()); - } - if (pass->internal_flag) { - if (!has_warnings) log("\n"); - has_warnings = true; - log("WARNING: THE '%s' COMMAND IS INTENDED FOR INTERNAL DEVELOPER USE ONLY.\n", name.c_str()); - } - if (has_warnings) - log("\n"); -} - static struct CellHelpMessages { dict cell_help; CellHelpMessages() { @@ -735,211 +706,155 @@ struct HelpPass : public Pass { log(" help + .... print verilog code for given cell type\n"); log("\n"); } - bool dump_cmds_json(PrettyJson &json) { - // init json - json.begin_object(); - json.entry("version", "Yosys command reference"); - json.entry("generator", yosys_version_str); + void write_cmd_rst(std::string cmd, std::string title, std::string text) + { + FILE *f = fopen(stringf("docs/source/cmd/%s.rst", cmd.c_str()).c_str(), "wt"); + // make header + size_t char_len = cmd.length() + 3 + title.length(); + std::string title_line = "\n"; + title_line.insert(0, char_len, '='); + fprintf(f, "%s", title_line.c_str()); + fprintf(f, "%s - %s\n", cmd.c_str(), title.c_str()); + fprintf(f, "%s\n", title_line.c_str()); - bool raise_error = false; - std::map> groups; - - json.name("cmds"); json.begin_object(); - // iterate over commands - for (auto &it : pass_register) { - auto name = it.first; - auto pass = it.second; - auto title = pass->short_help; - - auto cmd_help = PrettyHelp(); - auto has_pretty_help = pass->formatted_help(); - - if (!has_pretty_help) { - enum PassUsageState { - PUState_none, - PUState_signature, - PUState_options, - PUState_optionbody, - }; - - source_location null_source; - string current_buffer = ""; - auto root_listing = cmd_help.get_root(); - auto current_listing = root_listing; - - // dump command help - std::ostringstream buf; - log_streams.push_back(&buf); - pass->help(); - log_streams.pop_back(); - std::stringstream ss; - ss << buf.str(); - - // parse command help - size_t def_strip_count = 0; - auto current_state = PUState_none; - auto catch_verific = false; - auto blank_lines = 2; - for (string line; std::getline(ss, line, '\n');) { - // find position of first non space character - std::size_t first_pos = line.find_first_not_of(" \t"); - std::size_t last_pos = line.find_last_not_of(" \t"); - if (first_pos == std::string::npos) { - switch (current_state) - { - case PUState_signature: - root_listing->usage(current_buffer, null_source); - current_listing = root_listing; - current_state = PUState_none; - current_buffer = ""; - break; - case PUState_none: - case PUState_optionbody: - blank_lines += 1; - break; - default: - break; - } - // skip empty lines - continue; - } - - // strip leading and trailing whitespace - std::string stripped_line = line.substr(first_pos, last_pos - first_pos +1); - bool IsDefinition = stripped_line[0] == '-'; - IsDefinition &= stripped_line[1] != ' ' && stripped_line[1] != '>'; - bool IsDedent = def_strip_count && first_pos < def_strip_count; - bool IsIndent = def_strip_count < first_pos; - - // line looks like a signature - bool IsSignature = stripped_line.find(name) == 0 && (stripped_line.length() == name.length() || stripped_line.at(name.size()) == ' '); - - if (IsSignature && first_pos <= 4 && (blank_lines >= 2 || current_state == PUState_signature)) { - if (current_state == PUState_options || current_state == PUState_optionbody) { - current_listing->codeblock(current_buffer, "none", null_source); - current_buffer = ""; - } else if (current_state == PUState_signature) { - root_listing->usage(current_buffer, null_source); - current_buffer = ""; - } else if (current_state == PUState_none && !current_buffer.empty()) { - current_listing->codeblock(current_buffer, "none", null_source); - current_buffer = ""; - } - current_listing = root_listing; - current_state = PUState_signature; - def_strip_count = first_pos; - catch_verific = false; - } else if (IsDedent) { - def_strip_count = first_pos; - if (current_state == PUState_optionbody) { - if (!current_buffer.empty()) { - current_listing->codeblock(current_buffer, "none", null_source); - current_buffer = ""; - } - if (IsIndent) { - current_state = PUState_options; - current_listing = root_listing->back(); - } else { - current_state = PUState_none; - current_listing = root_listing; - } - } else { - current_state = PUState_none; - } - } - - if (IsDefinition && !catch_verific && current_state != PUState_signature) { - if (!current_buffer.empty()) { - current_listing->codeblock(current_buffer, "none", null_source); - current_buffer = ""; - } - current_state = PUState_options; - current_listing = root_listing->open_option(stripped_line, null_source); - def_strip_count = first_pos; - } else { - if (current_state == PUState_options) { - current_state = PUState_optionbody; - } - if (current_buffer.empty()) - current_buffer = stripped_line; - else if (current_state == PUState_signature && IsIndent) - current_buffer += stripped_line; - else if (current_state == PUState_none) { - current_buffer += (blank_lines > 0 ? "\n\n" : "\n") + line; - } else - current_buffer += (blank_lines > 0 ? "\n\n" : "\n") + stripped_line; - if (stripped_line.compare("Command file parser supports following commands in file:") == 0) - catch_verific = true; - } - blank_lines = 0; - } - - if (!current_buffer.empty()) { - if (current_buffer.size() > 64 && current_buffer.substr(0, 64).compare("The following commands are executed by this synthesis command:\n\n") == 0) { - current_listing->paragraph(current_buffer.substr(0, 62), null_source); - current_listing->codeblock(current_buffer.substr(64), "yoscrypt", null_source); - } else - current_listing->codeblock(current_buffer, "none", null_source); - current_buffer = ""; - } + // render html + fprintf(f, ".. cmd:def:: %s\n", cmd.c_str()); + fprintf(f, " :title: %s\n\n", title.c_str()); + fprintf(f, " .. only:: html\n\n"); + std::stringstream ss; + std::string textcp = text; + ss << text; + bool IsUsage = true; + int blank_count = 0; + size_t def_strip_count = 0; + bool WasDefinition = false; + for (std::string line; std::getline(ss, line, '\n');) { + // find position of first non space character + std::size_t first_pos = line.find_first_not_of(" \t"); + std::size_t last_pos = line.find_last_not_of(" \t"); + if (first_pos == std::string::npos) { + // skip formatting empty lines + if (!WasDefinition) + fputc('\n', f); + blank_count += 1; + continue; } - // attempt auto group - if (!cmd_help.has_group()) { - string source_file = pass->location.file_name(); - bool has_source = source_file.compare("unknown") != 0; - if (pass->internal_flag) - cmd_help.group = "internal"; - else if (source_file.find("backends/") == 0 || (!has_source && name.find("read_") == 0)) - cmd_help.group = "backends"; - else if (source_file.find("frontends/") == 0 || (!has_source && name.find("write_") == 0)) - cmd_help.group = "frontends"; - else if (has_source) { - auto last_slash = source_file.find_last_of('/'); - if (last_slash != string::npos) { - auto parent_path = source_file.substr(0, last_slash); - cmd_help.group = parent_path; - } + // strip leading and trailing whitespace + std::string stripped_line = line.substr(first_pos, last_pos - first_pos +1); + bool IsDefinition = stripped_line[0] == '-'; + IsDefinition &= stripped_line[1] != ' ' && stripped_line[1] != '>'; + bool IsDedent = def_strip_count && first_pos <= def_strip_count; + bool IsIndent = first_pos == 2 || first_pos == 4; + if (cmd.compare(0, 7, "verific") == 0) + // verific.cc has strange and different formatting from the rest + IsIndent = false; + + // another usage block + bool NewUsage = stripped_line.find(cmd) == 0; + + if (IsUsage) { + if (stripped_line.compare(0, 4, "See ") == 0) { + // description refers to another function + fprintf(f, "\n %s\n", stripped_line.c_str()); + } else { + // usage should be the first line of help output + fprintf(f, "\n .. code:: yoscrypt\n\n %s\n\n ", stripped_line.c_str()); + WasDefinition = true; } - // implicit !has_source - else if (name.find("equiv") == 0) - cmd_help.group = "passes/equiv"; - else if (name.find("fsm") == 0) - cmd_help.group = "passes/fsm"; - else if (name.find("memory") == 0) - cmd_help.group = "passes/memory"; - else if (name.find("opt") == 0) - cmd_help.group = "passes/opt"; - else if (name.find("proc") == 0) - cmd_help.group = "passes/proc"; + IsUsage = false; + } else if (IsIndent && NewUsage && (blank_count >= 2 || WasDefinition)) { + // another usage block + fprintf(f, "\n .. code:: yoscrypt\n\n %s\n\n ", stripped_line.c_str()); + WasDefinition = true; + def_strip_count = 0; + } else if (IsIndent && IsDefinition && (blank_count || WasDefinition)) { + // format definition term + fprintf(f, "\n\n .. code:: yoscrypt\n\n %s\n\n ", stripped_line.c_str()); + WasDefinition = true; + def_strip_count = first_pos; + } else { + if (IsDedent) { + fprintf(f, "\n\n ::\n"); + def_strip_count = first_pos; + } else if (WasDefinition) { + fprintf(f, "::\n"); + WasDefinition = false; + } + fprintf(f, "\n %s", line.substr(def_strip_count, std::string::npos).c_str()); } - if (groups.count(cmd_help.group) == 0) { - groups[cmd_help.group] = vector(); - } - groups[cmd_help.group].push_back(name); - - // write to json - json.name(name.c_str()); json.begin_object(); - json.entry("title", title); - json.name("content"); json.begin_array(); - for (auto content : cmd_help.get_content()) - json.value(content->to_json()); - json.end_array(); - json.entry("group", cmd_help.group); - json.entry("source_file", pass->location.file_name()); - json.entry("source_line", pass->location.line()); - json.entry("source_func", pass->location.function_name()); - json.entry("experimental_flag", pass->experimental_flag); - json.entry("internal_flag", pass->internal_flag); - json.end_object(); + blank_count = 0; } - json.end_object(); + fputc('\n', f); - json.entry("groups", groups); + // render latex + fprintf(f, ".. only:: latex\n\n"); + fprintf(f, " ::\n\n"); + std::stringstream ss2; + ss2 << textcp; + for (std::string line; std::getline(ss2, line, '\n');) { + fprintf(f, " %s\n", line.c_str()); + } + fclose(f); + } + void write_cell_rst(Yosys::SimHelper cell, Yosys::CellType ct) + { + // open + FILE *f = fopen(stringf("docs/source/cell/%s.rst", cell.filesafe_name().c_str()).c_str(), "wt"); - json.end_object(); - return raise_error; + // make header + string title_line; + if (cell.title.length()) + title_line = stringf("%s - %s", cell.name.c_str(), cell.title.c_str()); + else title_line = cell.name; + string underline = "\n"; + underline.insert(0, title_line.length(), '='); + fprintf(f, "%s\n", title_line.c_str()); + fprintf(f, "%s\n", underline.c_str()); + + // help text, with cell def for links + fprintf(f, ".. cell:def:: %s\n", cell.name.c_str()); + if (cell.title.length()) + fprintf(f, " :title: %s\n\n", cell.title.c_str()); + else + fprintf(f, " :title: %s\n\n", cell.name.c_str()); + std::stringstream ss; + ss << cell.desc; + for (std::string line; std::getline(ss, line, '\n');) { + fprintf(f, " %s\n", line.c_str()); + } + + // properties + fprintf(f, "\nProperties"); + fprintf(f, "\n----------\n\n"); + dict prop_dict = { + {"is_evaluable", ct.is_evaluable}, + {"is_combinatorial", ct.is_combinatorial}, + {"is_synthesizable", ct.is_synthesizable}, + }; + for (auto &it : prop_dict) { + fprintf(f, "- %s: %s\n", it.first.c_str(), it.second ? "true" : "false"); + } + + // source code + fprintf(f, "\nSimulation model (Verilog)"); + fprintf(f, "\n--------------------------\n\n"); + fprintf(f, ".. code-block:: verilog\n"); + fprintf(f, " :caption: %s\n\n", cell.source.c_str()); + std::stringstream ss2; + ss2 << cell.code; + for (std::string line; std::getline(ss2, line, '\n');) { + fprintf(f, " %s\n", line.c_str()); + } + + // footer + fprintf(f, "\n.. note::\n\n"); + fprintf(f, " This page was auto-generated from the output of\n"); + fprintf(f, " ``help %s``.\n", cell.name.c_str()); + + // close + fclose(f); } bool dump_cells_json(PrettyJson &json) { // init json @@ -1045,7 +960,11 @@ struct HelpPass : public Pass { log("="); log("\n"); it.second->help(); - log_warning_flags(it.second); + if (it.second->experimental_flag) { + log("\n"); + log("WARNING: THE '%s' COMMAND IS EXPERIMENTAL.\n", it.first.c_str()); + log("\n"); + } } } else if (args[1] == "-cells") { @@ -1059,9 +978,44 @@ struct HelpPass : public Pass { log("\n"); return; } + // this option is undocumented as it is for internal use only + else if (args[1] == "-write-rst-command-reference-manual") { + for (auto &it : pass_register) { + std::ostringstream buf; + log_streams.push_back(&buf); + it.second->help(); + if (it.second->experimental_flag) { + log("\n"); + log("WARNING: THE '%s' COMMAND IS EXPERIMENTAL.\n", it.first.c_str()); + log("\n"); + } + log_streams.pop_back(); + write_cmd_rst(it.first, it.second->short_help, buf.str()); + } + } + // this option is also undocumented as it is for internal use only + else if (args[1] == "-write-rst-cells-manual") { + bool raise_error = false; + for (auto &it : yosys_celltypes.cell_types) { + auto name = it.first.str(); + if (cell_help_messages.contains(name)) { + write_cell_rst(cell_help_messages.get(name), it.second); + } else { + log("ERROR: Missing cell help for cell '%s'.\n", name.c_str()); + raise_error |= true; + } + } + if (raise_error) { + log_error("One or more cells defined in celltypes.h are missing help documentation.\n"); + } + } else if (pass_register.count(args[1])) { pass_register.at(args[1])->help(); - log_warning_flags(pass_register.at(args[1])); + if (pass_register.at(args[1])->experimental_flag) { + log("\n"); + log("WARNING: THE '%s' COMMAND IS EXPERIMENTAL.\n", args[1].c_str()); + log("\n"); + } } else if (cell_help_messages.contains(args[1])) { auto help_cell = cell_help_messages.get(args[1]); @@ -1090,17 +1044,7 @@ struct HelpPass : public Pass { log("No such command or cell type: %s\n", args[1].c_str()); return; } else if (args.size() == 3) { - // this option is undocumented as it is for internal use only - if (args[1] == "-dump-cmds-json") { - PrettyJson json; - if (!json.write_to_file(args[2])) - log_error("Can't open file `%s' for writing: %s\n", args[2].c_str(), strerror(errno)); - if (dump_cmds_json(json)) { - log_abort(); - } - } - // this option is undocumented as it is for internal use only - else if (args[1] == "-dump-cells-json") { + if (args[1] == "-dump-cells-json") { PrettyJson json; if (!json.write_to_file(args[2])) log_error("Can't open file `%s' for writing: %s\n", args[2].c_str(), strerror(errno)); @@ -1108,8 +1052,6 @@ struct HelpPass : public Pass { log_error("One or more cells defined in celltypes.h are missing help documentation.\n"); } } - else - log("Unknown help command: `%s %s'\n", args[1].c_str(), args[2].c_str()); return; } diff --git a/kernel/register.h b/kernel/register.h index e8c017c1d..f4e2127e1 100644 --- a/kernel/register.h +++ b/kernel/register.h @@ -23,62 +23,27 @@ #include "kernel/yosys_common.h" #include "kernel/yosys.h" -#include -#if __cpp_lib_source_location == 201907L - #include - using std::source_location; -#elif defined(__has_include) -# if __has_include() - #include - using std::experimental::source_location; -# else - #define SOURCE_FALLBACK -# endif -#else - #define SOURCE_FALLBACK -#endif - -#ifdef SOURCE_FALLBACK -struct source_location { // dummy placeholder - int line() const { return 0; } - int column() const { return 0; } - const char* file_name() const { return "unknown"; } - const char* function_name() const { return "unknown"; } - static const source_location current(...) { return source_location(); } -}; -#endif - YOSYS_NAMESPACE_BEGIN struct Pass { std::string pass_name, short_help; - source_location location; - Pass(std::string name, std::string short_help = "** document me **", - source_location location = source_location::current()); + Pass(std::string name, std::string short_help = "** document me **"); // Prefer overriding 'Pass::on_shutdown()' if possible virtual ~Pass(); - // Makes calls to log() to generate help message virtual void help(); - // Uses PrettyHelp::get_current() to produce a more portable formatted help message - virtual bool formatted_help(); virtual void clear_flags(); virtual void execute(std::vector args, RTLIL::Design *design) = 0; int call_counter; int64_t runtime_ns; bool experimental_flag = false; - bool internal_flag = false; void experimental() { experimental_flag = true; } - void internal() { - internal_flag = true; - } - struct pre_post_exec_state_t { Pass *parent_pass; int64_t begin_ns; @@ -116,8 +81,7 @@ struct ScriptPass : Pass RTLIL::Design *active_design; std::string active_run_from, active_run_to; - ScriptPass(std::string name, std::string short_help = "** document me **", source_location location = source_location::current()) : - Pass(name, short_help, location) { } + ScriptPass(std::string name, std::string short_help = "** document me **") : Pass(name, short_help) { } virtual void script() = 0; @@ -135,8 +99,7 @@ struct Frontend : Pass static std::string last_here_document; std::string frontend_name; - Frontend(std::string name, std::string short_help = "** document me **", - source_location location = source_location::current()); + Frontend(std::string name, std::string short_help = "** document me **"); void run_register() override; ~Frontend() override; void execute(std::vector args, RTLIL::Design *design) override final; @@ -152,8 +115,7 @@ struct Frontend : Pass struct Backend : Pass { std::string backend_name; - Backend(std::string name, std::string short_help = "** document me **", - source_location location = source_location::current()); + Backend(std::string name, std::string short_help = "** document me **"); void run_register() override; ~Backend() override; void execute(std::vector args, RTLIL::Design *design) override final; diff --git a/passes/cmds/check.cc b/passes/cmds/check.cc index 8bbcb8da0..83fe781a0 100644 --- a/passes/cmds/check.cc +++ b/passes/cmds/check.cc @@ -22,18 +22,12 @@ #include "kernel/celledges.h" #include "kernel/celltypes.h" #include "kernel/utils.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct CheckPass : public Pass { CheckPass() : Pass("check", "check for obvious problems in the design") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/chformal.cc b/passes/cmds/chformal.cc index ccda023c0..572ed2153 100644 --- a/passes/cmds/chformal.cc +++ b/passes/cmds/chformal.cc @@ -19,7 +19,6 @@ #include "kernel/yosys.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -71,62 +70,62 @@ static bool is_triggered_check_cell(RTLIL::Cell * cell) } struct ChformalPass : public Pass { - ChformalPass() : Pass("chformal", "change formal constraints of the design") {} - - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - - auto content_root = help->get_root(); - - content_root->usage("chformal [types] [mode] [options] [selection]"); - content_root->paragraph( - "Make changes to the formal constraints of the design. The [types] options " - "the type of constraint to operate on. If none of the following options are " - "given, the command will operate on all constraint types:" - ); - - content_root->option("-assert", "`$assert` cells, representing ``assert(...)`` constraints"); - content_root->option("-assume", "`$assume` cells, representing ``assume(...)`` constraints"); - content_root->option("-live", "`$live` cells, representing ``assert(s_eventually ...)``"); - content_root->option("-fair", "`$fair` cells, representing ``assume(s_eventually ...)``"); - content_root->option("-cover", "`$cover` cells, representing ``cover()`` statements"); - content_root->paragraph( - "Additionally chformal will operate on `$check` cells corresponding to the " - "selected constraint types." - ); - - content_root->paragraph("Exactly one of the following modes must be specified:"); - - content_root->option("-remove", "remove the cells and thus constraints from the design"); - content_root->option("-early", - "bypass FFs that only delay the activation of a constraint. When inputs " - "of the bypassed FFs do not remain stable between clock edges, this may " - "result in unexpected behavior." - ); - content_root->option("-delay ", "delay activation of the constraint by clock cycles"); - content_root->option("-skip ", "ignore activation of the constraint in the first clock cycles"); - auto cover_option = content_root->open_option("-coverenable"); - cover_option->paragraph( - "add cover statements for the enable signals of the constraints" - ); + ChformalPass() : Pass("chformal", "change formal constraints of the design") { } + void help() override + { + // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| + log("\n"); + log(" chformal [types] [mode] [options] [selection]\n"); + log("\n"); + log("Make changes to the formal constraints of the design. The [types] options\n"); + log("the type of constraint to operate on. If none of the following options are\n"); + log("given, the command will operate on all constraint types:\n"); + log("\n"); + log(" -assert $assert cells, representing assert(...) constraints\n"); + log(" -assume $assume cells, representing assume(...) constraints\n"); + log(" -live $live cells, representing assert(s_eventually ...)\n"); + log(" -fair $fair cells, representing assume(s_eventually ...)\n"); + log(" -cover $cover cells, representing cover() statements\n"); + log("\n"); + log(" Additionally chformal will operate on $check cells corresponding to the\n"); + log(" selected constraint types.\n"); + log("\n"); + log("Exactly one of the following modes must be specified:\n"); + log("\n"); + log(" -remove\n"); + log(" remove the cells and thus constraints from the design\n"); + log("\n"); + log(" -early\n"); + log(" bypass FFs that only delay the activation of a constraint. When inputs\n"); + log(" of the bypassed FFs do not remain stable between clock edges, this may\n"); + log(" result in unexpected behavior.\n"); + log("\n"); + log(" -delay \n"); + log(" delay activation of the constraint by clock cycles\n"); + log("\n"); + log(" -skip \n"); + log(" ignore activation of the constraint in the first clock cycles\n"); + log("\n"); + log(" -coverenable\n"); + log(" add cover statements for the enable signals of the constraints\n"); + log("\n"); #ifdef YOSYS_ENABLE_VERIFIC - cover_option->paragraph( - "Note: For the Verific frontend it is currently not guaranteed that a " - "reachable SVA statement corresponds to an active enable signal." - ); + log(" Note: For the Verific frontend it is currently not guaranteed that a\n"); + log(" reachable SVA statement corresponds to an active enable signal.\n"); + log("\n"); #endif - content_root->option("-assert2assume"); - content_root->option("-assert2cover"); - content_root->option("-assume2assert"); - content_root->option("-live2fair"); - content_root->option("-fair2live", "change the roles of cells as indicated. these options can be combined"); - content_root->option("-lower", - "convert each $check cell into an $assert, $assume, $live, $fair or " - "$cover cell. If the $check cell contains a message, also produce a " - "$print cell." - ); - return true; + log(" -assert2assume\n"); + log(" -assert2cover\n"); + log(" -assume2assert\n"); + log(" -live2fair\n"); + log(" -fair2live\n"); + log(" change the roles of cells as indicated. these options can be combined\n"); + log("\n"); + log(" -lower\n"); + log(" convert each $check cell into an $assert, $assume, $live, $fair or\n"); + log(" $cover cell. If the $check cell contains a message, also produce a\n"); + log(" $print cell.\n"); + log("\n"); } void execute(std::vector args, RTLIL::Design *design) override { diff --git a/passes/cmds/cover.cc b/passes/cmds/cover.cc index 47354f1d5..1db3e2ca0 100644 --- a/passes/cmds/cover.cc +++ b/passes/cmds/cover.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include #ifndef _WIN32 @@ -27,18 +26,15 @@ # include #endif +#include "kernel/register.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" + USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct CoverPass : public Pass { - CoverPass() : Pass("cover", "print code coverage counters") { - internal(); - } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } + CoverPass() : Pass("cover", "print code coverage counters") { } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/dft_tag.cc b/passes/cmds/dft_tag.cc index 347c8efa4..b6afe6f89 100644 --- a/passes/cmds/dft_tag.cc +++ b/passes/cmds/dft_tag.cc @@ -22,7 +22,6 @@ #include "kernel/modtools.h" #include "kernel/sigtools.h" #include "kernel/yosys.h" -#include "kernel/log_help.h" #include USING_YOSYS_NAMESPACE @@ -953,11 +952,6 @@ struct DftTagWorker { struct DftTagPass : public Pass { DftTagPass() : Pass("dft_tag", "create tagging logic for data flow tracking") {} - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/edgetypes.cc b/passes/cmds/edgetypes.cc index 933bd457f..5b53f50cc 100644 --- a/passes/cmds/edgetypes.cc +++ b/passes/cmds/edgetypes.cc @@ -19,18 +19,12 @@ #include "kernel/yosys.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct EdgetypePass : public Pass { EdgetypePass() : Pass("edgetypes", "list all types of edges in selection") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/example_dt.cc b/passes/cmds/example_dt.cc index b10f50502..2870e062b 100644 --- a/passes/cmds/example_dt.cc +++ b/passes/cmds/example_dt.cc @@ -21,17 +21,15 @@ struct ExampleWorker struct ExampleDtPass : public Pass { - ExampleDtPass() : Pass("example_dt", "drivertools example") { - internal(); - } + ExampleDtPass() : Pass("example_dt", "drivertools example") {} - void help() override + void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| log("\n"); log("TODO: add help message\n"); log("\n"); - } + } void execute(std::vector args, RTLIL::Design *design) override diff --git a/passes/cmds/exec.cc b/passes/cmds/exec.cc index 486fa1c2b..e9cc34b30 100644 --- a/passes/cmds/exec.cc +++ b/passes/cmds/exec.cc @@ -17,8 +17,8 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/log.h" #include #if defined(_WIN32) @@ -38,11 +38,6 @@ PRIVATE_NAMESPACE_BEGIN struct ExecPass : public Pass { ExecPass() : Pass("exec", "execute commands in the operating system shell") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/future.cc b/passes/cmds/future.cc index 5dcf46bcf..b03613c9b 100644 --- a/passes/cmds/future.cc +++ b/passes/cmds/future.cc @@ -24,7 +24,6 @@ #include "kernel/sigtools.h" #include "kernel/utils.h" #include "kernel/yosys.h" -#include "kernel/log_help.h" #include USING_YOSYS_NAMESPACE @@ -111,11 +110,6 @@ struct FutureWorker { struct FuturePass : public Pass { FuturePass() : Pass("future", "resolve future sampled value functions") {} - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/glift.cc b/passes/cmds/glift.cc index 0c321eba6..6a7d070d7 100644 --- a/passes/cmds/glift.cc +++ b/passes/cmds/glift.cc @@ -17,9 +17,10 @@ * */ +#include "kernel/register.h" +#include "kernel/rtlil.h" #include "kernel/utils.h" -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -424,12 +425,6 @@ public: struct GliftPass : public Pass { GliftPass() : Pass("glift", "create GLIFT models and optimization problems") {} - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } - void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/internal_stats.cc b/passes/cmds/internal_stats.cc index 00456b8f9..28822f237 100644 --- a/passes/cmds/internal_stats.cc +++ b/passes/cmds/internal_stats.cc @@ -18,6 +18,8 @@ */ #include +#include +#include #include "kernel/yosys.h" #include "kernel/celltypes.h" @@ -69,10 +71,7 @@ std::optional current_mem_bytes() { } struct InternalStatsPass : public Pass { - InternalStatsPass() : Pass("internal_stats", "print internal statistics") { - experimental(); - internal(); - } + InternalStatsPass() : Pass("internal_stats", "print internal statistics") { } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/logcmd.cc b/passes/cmds/logcmd.cc index 0238627d1..3b82ac48c 100644 --- a/passes/cmds/logcmd.cc +++ b/passes/cmds/logcmd.cc @@ -18,19 +18,15 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct LogPass : public Pass { LogPass() : Pass("log", "print text and log files") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/logger.cc b/passes/cmds/logger.cc index 276810201..241a8799f 100644 --- a/passes/cmds/logger.cc +++ b/passes/cmds/logger.cc @@ -17,19 +17,14 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct LoggerPass : public Pass { LoggerPass() : Pass("logger", "set logger properties") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/ltp.cc b/passes/cmds/ltp.cc index b3134b110..22bdaab44 100644 --- a/passes/cmds/ltp.cc +++ b/passes/cmds/ltp.cc @@ -20,7 +20,6 @@ #include "kernel/yosys.h" #include "kernel/celltypes.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -142,11 +141,6 @@ struct LtpWorker struct LtpPass : public Pass { LtpPass() : Pass("ltp", "print longest topological path") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/plugin.cc b/passes/cmds/plugin.cc index a653844b7..4ad7c165b 100644 --- a/passes/cmds/plugin.cc +++ b/passes/cmds/plugin.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #ifdef YOSYS_ENABLE_PLUGINS # include @@ -123,11 +122,6 @@ void load_plugin(std::string, std::vector) struct PluginPass : public Pass { PluginPass() : Pass("plugin", "load and list loaded plugins") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/portarcs.cc b/passes/cmds/portarcs.cc index 97682efbb..a6ed75de3 100644 --- a/passes/cmds/portarcs.cc +++ b/passes/cmds/portarcs.cc @@ -22,7 +22,6 @@ #include "kernel/rtlil.h" #include "kernel/utils.h" #include "kernel/celltypes.h" -#include "kernel/log_help.h" PRIVATE_NAMESPACE_BEGIN USING_YOSYS_NAMESPACE @@ -39,11 +38,6 @@ static RTLIL::SigBit canonical_bit(RTLIL::SigBit bit) struct PortarcsPass : Pass { PortarcsPass() : Pass("portarcs", "derive port arcs for propagation delay") {} - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { diff --git a/passes/cmds/portlist.cc b/passes/cmds/portlist.cc index f78d9d3b6..03048422d 100644 --- a/passes/cmds/portlist.cc +++ b/passes/cmds/portlist.cc @@ -19,18 +19,12 @@ #include "kernel/yosys.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct PortlistPass : public Pass { PortlistPass() : Pass("portlist", "list (top-level) ports") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/printattrs.cc b/passes/cmds/printattrs.cc index c8b0a1d1f..2a5034c13 100644 --- a/passes/cmds/printattrs.cc +++ b/passes/cmds/printattrs.cc @@ -18,18 +18,12 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct PrintAttrsPass : public Pass { PrintAttrsPass() : Pass("printattrs", "print attributes of selected objects") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/scc.cc b/passes/cmds/scc.cc index e55e63828..0f988e57a 100644 --- a/passes/cmds/scc.cc +++ b/passes/cmds/scc.cc @@ -21,10 +21,12 @@ // Tarjan, R. E. (1972), "Depth-first search and linear graph algorithms", SIAM Journal on Computing 1 (2): 146-160, doi:10.1137/0201010 // http://en.wikipedia.org/wiki/Tarjan's_strongly_connected_components_algorithm -#include "kernel/yosys.h" +#include "kernel/register.h" #include "kernel/celltypes.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" +#include "kernel/log.h" +#include +#include USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -250,11 +252,6 @@ struct SccWorker struct SccPass : public Pass { SccPass() : Pass("scc", "detect strongly connected components (logic loops)") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/scratchpad.cc b/passes/cmds/scratchpad.cc index 4a63f2f60..aecc4c17d 100644 --- a/passes/cmds/scratchpad.cc +++ b/passes/cmds/scratchpad.cc @@ -18,19 +18,15 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct ScratchpadPass : public Pass { ScratchpadPass() : Pass("scratchpad", "get/set values in the scratchpad") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/select.cc b/passes/cmds/select.cc index 901f923f8..1d75091af 100644 --- a/passes/cmds/select.cc +++ b/passes/cmds/select.cc @@ -20,7 +20,8 @@ #include "kernel/yosys.h" #include "kernel/celltypes.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" +#include +#include USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -1084,11 +1085,6 @@ PRIVATE_NAMESPACE_BEGIN struct SelectPass : public Pass { SelectPass() : Pass("select", "modify and view the list of selected objects") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| @@ -1668,11 +1664,6 @@ struct SelectPass : public Pass { struct CdPass : public Pass { CdPass() : Pass("cd", "a shortcut for 'select -module '") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| @@ -1785,11 +1776,6 @@ static void log_matches(const char *title, Module *module, const T &list) struct LsPass : public Pass { LsPass() : Pass("ls", "list modules or objects in modules") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/setenv.cc b/passes/cmds/setenv.cc index 850d7c961..27f2eea28 100644 --- a/passes/cmds/setenv.cc +++ b/passes/cmds/setenv.cc @@ -17,18 +17,15 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" +#include USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct SetenvPass : public Pass { SetenvPass() : Pass("setenv", "set an environment variable") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/show.cc b/passes/cmds/show.cc index 4eb6569e6..8a1bd58c4 100644 --- a/passes/cmds/show.cc +++ b/passes/cmds/show.cc @@ -17,9 +17,10 @@ * */ -#include "kernel/yosys.h" +#include "kernel/register.h" #include "kernel/celltypes.h" -#include "kernel/log_help.h" +#include "kernel/log.h" +#include #ifndef _WIN32 # include @@ -657,11 +658,6 @@ struct ShowWorker struct ShowPass : public Pass { ShowPass() : Pass("show", "generate schematics using graphviz") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/sta.cc b/passes/cmds/sta.cc index 5dfac1575..4ad0e96be 100644 --- a/passes/cmds/sta.cc +++ b/passes/cmds/sta.cc @@ -21,7 +21,6 @@ #include "kernel/yosys.h" #include "kernel/sigtools.h" #include "kernel/timinginfo.h" -#include "kernel/log_help.h" #include USING_YOSYS_NAMESPACE @@ -276,11 +275,6 @@ struct StaWorker struct StaPass : public Pass { StaPass() : Pass("sta", "perform static timing analysis") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/stat.cc b/passes/cmds/stat.cc index af7023bdd..6b93621f1 100644 --- a/passes/cmds/stat.cc +++ b/passes/cmds/stat.cc @@ -25,7 +25,6 @@ #include "kernel/cost.h" #include "kernel/gzip.h" #include "libs/json11/json11.hpp" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -368,11 +367,6 @@ void read_liberty_cellarea(dict &cell_area, string libert struct StatPass : public Pass { StatPass() : Pass("stat", "print some statistics") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/tee.cc b/passes/cmds/tee.cc index fbd42e311..853f1bad3 100644 --- a/passes/cmds/tee.cc +++ b/passes/cmds/tee.cc @@ -18,19 +18,15 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct TeePass : public Pass { TeePass() : Pass("tee", "redirect command output to file") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/torder.cc b/passes/cmds/torder.cc index 537b6793d..1620c0bca 100644 --- a/passes/cmds/torder.cc +++ b/passes/cmds/torder.cc @@ -21,18 +21,12 @@ #include "kernel/celltypes.h" #include "kernel/sigtools.h" #include "kernel/utils.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct TorderPass : public Pass { TorderPass() : Pass("torder", "print cells in topological order") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/trace.cc b/passes/cmds/trace.cc index 39ed8e60e..400542776 100644 --- a/passes/cmds/trace.cc +++ b/passes/cmds/trace.cc @@ -19,7 +19,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -61,11 +60,6 @@ struct TraceMonitor : public RTLIL::Monitor struct TracePass : public Pass { TracePass() : Pass("trace", "redirect command output to file") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| @@ -102,11 +96,6 @@ struct TracePass : public Pass { struct DebugPass : public Pass { DebugPass() : Pass("debug", "run command with debug log messages enabled") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/viz.cc b/passes/cmds/viz.cc index 4c73b4d71..131e799ab 100644 --- a/passes/cmds/viz.cc +++ b/passes/cmds/viz.cc @@ -19,7 +19,6 @@ #include "kernel/yosys.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" #ifndef _WIN32 # include @@ -818,11 +817,6 @@ struct VizWorker struct VizPass : public Pass { VizPass() : Pass("viz", "visualize data flow graph") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/write_file.cc b/passes/cmds/write_file.cc index a22fdaf2a..ea9b3f556 100644 --- a/passes/cmds/write_file.cc +++ b/passes/cmds/write_file.cc @@ -19,18 +19,12 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct WriteFileFrontend : public Frontend { WriteFileFrontend() : Frontend("=write_file", "write a text to a file") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/status"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/cmds/xprop.cc b/passes/cmds/xprop.cc index d2d0c4d8e..dc5befc27 100644 --- a/passes/cmds/xprop.cc +++ b/passes/cmds/xprop.cc @@ -24,7 +24,6 @@ #include "kernel/sigtools.h" #include "kernel/utils.h" #include "kernel/yosys.h" -#include "kernel/log_help.h" #include USING_YOSYS_NAMESPACE @@ -1101,11 +1100,6 @@ struct XpropWorker struct XpropPass : public Pass { XpropPass() : Pass("xprop", "formal x propagation") {} - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/hierarchy/Makefile.inc b/passes/hierarchy/Makefile.inc index ff1a2fcc5..3cd1b6180 100644 --- a/passes/hierarchy/Makefile.inc +++ b/passes/hierarchy/Makefile.inc @@ -1,5 +1,4 @@ -OBJS += passes/hierarchy/flatten.o OBJS += passes/hierarchy/hierarchy.o OBJS += passes/hierarchy/uniquify.o OBJS += passes/hierarchy/submod.o diff --git a/passes/opt/rmports.cc b/passes/opt/rmports.cc index 0ac391790..9fa9f5c2d 100644 --- a/passes/opt/rmports.cc +++ b/passes/opt/rmports.cc @@ -17,20 +17,17 @@ * */ +#include "kernel/register.h" #include "kernel/sigtools.h" -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/log.h" +#include +#include USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN struct RmportsPassPass : public Pass { RmportsPassPass() : Pass("rmports", "remove module ports with no connections") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("techlibs/greenpak4"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/pmgen/test_pmgen.cc b/passes/pmgen/test_pmgen.cc index 892500850..fc41848f7 100644 --- a/passes/pmgen/test_pmgen.cc +++ b/passes/pmgen/test_pmgen.cc @@ -117,9 +117,7 @@ void opt_eqpmux(test_pmgen_pm &pm) } struct TestPmgenPass : public Pass { - TestPmgenPass() : Pass("test_pmgen", "test pass for pmgen") { - internal(); - } + TestPmgenPass() : Pass("test_pmgen", "test pass for pmgen") { } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/assertpmux.cc b/passes/sat/assertpmux.cc index 7b3357f82..991977ab9 100644 --- a/passes/sat/assertpmux.cc +++ b/passes/sat/assertpmux.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" #include "kernel/utils.h" @@ -183,11 +182,6 @@ struct AssertpmuxWorker struct AssertpmuxPass : public Pass { AssertpmuxPass() : Pass("assertpmux", "adds asserts for parallel muxes") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/async2sync.cc b/passes/sat/async2sync.cc index e86a78d81..93c7e96c8 100644 --- a/passes/sat/async2sync.cc +++ b/passes/sat/async2sync.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" #include "kernel/ffinit.h" #include "kernel/ff.h" @@ -28,11 +27,6 @@ PRIVATE_NAMESPACE_BEGIN struct Async2syncPass : public Pass { Async2syncPass() : Pass("async2sync", "convert async FF inputs to sync circuits") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/clk2fflogic.cc b/passes/sat/clk2fflogic.cc index 6b94cbe19..348bab727 100644 --- a/passes/sat/clk2fflogic.cc +++ b/passes/sat/clk2fflogic.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" #include "kernel/ffinit.h" #include "kernel/ff.h" @@ -34,11 +33,6 @@ struct SampledSig { struct Clk2fflogicPass : public Pass { Clk2fflogicPass() : Pass("clk2fflogic", "convert clocked FFs to generic $ff cells") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/cutpoint.cc b/passes/sat/cutpoint.cc index 485e44fd6..dcd399a57 100644 --- a/passes/sat/cutpoint.cc +++ b/passes/sat/cutpoint.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" USING_YOSYS_NAMESPACE @@ -26,11 +25,6 @@ PRIVATE_NAMESPACE_BEGIN struct CutpointPass : public Pass { CutpointPass() : Pass("cutpoint", "adds formal cut points to the design") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/expose.cc b/passes/sat/expose.cc index 1e975db0f..9afe00d5c 100644 --- a/passes/sat/expose.cc +++ b/passes/sat/expose.cc @@ -17,10 +17,11 @@ * */ -#include "kernel/yosys.h" +#include "kernel/register.h" #include "kernel/celltypes.h" #include "kernel/sigtools.h" -#include "kernel/log_help.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -216,11 +217,6 @@ RTLIL::Wire *add_new_wire(RTLIL::Module *module, RTLIL::IdString name, int width struct ExposePass : public Pass { ExposePass() : Pass("expose", "convert internal signals to module ports") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/cmds"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/fmcombine.cc b/passes/sat/fmcombine.cc index 575b2f40d..220cf5c52 100644 --- a/passes/sat/fmcombine.cc +++ b/passes/sat/fmcombine.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" #include "kernel/celltypes.h" @@ -238,11 +237,6 @@ struct FmcombineWorker struct FmcombinePass : public Pass { FmcombinePass() : Pass("fmcombine", "combine two instances of a cell into one") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/fminit.cc b/passes/sat/fminit.cc index 547082164..5f4ec0068 100644 --- a/passes/sat/fminit.cc +++ b/passes/sat/fminit.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" USING_YOSYS_NAMESPACE @@ -26,11 +25,6 @@ PRIVATE_NAMESPACE_BEGIN struct FminitPass : public Pass { FminitPass() : Pass("fminit", "set init values/sequences for formal") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/formalff.cc b/passes/sat/formalff.cc index 286bf2976..1d87fcc3b 100644 --- a/passes/sat/formalff.cc +++ b/passes/sat/formalff.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" #include "kernel/ffinit.h" #include "kernel/ff.h" @@ -487,11 +486,6 @@ void HierarchyWorker::propagate() struct FormalFfPass : public Pass { FormalFfPass() : Pass("formalff", "prepare FFs for formal") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/freduce.cc b/passes/sat/freduce.cc index 6063c5ab9..52e80f667 100644 --- a/passes/sat/freduce.cc +++ b/passes/sat/freduce.cc @@ -17,12 +17,17 @@ * */ +#include "kernel/register.h" #include "kernel/celltypes.h" #include "kernel/consteval.h" #include "kernel/sigtools.h" +#include "kernel/log.h" #include "kernel/satgen.h" -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include +#include +#include +#include +#include USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -756,11 +761,6 @@ struct FreduceWorker struct FreducePass : public Pass { FreducePass() : Pass("freduce", "perform functional reduction") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/miter.cc b/passes/sat/miter.cc index 9bcf25547..8f27c4c6f 100644 --- a/passes/sat/miter.cc +++ b/passes/sat/miter.cc @@ -17,8 +17,9 @@ * */ -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include "kernel/register.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -394,11 +395,6 @@ void create_miter_assert(struct Pass *that, std::vector args, RTLIL struct MiterPass : public Pass { MiterPass() : Pass("miter", "automatically create a miter circuit") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/mutate.cc b/passes/sat/mutate.cc index 43373ce0e..3075ef3f0 100644 --- a/passes/sat/mutate.cc +++ b/passes/sat/mutate.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" USING_YOSYS_NAMESPACE @@ -729,11 +728,6 @@ void mutate_cnot(Design *design, const mutate_opts_t &opts, bool one) struct MutatePass : public Pass { MutatePass() : Pass("mutate", "generate or apply design mutations") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/qbfsat.cc b/passes/sat/qbfsat.cc index 7a7a31806..db6836ea1 100644 --- a/passes/sat/qbfsat.cc +++ b/passes/sat/qbfsat.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/consteval.h" #include "qbfsat.h" @@ -505,11 +504,6 @@ QbfSolveOptions parse_args(const std::vector &args) { struct QbfSatPass : public Pass { QbfSatPass() : Pass("qbfsat", "solve a 2QBF-SAT problem in the circuit") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/recover_names.cc b/passes/sat/recover_names.cc index 7ed8b1304..cddd8771c 100644 --- a/passes/sat/recover_names.cc +++ b/passes/sat/recover_names.cc @@ -23,7 +23,6 @@ #include "kernel/celltypes.h" #include "kernel/utils.h" #include "kernel/satgen.h" -#include "kernel/log_help.h" #include #include @@ -691,11 +690,6 @@ struct RecoverNamesWorker { struct RecoverNamesPass : public Pass { RecoverNamesPass() : Pass("recover_names", "Execute a lossy mapping command and recover original netnames") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("passes/opt"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/sat.cc b/passes/sat/sat.cc index 2f20880cb..0c2143fc9 100644 --- a/passes/sat/sat.cc +++ b/passes/sat/sat.cc @@ -21,12 +21,17 @@ // Niklas Een and Niklas Sörensson (2003) // http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.8161 +#include "kernel/register.h" #include "kernel/celltypes.h" #include "kernel/consteval.h" #include "kernel/sigtools.h" +#include "kernel/log.h" #include "kernel/satgen.h" -#include "kernel/yosys.h" -#include "kernel/log_help.h" +#include +#include +#include +#include +#include USING_YOSYS_NAMESPACE PRIVATE_NAMESPACE_BEGIN @@ -897,11 +902,6 @@ void print_qed() struct SatPass : public Pass { SatPass() : Pass("sat", "solve a SAT problem in the circuit") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/supercover.cc b/passes/sat/supercover.cc index f1b3ad09c..38dbd3cf9 100644 --- a/passes/sat/supercover.cc +++ b/passes/sat/supercover.cc @@ -18,7 +18,6 @@ */ #include "kernel/yosys.h" -#include "kernel/log_help.h" #include "kernel/sigtools.h" USING_YOSYS_NAMESPACE @@ -26,11 +25,6 @@ PRIVATE_NAMESPACE_BEGIN struct SupercoverPass : public Pass { SupercoverPass() : Pass("supercover", "add hi/lo cover cells for each wire bit") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/sat/synthprop.cc b/passes/sat/synthprop.cc index 4703e4ad7..5553abec2 100644 --- a/passes/sat/synthprop.cc +++ b/passes/sat/synthprop.cc @@ -18,9 +18,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * */ - #include "kernel/yosys.h" -#include "kernel/log_help.h" YOSYS_NAMESPACE_BEGIN @@ -181,13 +179,7 @@ void SynthPropWorker::run() struct SyntProperties : public Pass { SyntProperties() : Pass("synthprop", "synthesize SVA properties") { } - bool formatted_help() override { - auto *help = PrettyHelp::get_current(); - help->set_group("formal"); - return false; - } - - void help() override + virtual void help() { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| log("\n"); @@ -216,7 +208,7 @@ struct SyntProperties : public Pass { log("\n"); } - void execute(std::vector args, RTLIL::Design* design) override + virtual void execute(std::vector args, RTLIL::Design* design) { log_header(design, "Executing SYNTHPROP pass.\n"); SynthPropWorker worker(design); diff --git a/passes/techmap/Makefile.inc b/passes/techmap/Makefile.inc index 91b3b563a..c9fe98a74 100644 --- a/passes/techmap/Makefile.inc +++ b/passes/techmap/Makefile.inc @@ -1,4 +1,5 @@ +OBJS += passes/techmap/flatten.o OBJS += passes/techmap/techmap.o OBJS += passes/techmap/simplemap.o OBJS += passes/techmap/dfflibmap.o diff --git a/passes/hierarchy/flatten.cc b/passes/techmap/flatten.cc similarity index 100% rename from passes/hierarchy/flatten.cc rename to passes/techmap/flatten.cc diff --git a/passes/tests/test_abcloop.cc b/passes/tests/test_abcloop.cc index ed54ce164..9e7adaab1 100644 --- a/passes/tests/test_abcloop.cc +++ b/passes/tests/test_abcloop.cc @@ -243,9 +243,7 @@ static void test_abcloop() } struct TestAbcloopPass : public Pass { - TestAbcloopPass() : Pass("test_abcloop", "automatically test handling of loops in abc command") { - internal(); - } + TestAbcloopPass() : Pass("test_abcloop", "automatically test handling of loops in abc command") { } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/tests/test_autotb.cc b/passes/tests/test_autotb.cc index 306e760ee..404d1e48d 100644 --- a/passes/tests/test_autotb.cc +++ b/passes/tests/test_autotb.cc @@ -326,9 +326,7 @@ static void autotest(std::ostream &f, RTLIL::Design *design, int num_iter, int s } struct TestAutotbBackend : public Backend { - TestAutotbBackend() : Backend("=test_autotb", "generate simple test benches") { - internal(); - } + TestAutotbBackend() : Backend("=test_autotb", "generate simple test benches") { } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| diff --git a/passes/tests/test_cell.cc b/passes/tests/test_cell.cc index b6385766c..a34eafc2f 100644 --- a/passes/tests/test_cell.cc +++ b/passes/tests/test_cell.cc @@ -705,9 +705,7 @@ static void run_eval_test(RTLIL::Design *design, bool verbose, bool nosat, std:: } struct TestCellPass : public Pass { - TestCellPass() : Pass("test_cell", "automatically test the implementation of a cell type") { - internal(); - } + TestCellPass() : Pass("test_cell", "automatically test the implementation of a cell type") { } void help() override { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|