• Top
    • Documentation
    • Books
    • Boolean-reasoning
    • Projects
    • Debugging
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
      • Gl
      • Esim
      • Vl2014
        • Warnings
        • Primitives
        • Use-set
        • Syntax
        • Getting-started
        • Utilities
        • Loader
        • Transforms
          • Expression-sizing
          • Occform
          • Oprewrite
          • Expand-functions
          • Delayredux
          • Unparameterization
          • Caseelim
          • Split
          • Selresolve
          • Weirdint-elim
          • Vl-delta
          • Replicate-insts
          • Rangeresolve
          • Propagate
          • Clean-selects
          • Clean-params
          • Blankargs
          • Inline-mods
          • Expr-simp
          • Trunc
          • Always-top
          • Gatesplit
            • Vl-gatesplit-nand/nor/xnor
            • Vl-modulelist-gatesplit
            • Vl-gatesplit-and/or/xor
            • Vl-degenerate-gate-to-buf
            • Vl-gatesplit-buf/not
            • Vl-make-temporary-wires
            • Vl-gateinst-gatesplit
            • Vl-gateinstlist-gatesplit
            • Vl-module-gatesplit
            • Vl-design-gatesplit
          • Gate-elim
          • Expression-optimization
          • Elim-supplies
          • Wildelim
          • Drop-blankports
          • Clean-warnings
          • Addinstnames
          • Custom-transform-hooks
          • Annotate
          • Latchcode
          • Elim-unused-vars
          • Problem-modules
        • Lint
        • Mlib
        • Server
        • Kit
        • Printer
        • Esim-vl
        • Well-formedness
      • Sv
      • Fgl
      • Vwsim
      • Vl
      • X86isa
      • Svl
      • Rtl
    • Software-verification
    • Math
    • Testing-utilities
  • Transforms

Gatesplit

Split up gates with "extra" terminals.

Gate Splitting

This transformation is responsible for splitting up multi-input gates into multiple one-input gates for buf and not, or two-input gates for and, or, etc. It also deals with degenerate cases like single-input and gates, which are not ruled out by the Verilog specification.

Ordering Notes. This transformation must be done after widths have been computed, and after replicate-insts has been run to eliminate any arrays. Replication is necessary for certain well-formedness checks on the widths to succeed.

Unlike occforming, we lay down gates directly instead of introducing new modules. It might be nicer to do it the other way and introduce modules instead, since then the module instance could keep the same name as the gate. On the other hand, the code to just introduce gates is simpler, and it would probably suffice to just use good names or annotations to explain where the gates come from.

Subtopics

Vl-gatesplit-nand/nor/xnor
Split up a multi-input nand or nor gate, if necessary.
Vl-modulelist-gatesplit
(vl-modulelist-gatesplit x) maps vl-module-gatesplit across a list.
Vl-gatesplit-and/or/xor
Split up a multi-input and, or, xor, or xnor gate, if necessary.
Vl-degenerate-gate-to-buf
Replace a degenerate one-input logic gate with a buffer.
Vl-gatesplit-buf/not
Split up a multi-output buf or not gate, if necessary.
Vl-make-temporary-wires
Generate expressions and declarations for some fresh, one-bit wires.
Vl-gateinst-gatesplit
Main routine for splitting high-arity gate instances.
Vl-gateinstlist-gatesplit
Vl-module-gatesplit
Vl-design-gatesplit
Top-level gatesplit transform.