Circuit Optimization with Netlist Carpentry¶
Netlist Carpentry offers various optimization routines, from simple removal of unused modules and unconnected instances up to more advanced algorithms such as constant propagation. This notebook teaches the basics of circuit optimization with Netlist Carpentry.
Optimization of unused modules¶
By executing Circuit.optimize(), unused modules (i.e. modules never instantiated within the circuit) are removed (among other optimizations).
This is useful, e.g. if a library file is imported and only a couple of modules are used.
Execute the cell below to run the optimize method on an empty circuit, which returns True if at least one optimization was executed, and False otherwise.
from netlist_carpentry import Circuit
c = Circuit(name="circuit")
any_optimized = c.optimize()
print(f"Anything optimized? {any_optimized} -- Circuit contains now {len(c.modules)} modules!")
Anything optimized? False -- Circuit contains now 0 modules!
Now creating a new module and executing Circuit.optimize directly afterwards will remove the module, as it is deemed "unused".
However, if the module is set as top module, it is not removed - this would lead to the whole circuit to be removed recursively.
Execute the cell below to view these both cases.
c.create_module("some_unused_module")
any_optimized = c.optimize()
print(f"Anything optimized? {any_optimized} -- Circuit contains now {len(c.modules)} modules!")
m = c.create_module("another_module")
c.set_top("another_module")
any_optimized = c.optimize()
print(f"Anything optimized? {any_optimized} -- Circuit contains now {len(c.modules)} modules!")
Anything optimized? True -- Circuit contains now 0 modules!
Anything optimized? False -- Circuit contains now 1 modules!
Optimization of the modules themselves¶
When executing Circuit.optimize, a bunch of module optimizations are also executed for each module of the circuit.
These will be discussed later in detail.
However, as a short preview, unused instances (i.e. instances without load) are also removed from the circuit.
Execute the cell below to create a submodule instance of a new module without any connections to the rest of the module, which is then removed by the optimization method.
from netlist_carpentry import Module
m.create_instance(Module(raw_path="SomeSubmodule"), instance_name="I_SomeSubmodule")
print(f"{m.name} contains {len(m.instances)} Instance.")
any_optimized = c.optimize()
print(f"Anything optimized? {any_optimized} -- Circuit contains now {len(c.modules)} modules!")
print(f"{m.name} contains {len(m.instances)} Instances.")
another_module contains 1 Instance.
Anything optimized? True -- Circuit contains now 1 modules! another_module contains 0 Instances.