Partition Manager
Contents
Partition Manager#
The partitioning module (par
) is based on TritonPart, an open-sourceconstraints-driven partitioner.par
can be usedto partition a hypergraph or a gate-level netlist.
Highlights#
Start of the art multiple-constraints driven partitioning “multi-tool”
Optimizes cost function based on user requirement
Permissive open-source license
Solves multi-way partitioning with following features:
Multidimensional real-value weights on vertices and hyperedges
Multilevel coarsening and refinement framework
Fixed vertices constraint
Timing-driven partitioning framework
Group constraint: Groups of vertices need to be in same block
Embedding-aware partitioning
Dependency#
We use Google OR-Tools as our ILP solver.
Our recommendation is to follow the OpenROADDependencyInstaller for installation of this requirement.
Alternatively, you may also install Google OR-Toolsfollowing theseinstructions.
Warning
Due to a build issue, TritonPart is not supported for macOS. Stay tuned to this page for updates!
Main Algorithm#
An overview of the TritonPart algorithm is shown below. It takes as inputs
Hypergraph\(H(V,E)\) in
.hgr
format.Vertex weight\(w_v \in \mathcal{R}_+^m\)
Hyperedge weight\(w_e \in \mathcal{R}_+^n\)
Number of blocks\(K\).
Imbalance factor\(\epsilon\).
User-specified cost function\(\phi\).
There are five main steps in the main algorithm,mainly 1) constraints-driven coarsening,2) initial partitioning, 3) refinement, 4) cut-overlay clustering andpartitioning (COCP), and 5) V-cycle refinement. The steps for thetiming-aware algorithm may be found in the nextsection.
Constraints-Driven Coarsening
The first step involves multilevel coarsening. Specifically, at each level,clusters of vertices are identified, and the merged and representedas a single vertex in the resulting coarser hypergraph. In this algorithm,the First-Choice scheme is used, which traverses the vertices in thehypergraph according to a given ordering and merges pairs of vertices withhigh connectivity. The connectivity between a pair of vertices\((u,v)\)is measured as follows:
To efficiently manage multiple constraints, the following enhancements aremade to the coarsening scheme above:
Fixed Vertex Constraint: Fixed vertices that belong to the same partitioning block are merged into a single vertex.
Grouping Constraint: Vertices that belong to the same group are merged into a single vertex.
Embedding Constraint: The embedding information is incorporated into the heavy-edge rating function. The new connectivity is updated as follows:
where\(\rho\) is a normalization factor set to the average distance between twovertex embeddings. When vertices\(v_1, ... , v_t\) are merged into a singlevertex\(v_{coarse}\), the corresponding vertex embedding\(X_{v_{coarse}}\)is defined as thecenter of gravity of\(t\) vertices:
Community Guidance: Only vertices within the same community areconsidered for merging.
Tie-breaking mechanism: If multiple neighbor pairs have the same ratingscore, combine the lexicographically first unmatched vertex to break ties.
Initial Partitioning
After completing the coarsening process, an initial partitioning solution forthe coarsest hypergraph\(H_c\) is derived. Two sub-steps are involved in this:the best partitioning solution from random and VILE partitioning is chosenfrom\(\eta = 50\) runs as a warm-start to the ILP-based partitioner. Theoptimization is based on only the cut size rather than the cost function\(\phi\) to keep the runtime reasonable.
Refinement
After a feasible solution\(H_{c_\xi}\) is obtained by initial partitioning,uncoarsening and move-based refinement is performed to improve thepartitioning solution. Three refinement heuristics are applied in sequence:
\(K\)-way pairwise FM (PM): This addresses multi-way partitioningas concurrent bi-partitioning problems in a restricted version of K-wayFiduccia–Mattheyses (FM) algorithm. First,\(\lfloor K/2\rfloor \) pairs ofblocks are obtained, with refinement-specific vertex movements restrictedto associated paired blocks. Next, two-way FM is concurrently performed onall the block pairs. finally, a new configuration of block pairs is computedat the end of the PM.
Direct\(K\)-way FM: Using\(K\) priority queues, for each block\(V_i\),establish a priority queue that stores the vertices that can be potentiallymoved from the current block to block\(V_i\). This queue is ordered accordingto the gain of the vertices. Gain is defined as the reduction in costfunction from the movement of the vertex from the current block to\(V_i\).Next, after a vertex move, each priority queue is updated independently, thusenabling parallel updates via multi-threading. Next, early-stop is implementedby limiting the maximum number of vertices moved to 100 per pass. Finally,thecorking effect is mitigated by traversing the priority queue belongingto the vertex with the highest gain and identifying a feasible vertex move.
Greedy Hyperedge Refinement (HER): First, randomly visit allhyperedges. For each hyperedge\(e\) that crosses the partition boundary,determine whether a subset of vertices in\(e\) can be moved without violatingthe multi-dimensional balance constraints. The objective is to make\(e\)entirely constrained in a block.
Cut-Overlay Clustering and Partitioning (COCP)
Cut-overlay Clustering and Partitioning (COCP) is a mechanism tocombine multiple good-quality partitioning solutions to generate animproved solution. To begin, the sets of hyperedges cut in the\(\theta\)candidate solutions are denoted as\(E_1,..., E_\theta \subset E\). First,\(\cup_{i=1}^\theta E_i\) is removed from the hypergraph\(H(V, E)\), resulting ina number of connected components. Next, all vertices within each connectedcomponent are merged to form a coarser hypergraph\(H_{overlay}\). If thenumber of vertices in\(H_{overlay}\) is less than\(thr_{ilp}\), ILP-basedpartitioning is performed. If not, a single round of constraints-drivencoarsening is conducted to further reduce the size of\(H_{overlay}\)and generate a coarser hypergraph\(H_{overlay}^{'}\). Finally, multilevelrefinement is performed to further improve the partitioning solution ateach level of the hierarchy and return the improved solution\(S^{'}\).
V-Cycle Refinement
Cut-overlay clustering and partitioning produces a high-quality partitioningsolution\(S^{'}\). To improve it, there are three phases similar tohMETIS,namely multilevel coarsening, ILP-based partitioning, and refinement.Firstly, in multilevel partitioning,\(S^{'}\) is used as a community guidancefor the constraints-driven coarsening. Only vertices within the same blockare permitted to be merged to ensure that the current solution\(S^{'}\)is preserved in the coarsest hypergraph\(H_{c_\xi}\). In the ILP-basedpartitioning phase, if the number of vertices in\(H_{c_\xi}\) does not exceed\(thr_{ilp}\), run ILP-based partitioning to improve\(S^{'}\). Otherwise,continue with\(S^{'}\) in successive iterations of these two steps (defaultset to 2). The refinement phase is conducted as per step 3.
Timing Aware Algorithm#
par
can also be used as a timing-aware partitioning framework. A slackpropagation methodology is used that optimizes cuts for both timing-criticaland timing-noncritical paths.
Extraction of Timing Paths and Slack Information
First, the top\(P\) timing-critical paths and the slack information of eachhyperedge using the wireload model (WLM) is obtained fromOpenSTA. Thetiming cost of each path is then calculated:
where a fixed extra delay\(\Delta\) is introduced for timing guardband,and\(\mu\) (default 2) is the exponent.
The snaking factor of a path\(SF(p)\) is defined as the maximum numberof block reentries along the path\(p\). The timing cost of a hyperedge iscomputed using the timing weight corresponding to hyperedge slack\(slack_e\)and the accumulated timing cost of all paths traversing the hyperedge.
Timing-aware Coarsening
The timing-aware feature is achieved by adding a timing cost of hyperedge\(t_e\) to the connectivity score earlier mentioned. If vertices\((u,v)\)are associated with multiple critical paths, then they are more likely tobe merged. This is reflected in the update score function:
Timing-aware Refinement
Timing-aware refinement is based on a similar cost function as the mainalgorithm. Instead, an additional slack propagation step is performed atthe end of each PM/FM/HER pass.
Commands#
Note
Parameters in square brackets
[-paramparam]
are optional.Parameters without square brackets
-param2param2
are required.
Partition Hypergraph Netlist#
This command performs hypergraph netlist partitioning.
triton_part_hypergraph-hypergraph_filehypergraph_file-num_partsnum_parts-balance_constraintbalance_constraint[-base_balancebase_balance][-scale_factorscale_factor][-seedseed][-vertex_dimensionvertex_dimension][-hyperedge_dimensionhyperedge_dimension][-placement_dimensionplacement_dimension][-fixed_filefixed_file][-community_filecommunity_file][-group_filegroup_file][-placement_fileplacement_file][-e_wt_factorse_wt_factors][-v_wt_factors<v_wt_factors>][-placement_wt_factors<placement_wt_factors>][-thr_coarsen_hyperedge_size_skipthr_coarsen_hyperedge_size_skip][-thr_coarsen_verticesthr_coarsen_vertices][-thr_coarsen_hyperedgesthr_coarsen_hyperedges][-coarsening_ratiocoarsening_ratio][-max_coarsen_itersmax_coarsen_iters][-adj_diff_ratioadj_diff_ratio][-min_num_vertices_each_partmin_num_vertices_each_part][-num_initial_solutionsnum_initial_solutions][-num_best_initial_solutionsnum_best_initial_solutions][-refiner_itersrefiner_iters][-max_movesmax_moves][-early_stop_ratioearly_stop_ratio][-total_corking_passestotal_corking_passes][-v_cycle_flagv_cycle_flag][-max_num_vcyclemax_num_vcycle][-num_coarsen_solutionsnum_coarsen_solutions][-num_vertices_threshold_ilpnum_vertices_threshold_ilp][-global_net_thresholdglobal_net_threshold]
Options#
Switch Name | Description |
---|---|
| Number of partitions. The default value is |
| Allowed imbalance between blocks. The default value is |
| Tcl list of baseline imbalance between partitions. The default value is |
| KIV. The default value is |
| Random seed. The default value is |
| Number of vertices in the hypergraph. The default value is |
| Number of hyperedges in hypergraph. The default value is |
| Number of dimensions for canvas if placement information is provided. The default value is |
| Path to hypergraph file. |
| Path to fixed vertices constraint file. |
| Path to |
| Path to |
| Placement information file, each line corresponds to a group fixed vertices, community, and placement attributes following thehMETIS format. |
| Hyperedge weight factor. |
| Vertex weight factors. |
| Placement weight factors. |
| Threshold for ignoring large hyperedge (default 200, integer). |
| Number of vertices of coarsest hypergraph (default 10, integer). |
| Number of vertices of coarsest hypergraph (default 50, integer). |
| Coarsening ratio of two adjacent hypergraphs (default 1.6, float). |
| Number of iterations (default 30, integer). |
| Minimum difference of two adjacent hypergraphs (default 0.0001, float). |
| Minimum number of vertices in each partition (default 4, integer). |
| Number of initial solutions (default 50, integer). |
| Number of top initial solutions to filter out (default 10, integer). |
| Refinement iterations (default 10, integer). |
| The allowed moves for each Fiduccia-Mattheyes (FM) algorithm pass or greedy refinement (default 60, integer). |
| Describes the ratio\(e\) where if the\(n_{moved vertices} > n_{vertices} * e\), the tool exits the current FM pass. The intention behind this is that most of the gains are achieved by the first few FM moves. (default 0.5, float). |
| Maximum level of traversing the buckets to solve the “corking effect” (default 25, integer). |
| Disables v-cycle is used to refine partitions (default true, bool). |
| Maximum number of |
| Number of coarsening solutions with different randoms seed (default 3, integer). |
| Describes threshold\(t\), the number of vertices used for integer linear programming (ILP) partitioning. if\(n_{vertices} > t\), do not use ILP-based partitioning.(default 50, integer). |
| If the net is larger than this, it will be ignored by TritonPart (default 1000, integer). |
Evaluate Hypergraph Partition#
This command evaluates hypergraph partition.
evaluate_hypergraph_solution-num_partsnum_parts-balance_constraintbalance_constraint-hypergraph_filehypergraph_file-solution_filesolution_file[-base_balancebase_balance][-scale_factorscale_factor][-vertex_dimensionvertex_dimension][-hyperedge_dimensionhyperedge_dimension][-fixed_filefixed_file][-group_filegroup_file][-e_wt_factorse_wt_factors][-v_wt_factorsv_wt_factors]
Options#
Switch Name | Description |
---|---|
| Number of partitions. The default value is |
| Allowed imbalance between blocks. The default value is |
| Number of vertices in the hypergraph. The default value is |
| Number of hyperedges in hypergraph. The default value is |
| Path to hypergraph file. |
| Path to solution file. |
| Tcl list of baseline imbalance between partitions. The default value is |
| KIV. The default value is |
| Path to fixed vertices constraint file. |
| Path to |
| Hyperedge weight factor. |
| Vertex weight factor. |
Partition Netlist#
This command partitions the design netlist. Note that design must be loaded in memory.
triton_part_design[-num_partsnum_parts][-balance_constraintbalance_constraint][-base_balancebase_balance][-scale_factorscale_factor][-seedseed][-timing_aware_flagtiming_aware_flag][-top_ntop_n][-placement_flagplacement_flag][-fence_flagfence_flag][-fence_lxfence_lx][-fence_lyfence_ly][-fence_uxfence_ux][-fence_uyfence_uy][-fixed_filefixed_file][-community_filecommunity_file][-group_filegroup_file][-solution_filesolution_file][-net_timing_factornet_timing_factor][-path_timing_factorpath_timing_factor][-path_snaking_factorpath_snaking_factor][-timing_exp_factortiming_exp_factor][-extra_delayextra_delay][-guardband_flagguardband_flag][-e_wt_factorse_wt_factors][-v_wt_factorsv_wt_factors][-placement_wt_factorsplacement_wt_factors][-thr_coarsen_hyperedge_size_skipthr_coarsen_hyperedge_size_skip][-thr_coarsen_verticesthr_coarsen_vertices][-thr_coarsen_hyperedgesthr_coarsen_hyperedges][-coarsening_ratiocoarsening_ratio][-max_coarsen_itersmax_coarsen_iters][-adj_diff_ratioadj_diff_ratio][-min_num_vertices_each_partmin_num_vertices_each_part][-num_initial_solutionsnum_initial_solutions][-num_best_initial_solutionsnum_best_initial_solutions][-refiner_itersrefiner_iters][-max_movesmax_moves][-early_stop_ratioearly_stop_ratio][-total_corking_passestotal_corking_passes][-v_cycle_flagv_cycle_flag][-max_num_vcyclemax_num_vcycle][-num_coarsen_solutionsnum_coarsen_solutions][-num_vertices_threshold_ilpnum_vertices_threshold_ilp][-global_net_thresholdglobal_net_threshold]
Options#
Switch Name | Description |
---|---|
| Number of partitions. The default value is |
| Allowed imbalance between blocks. The default value is |
| Tcl list of baseline imbalance between partitions. The default value is |
| KIV. The default value is |
| Random seed. The default value is |
| Enable timing-driven mode. The default value is |
| Extract the top n critical timing paths. The default value is |
| Enable placement driven partitioning. The default value is |
| Consider fences in the partitioning. The default value is |
| Fence lower left x in microns. The default value is |
| Fence lower left y in microns. The default value is |
| Fence upper right x in microns. The default value is |
| Fence upper right y in microns. The default value is |
| Path to fixed vertices constraint file |
| Path to |
| Path to |
| Path to solution file. |
| Hyperedge timing weight factor (default 1.0, float). |
| Cutting critical timing path weight factor (default 1.0, float). |
| Snaking a critical path weight factor (default 1.0, float). |
| Timing exponential factor for normalized slack (default 1.0, float). |
| Extra delay introduced by a cut (default 1e-9, float). |
| Enable timing guardband option (default false, bool). |
| Hyperedge weight factor. |
| Vertex weight factor. |
| Placement weight factor. |
| Threshold for ignoring large hyperedge. The default value is |
| Number of vertices of coarsest hypergraph. The default value is |
| Number of vertices of the coarsest hypergraph. The default value is |
| Coarsening ratio of two adjacent hypergraphs. The default value is |
| Number of iterations. The default value is |
| Minimum ratio difference of two adjacent hypergraphs. The default value is |
| Minimum number of vertices in each partition. The default value is |
| Number of initial solutions. The default value is |
| Number of top initial solutions to filter out. The default value is |
| Refinement iterations. The default value is |
| The allowed moves for each Fiduccia-Mattheyes (FM) algorithm pass or greedy refinement. The default value is |
| Describes the ratio\(e\) where if the\(n_{moved vertices} > n_{vertices} * e\), the tool exists the current FM pass. The intention behind this is that most of the gains are achieved by the first few FM moves. The default value is |
| Maximum level of traversing the buckets to solve the “corking effect”. The default value is |
| Disables v-cycle is used to refine partitions. The default value is |
| Maximum number of vcycles. The default value is |
| Number of coarsening solutions with different randoms seed. The default value is |
| Describes threshold\(t\), the number of vertices used for integer linear programming (ILP) partitioning. if\(n_{vertices} > t\), do not use ILP-based partitioning. The default value is |
| If the net is larger than this, it will be ignored by TritonPart. The default value is |
Evaluate Netlist Partition#
This command evaluates partition design solution.
evaluate_part_design_solution[-num_partsnum_parts][-balance_constraintbalance_constraint][-base_balancebase_balance][-scale_factorscale_factor][-timing_aware_flagtiming_aware_flag][-top_ntop_n][-fence_flagfence_flag][-fence_lxfence_lx][-fence_lyfence_ly][-fence_uxfence_ux][-fence_uyfence_uy][-fixed_filefixed_file][-community_filecommunity_file][-group_filegroup_file][-hypergraph_filehypergraph_file][-hypergraph_int_weight_filehypergraph_int_weight_file][-solution_filesolution_file][-net_timing_factornet_timing_factor][-path_timing_factorpath_timing_factor][-path_snaking_factorpath_snaking_factor][-timing_exp_factortiming_exp_factor][-extra_delayextra_delay][-guardband_flagguardband_flag][-e_wt_factorse_wt_factors][-v_wt_factorsv_wt_factors]
Options#
Switch Name | Description |
---|---|
| Number of partitions. The default value is |
| Allowed imbalance between blocks. The default value is |
| Tcl list of baseline imbalance between partitions. The default value is |
| KIV. The default value is |
| Enable timing-driven mode. The default value is |
| Extract the top n critical timing paths. The default value is |
| Consider fences in the partitioning. The default value is |
| Fence lower left x in microns. The default value is |
| Fence lower left y in microns. The default value is |
| Fence upper right x in microns. The default value is |
| Fence upper right y in microns. The default value is |
| Path to fixed vertices constraint file. |
| Path to |
| Path to |
| Path to hypergraph file. |
| Path to |
| Path to solution file. |
| Hyperedge timing weight factor. The default value is |
| Cutting critical timing path weight factor. The default value is |
| Snaking a critical path weight factor. The default value is |
| Timing exponential factor for normalized slack. The default value is |
| Extra delay introduced by a cut. The default value is |
| Enable timing guardband option. The default value is 1 |
| Hyperedge weight factors. |
| Vertex weight factors. |
Write Partition to Verilog#
This command writes the partition result to verilog.
write_partition_verilog[-port_prefixprefix][-module_suffixsuffix][-partitioning_idpart_id][file]
Options#
Switch Name | Description |
---|---|
| Port name prefix. |
| Module name suffix. |
| Filename to write partition verilog to. |
Read the Partition file#
This command reads the partition file into design.
read_partitioning-read_filename[-instance_map_filefile_path]
Switch Name | Description |
---|---|
| Read partitioning file (usually with the extension |
| Instance mapping file. |
Example Scripts#
How to partition a hypergraph in the way you would using hMETIS (min-cut partitioning)#
triton_part_hypergraph-hypergraph_filedes90.hgr-num_parts5-balance_constraint2-seed2
You can also check the provided examplehere.
How to perform the embedding-aware partitioning#
set num_parts 2set balance_constraint 2set seed 0set design sparcT1_chip2set hypergraph_file "${design}.hgr"set placement_file "${design}.hgr.ubfactor.2.numparts.2.embedding.dat"set solution_file "${design}.hgr.part.${num_parts}"triton_part_hypergraph -hypergraph_file $hypergraph_file -num_parts $num_parts \ -balance_constraint $balance_constraint \ -seed $seed \ -placement_file ${placement_file} -placement_wt_factors { 0.00005 0.00005 } \ -placement_dimension 2
You can find the provided examplehere.
How to partition a netlist#
# set technology informationset ALL_LEFS “list_of_lefs”set ALL_LIBS “list_of_libs”# set design informationset design “design_name”set top_design “top_design”set netlist “netlist.v”set sdc “timing.sdc”foreach lef_file ${ALL_LEFS} { read_lef $lef_file}foreach lib_file ${ALL_LIBS} { read_lib $lib_file}read_verilog $netlistlink_design $top_designread_sdc $sdcset num_parts 5set balance_constraint 2set seed 0set top_n 100000# set the extra_delay_cut to 20% of the clock period# the extra_delay_cut is introduced for each cut hyperedgeset extra_delay_cut 9.2e-10 set timing_aware_flag trueset timing_guardband trueset part_design_solution_file "${design}_part_design.hgr.part.${num_parts}"################################################################################################ TritonPart with slack progagation##############################################################################################puts "Start TritonPart with slack propagation"# call triton_part to partition the netlisttriton_part_design -num_parts $num_parts -balance_constraint $balance_constraint \ -seed $seed -top_n $top_n \ -timing_aware_flag $timing_aware_flag -extra_delay $extra_delay_cut \ -guardband_flag $timing_guardband \ -solution_file $part_design_solution_file
You can find the provided examplehere.
Regression tests#
There are a set of regression tests in./test
. For more information, refer to thissection.
Simply run the following script:
./test/regression
ArtNet Spec File Generation Flow#
ArtNet is the hierarchical clustering-based artificial netlist generator with the capability to support heterogeneous designs with macros.ArtNet enables netlist generation from (1) user-specified parameters, and (2) from parameters of a given target design.
Use Cases of ArtNet |
Netlist Parameters#
Description of Netlist Parameters |
What is Rent’s exponent?
Rent’s Rule(link)
A heuristic used to describe the relationship between the number of external pins (connections) and the size of a circuit (usually in terms of the number of gates). It provides a simple way to estimate how the complexity of a circuit grows as the number of components increases.
Region1 refers to the portion of the circuit where Rent’s rule is typically valid. In this region, the relationship between internal and external connections follows the power-law form described by Rent’s rule.
InRegion 2, the structure of the circuit may deviate from Rent¡¯s rule and the simple power-law relationship no longer holds as closely.|
||:–:||Region I and II in #Terminals-#Gate Plot |
Spec File Description#
The spec file, which is the input file for ArtNet, is structured as follows.|
||:–:||Example of SpecFile |
LIBRARY: Defines the master names of all standard cells and macros used in the entire circuit.
MODULE: Specifies a submodule within the logical hierarchy under the top module. Multiple types of submodules can be defined; the example includes a single submodule namedsub_module.
LIBRARIES: Lists the masters and MODULEs used within the circuit or submodule. MODULEs can also include LIBRARIES with other MODULE definitions, representing multi-level hierarchy…
DISTRIBUTION: Indicates the quantity of each master or MODULE defined in LIBRARIES.
For example, in the top module, if LIBRARIES includeslib andsub_module, the first DISTRIBUTION line refers to the number of each cell in LIBRARYlib (e.g., 1200 DFFHQx4, 3000 INVx2, etc.).
The second DISTRIBUTION line shows that 10 instances ofsub_module are used under the top module.
SIZE:
The first SIZE defines the physical region size of Region 1 (recommended: 0.25x ~ 0.50x of total number of instances).
The second SIZE indicates the total number of instances in the MODULE or CIRCUIT (recommended: 100 ~ 10^9).
p/q: Represent the interconnect complexity.
p: Rent¡¯s exponent (recommended: 0.4 ~ 0.7)
q: the standard deviation of Rent¡¯s exponent. (recommended: 0.01 ~ 0.2)
I/O: The number of primary inputs and outputs for the MODULE or CIRCUIT. (recommended: 10 ~ 1000)
Parameter Extraction Command#
This command performs ArtNet spec file generation.
write_artnet_spec[-out_filefile]
Options#
Switch Name | Description |
---|---|
| Name of output spec file. |
References#
Bustany, I., Kahng, A. B., Koutis, I., Pramanik, B., & Wang, Z. (2023). K-SpecPart: A Supervised Spectral Framework for Multi-Way Hypergraph Partitioning Solution Improvement. arXiv preprint arXiv:2305.06167.(.pdf)
Bustany, I., Gasparyan, G., Kahng, A. B., Koutis, I., Pramanik, B., & Wang, Z. (2023). “An Open-Source Constraints-Driven General Partitioning Multi-Tool for VLSI Physical Design”, Proc. ACM/IEEE International Conference of Computer-Aided Design 2023,(.pdf).
Landman, B. S., & Russo, R. L. (1971). “On a Pin Versus Block Relationship for Partitions of Logic Graphs”, IEEE Trans. on Computers, 20(12) pp.1469-1479,(link).
License#
BSD 3-Clause License. SeeLICENSE file.