Deploying to gh-pages from @ ehw-fit/ariths-gen@d445f9e3c7 🚀

This commit is contained in:
mrazekv 2022-01-13 15:18:39 +00:00
parent c701230784
commit 717e7a720d
14 changed files with 2510 additions and 64 deletions

View File

@ -155,16 +155,20 @@ class GeneralCircuit():
return multi_bit_comps
@staticmethod
def get_unique_types(components: list):
def get_unique_types(components: list, multi_bit: bool = False):
"""Retrieves just the unique representatives of class types present inside the provided components list.
Args:
components (list): List of components to be filtered.
multi_bit (bool): Specifies whether the provided components list is composed of multi bit type circuits. Defaults to False.
Returns:
list: List of unique composite class types.
"""
return list({type(c): c for c in components}.values())
if multi_bit is True:
return list({(type(c), c.N): c for c in components}.values())
else:
return list({type(c): c for c in components}.values())
def get_component_types(self):
"""Retrieves a list of all the unique types of subcomponents composing the circuit.
@ -178,7 +182,7 @@ class GeneralCircuit():
one_bit_comps = self.get_unique_types(
components=self.get_one_bit_components())
multi_bit_comps = self.get_unique_types(
components=self.get_multi_bit_components())
components=self.get_multi_bit_components(), multi_bit=True)
all_components = gate_comps + one_bit_comps + multi_bit_comps
return all_components
@ -435,7 +439,7 @@ class GeneralCircuit():
str: Hierarchical C code of subcomponent's C function invocation and output assignment.
"""
# Getting name of circuit type for proper C code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+"_", "")
circuit_type = self.__class__(a=Bus("a"), b=Bus("b")).prefix + str(self.N)
return self.a.return_bus_wires_values_c_hier() + self.b.return_bus_wires_values_c_hier() + \
f" {self.out.prefix} = {circuit_type}({self.a.prefix}, {self.b.prefix});\n"
@ -587,13 +591,9 @@ class GeneralCircuit():
str: Hierarchical Verilog code of subcomponent's module invocation and output assignment.
"""
# Getting name of circuit type and insitu copying out bus for proper Verilog code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+"_", "")
# Obtain proper circuit name with its bit width
circuit_prefix = self.__class__(
a=Bus("a"), b=Bus("b")).prefix + str(self.N)
circuit_type = self.__class__(a=Bus("a"), b=Bus("b")).prefix + str(self.N)
circuit_block = self.__class__(a=Bus(N=self.N, prefix="a"), b=Bus(
N=self.N, prefix="b"), name=circuit_prefix)
N=self.N, prefix="b"), name=circuit_type)
return self.a.return_bus_wires_values_v_hier() + self.b.return_bus_wires_values_v_hier() + \
f" {circuit_type} {circuit_type}_{self.out.prefix}(.{circuit_block.a.prefix}({self.a.prefix}), .{circuit_block.b.prefix}({self.b.prefix}), .{circuit_block.out.prefix}({self.out.prefix}));\n"
@ -699,7 +699,7 @@ class GeneralCircuit():
str: Hierarchical Blif code of subcomponent's model invocation and output assignment.
"""
# Getting name of circuit type for proper Blif code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+"_", "")
circuit_type = self.__class__(a=Bus("a"), b=Bus("b")).prefix + str(self.N)
return f"{self.a.get_wire_assign_blif(output=True)}" + \
f"{self.b.get_wire_assign_blif(output=True)}" + \
f".subckt {circuit_type}" + \
@ -945,16 +945,20 @@ that are later used for generation into various representations.</p></div>
return multi_bit_comps
@staticmethod
def get_unique_types(components: list):
def get_unique_types(components: list, multi_bit: bool = False):
&#34;&#34;&#34;Retrieves just the unique representatives of class types present inside the provided components list.
Args:
components (list): List of components to be filtered.
multi_bit (bool): Specifies whether the provided components list is composed of multi bit type circuits. Defaults to False.
Returns:
list: List of unique composite class types.
&#34;&#34;&#34;
return list({type(c): c for c in components}.values())
if multi_bit is True:
return list({(type(c), c.N): c for c in components}.values())
else:
return list({type(c): c for c in components}.values())
def get_component_types(self):
&#34;&#34;&#34;Retrieves a list of all the unique types of subcomponents composing the circuit.
@ -968,7 +972,7 @@ that are later used for generation into various representations.</p></div>
one_bit_comps = self.get_unique_types(
components=self.get_one_bit_components())
multi_bit_comps = self.get_unique_types(
components=self.get_multi_bit_components())
components=self.get_multi_bit_components(), multi_bit=True)
all_components = gate_comps + one_bit_comps + multi_bit_comps
return all_components
@ -1225,7 +1229,7 @@ that are later used for generation into various representations.</p></div>
str: Hierarchical C code of subcomponent&#39;s C function invocation and output assignment.
&#34;&#34;&#34;
# Getting name of circuit type for proper C code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+&#34;_&#34;, &#34;&#34;)
circuit_type = self.__class__(a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
return self.a.return_bus_wires_values_c_hier() + self.b.return_bus_wires_values_c_hier() + \
f&#34; {self.out.prefix} = {circuit_type}({self.a.prefix}, {self.b.prefix});\n&#34;
@ -1377,13 +1381,9 @@ that are later used for generation into various representations.</p></div>
str: Hierarchical Verilog code of subcomponent&#39;s module invocation and output assignment.
&#34;&#34;&#34;
# Getting name of circuit type and insitu copying out bus for proper Verilog code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+&#34;_&#34;, &#34;&#34;)
# Obtain proper circuit name with its bit width
circuit_prefix = self.__class__(
a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
circuit_type = self.__class__(a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
circuit_block = self.__class__(a=Bus(N=self.N, prefix=&#34;a&#34;), b=Bus(
N=self.N, prefix=&#34;b&#34;), name=circuit_prefix)
N=self.N, prefix=&#34;b&#34;), name=circuit_type)
return self.a.return_bus_wires_values_v_hier() + self.b.return_bus_wires_values_v_hier() + \
f&#34; {circuit_type} {circuit_type}_{self.out.prefix}(.{circuit_block.a.prefix}({self.a.prefix}), .{circuit_block.b.prefix}({self.b.prefix}), .{circuit_block.out.prefix}({self.out.prefix}));\n&#34;
@ -1489,7 +1489,7 @@ that are later used for generation into various representations.</p></div>
str: Hierarchical Blif code of subcomponent&#39;s model invocation and output assignment.
&#34;&#34;&#34;
# Getting name of circuit type for proper Blif code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+&#34;_&#34;, &#34;&#34;)
circuit_type = self.__class__(a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
return f&#34;{self.a.get_wire_assign_blif(output=True)}&#34; + \
f&#34;{self.b.get_wire_assign_blif(output=True)}&#34; + \
f&#34;.subckt {circuit_type}&#34; + \
@ -1626,7 +1626,7 @@ def get_includes_c():
</details>
</dd>
<dt id="ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_unique_types"><code class="name flex">
<span>def <span class="ident">get_unique_types</span></span>(<span>components: list)</span>
<span>def <span class="ident">get_unique_types</span></span>(<span>components: list, multi_bit: bool = False)</span>
</code></dt>
<dd>
<div class="desc"><p>Retrieves just the unique representatives of class types present inside the provided components list.</p>
@ -1634,6 +1634,8 @@ def get_includes_c():
<dl>
<dt><strong><code>components</code></strong> :&ensp;<code>list</code></dt>
<dd>List of components to be filtered.</dd>
<dt><strong><code>multi_bit</code></strong> :&ensp;<code>bool</code></dt>
<dd>Specifies whether the provided components list is composed of multi bit type circuits. Defaults to False.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
@ -1645,16 +1647,20 @@ def get_includes_c():
<span>Expand source code</span>
</summary>
<pre><code class="python">@staticmethod
def get_unique_types(components: list):
def get_unique_types(components: list, multi_bit: bool = False):
&#34;&#34;&#34;Retrieves just the unique representatives of class types present inside the provided components list.
Args:
components (list): List of components to be filtered.
multi_bit (bool): Specifies whether the provided components list is composed of multi bit type circuits. Defaults to False.
Returns:
list: List of unique composite class types.
&#34;&#34;&#34;
return list({type(c): c for c in components}.values())</code></pre>
if multi_bit is True:
return list({(type(c), c.N): c for c in components}.values())
else:
return list({type(c): c for c in components}.values())</code></pre>
</details>
</dd>
</dl>
@ -2062,7 +2068,7 @@ Other wires indexes start counting from 2 and up.</p></div>
one_bit_comps = self.get_unique_types(
components=self.get_one_bit_components())
multi_bit_comps = self.get_unique_types(
components=self.get_multi_bit_components())
components=self.get_multi_bit_components(), multi_bit=True)
all_components = gate_comps + one_bit_comps + multi_bit_comps
return all_components</code></pre>
@ -2750,7 +2756,7 @@ inside the upper component from which function block has been invoked.</p>
str: Hierarchical Blif code of subcomponent&#39;s model invocation and output assignment.
&#34;&#34;&#34;
# Getting name of circuit type for proper Blif code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+&#34;_&#34;, &#34;&#34;)
circuit_type = self.__class__(a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
return f&#34;{self.a.get_wire_assign_blif(output=True)}&#34; + \
f&#34;{self.b.get_wire_assign_blif(output=True)}&#34; + \
f&#34;.subckt {circuit_type}&#34; + \
@ -2882,7 +2888,7 @@ the upper component from which function block has been invoked.</p>
str: Hierarchical C code of subcomponent&#39;s C function invocation and output assignment.
&#34;&#34;&#34;
# Getting name of circuit type for proper C code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+&#34;_&#34;, &#34;&#34;)
circuit_type = self.__class__(a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
return self.a.return_bus_wires_values_c_hier() + self.b.return_bus_wires_values_c_hier() + \
f&#34; {self.out.prefix} = {circuit_type}({self.a.prefix}, {self.b.prefix});\n&#34;</code></pre>
</details>
@ -2923,13 +2929,9 @@ the upper component from which function block has been invoked.</p>
str: Hierarchical Verilog code of subcomponent&#39;s module invocation and output assignment.
&#34;&#34;&#34;
# Getting name of circuit type and insitu copying out bus for proper Verilog code generation without affecting actual generated composition
circuit_type = self.prefix.replace(circuit_prefix+&#34;_&#34;, &#34;&#34;)
# Obtain proper circuit name with its bit width
circuit_prefix = self.__class__(
a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
circuit_type = self.__class__(a=Bus(&#34;a&#34;), b=Bus(&#34;b&#34;)).prefix + str(self.N)
circuit_block = self.__class__(a=Bus(N=self.N, prefix=&#34;a&#34;), b=Bus(
N=self.N, prefix=&#34;b&#34;), name=circuit_prefix)
N=self.N, prefix=&#34;b&#34;), name=circuit_type)
return self.a.return_bus_wires_values_v_hier() + self.b.return_bus_wires_values_v_hier() + \
f&#34; {circuit_type} {circuit_type}_{self.out.prefix}(.{circuit_block.a.prefix}({self.a.prefix}), .{circuit_block.b.prefix}({self.b.prefix}), .{circuit_block.out.prefix}({self.out.prefix}));\n&#34;</code></pre>
</details>

View File

@ -57,22 +57,43 @@ class MultiplierCircuit(ArithmeticCircuit):
that are later used for generation into various representations.
&#34;&#34;&#34;
def __init__(self, a, b, prefix, name, out_N, **kwargs):
def __init__(self, a, b, prefix: str, name: str, out_N: int, **kwargs):
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=out_N, **kwargs)
# Array multipliers
def get_previous_partial_product(self, a_index: int, b_index: int):
def get_previous_partial_product(self, a_index: int, b_index: int, mult_type=&#34;&#34;):
&#34;&#34;&#34;Used in array multipliers to get previous row&#39;s component output wires for further connection to another component&#39;s input.
Args:
a_index (int): First input wire index.
b_index (int): Second input wire index.
mult_type (string, optional): Specifies what type of multiplier circuit has called this method. It is used for proper retrieval of index into the components list to allow appropriate interconnection of the multiplier circuit&#39;s inner subcomponents. It expects &#34;&#34; for ordinary multipliers, `bam` or `tm` for specific approximate multipliers. Defaults to &#34;&#34;.
Returns:
Wire: Previous row&#39;s component wire of corresponding pp.
&#34;&#34;&#34;
# To get the index of previous row&#39;s connecting adder and its generated pp
index = ((b_index-2) * (self.N*2)) + ((self.N-1)+2*(a_index+2))
if mult_type == &#34;bam&#34;:
#TODO alter to be more compact
ids_sum = 0
for row in range(self.horizontal_cut + self.ommited_rows, b_index):
first_row_elem_id = self.vertical_cut-row if self.vertical_cut-row &gt; 0 else 0
# First pp row composed just from gates
if row == self.horizontal_cut + self.ommited_rows:
# Minus one because the first component has index 0 instead of 1
ids_sum += sum([1 for gate_pos in range(first_row_elem_id, self.N)])-1
elif row == b_index-1:
ids_sum += sum([2 for gate_adder_pos in range(first_row_elem_id, self.N) if gate_adder_pos &lt;= a_index+1])
else:
ids_sum += sum([2 for gate_adder_pos in range(first_row_elem_id, self.N)])
# Index calculation should be redone, but it works even this way
index = ids_sum+2 if a_index == self.N-1 else ids_sum
elif mult_type == &#34;tm&#34;:
index = ((b_index-self.truncation_cut-2) * ((self.N-self.truncation_cut)*2)) + ((self.N-self.truncation_cut-1)+2*(a_index-self.truncation_cut+2))
else:
index = ((b_index-2) * ((self.N)*2)) + ((self.N-1)+2*(a_index+2))
# Get carry wire as input for the last adder in current row
if a_index == self.N-1:
@ -266,7 +287,7 @@ class MultiplierCircuit(ArithmeticCircuit):
<dl>
<dt id="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit"><code class="flex name class">
<span>class <span class="ident">MultiplierCircuit</span></span>
<span>(</span><span>a, b, prefix, name, out_N, **kwargs)</span>
<span>(</span><span>a, b, prefix: str, name: str, out_N: int, **kwargs)</span>
</code></dt>
<dd>
<div class="desc"><p>Class represents a general multiplier circuit derived from <code>ArithmeticCircuit</code> class.</p>
@ -283,22 +304,43 @@ that are later used for generation into various representations.</p></div>
that are later used for generation into various representations.
&#34;&#34;&#34;
def __init__(self, a, b, prefix, name, out_N, **kwargs):
def __init__(self, a, b, prefix: str, name: str, out_N: int, **kwargs):
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=out_N, **kwargs)
# Array multipliers
def get_previous_partial_product(self, a_index: int, b_index: int):
def get_previous_partial_product(self, a_index: int, b_index: int, mult_type=&#34;&#34;):
&#34;&#34;&#34;Used in array multipliers to get previous row&#39;s component output wires for further connection to another component&#39;s input.
Args:
a_index (int): First input wire index.
b_index (int): Second input wire index.
mult_type (string, optional): Specifies what type of multiplier circuit has called this method. It is used for proper retrieval of index into the components list to allow appropriate interconnection of the multiplier circuit&#39;s inner subcomponents. It expects &#34;&#34; for ordinary multipliers, `bam` or `tm` for specific approximate multipliers. Defaults to &#34;&#34;.
Returns:
Wire: Previous row&#39;s component wire of corresponding pp.
&#34;&#34;&#34;
# To get the index of previous row&#39;s connecting adder and its generated pp
index = ((b_index-2) * (self.N*2)) + ((self.N-1)+2*(a_index+2))
if mult_type == &#34;bam&#34;:
#TODO alter to be more compact
ids_sum = 0
for row in range(self.horizontal_cut + self.ommited_rows, b_index):
first_row_elem_id = self.vertical_cut-row if self.vertical_cut-row &gt; 0 else 0
# First pp row composed just from gates
if row == self.horizontal_cut + self.ommited_rows:
# Minus one because the first component has index 0 instead of 1
ids_sum += sum([1 for gate_pos in range(first_row_elem_id, self.N)])-1
elif row == b_index-1:
ids_sum += sum([2 for gate_adder_pos in range(first_row_elem_id, self.N) if gate_adder_pos &lt;= a_index+1])
else:
ids_sum += sum([2 for gate_adder_pos in range(first_row_elem_id, self.N)])
# Index calculation should be redone, but it works even this way
index = ids_sum+2 if a_index == self.N-1 else ids_sum
elif mult_type == &#34;tm&#34;:
index = ((b_index-self.truncation_cut-2) * ((self.N-self.truncation_cut)*2)) + ((self.N-self.truncation_cut-1)+2*(a_index-self.truncation_cut+2))
else:
index = ((b_index-2) * ((self.N)*2)) + ((self.N-1)+2*(a_index+2))
# Get carry wire as input for the last adder in current row
if a_index == self.N-1:
@ -487,6 +529,10 @@ that are later used for generation into various representations.</p></div>
</ul>
<h3>Subclasses</h3>
<ul class="hlist">
<li><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier.SignedBrokenArrayMultiplier" href="../../multi_bit_circuits/approximate_multipliers/broken_array_multiplier.html#ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier.SignedBrokenArrayMultiplier">SignedBrokenArrayMultiplier</a></li>
<li><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier.UnsignedBrokenArrayMultiplier" href="../../multi_bit_circuits/approximate_multipliers/broken_array_multiplier.html#ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier.UnsignedBrokenArrayMultiplier">UnsignedBrokenArrayMultiplier</a></li>
<li><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.SignedTruncatedMultiplier" href="../../multi_bit_circuits/approximate_multipliers/truncated_multiplier.html#ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.SignedTruncatedMultiplier">SignedTruncatedMultiplier</a></li>
<li><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.UnsignedTruncatedMultiplier" href="../../multi_bit_circuits/approximate_multipliers/truncated_multiplier.html#ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.UnsignedTruncatedMultiplier">UnsignedTruncatedMultiplier</a></li>
<li><a title="ariths_gen.multi_bit_circuits.multipliers.array_multiplier.SignedArrayMultiplier" href="../../multi_bit_circuits/multipliers/array_multiplier.html#ariths_gen.multi_bit_circuits.multipliers.array_multiplier.SignedArrayMultiplier">SignedArrayMultiplier</a></li>
<li><a title="ariths_gen.multi_bit_circuits.multipliers.array_multiplier.UnsignedArrayMultiplier" href="../../multi_bit_circuits/multipliers/array_multiplier.html#ariths_gen.multi_bit_circuits.multipliers.array_multiplier.UnsignedArrayMultiplier">UnsignedArrayMultiplier</a></li>
<li><a title="ariths_gen.multi_bit_circuits.multipliers.dadda_multiplier.SignedDaddaMultiplier" href="../../multi_bit_circuits/multipliers/dadda_multiplier.html#ariths_gen.multi_bit_circuits.multipliers.dadda_multiplier.SignedDaddaMultiplier">SignedDaddaMultiplier</a></li>
@ -733,7 +779,7 @@ if not the wire present at the desired position is returned.</p>
</details>
</dd>
<dt id="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_partial_product"><code class="name flex">
<span>def <span class="ident">get_previous_partial_product</span></span>(<span>self, a_index: int, b_index: int)</span>
<span>def <span class="ident">get_previous_partial_product</span></span>(<span>self, a_index: int, b_index: int, mult_type='')</span>
</code></dt>
<dd>
<div class="desc"><p>Used in array multipliers to get previous row's component output wires for further connection to another component's input.</p>
@ -743,6 +789,8 @@ if not the wire present at the desired position is returned.</p>
<dd>First input wire index.</dd>
<dt><strong><code>b_index</code></strong> :&ensp;<code>int</code></dt>
<dd>Second input wire index.</dd>
<dt><strong><code>mult_type</code></strong> :&ensp;<code>string</code>, optional</dt>
<dd>Specifies what type of multiplier circuit has called this method. It is used for proper retrieval of index into the components list to allow appropriate interconnection of the multiplier circuit's inner subcomponents. It expects "" for ordinary multipliers, <code>bam</code> or <code>tm</code> for specific approximate multipliers. Defaults to "".</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
@ -753,18 +801,39 @@ if not the wire present at the desired position is returned.</p>
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_previous_partial_product(self, a_index: int, b_index: int):
<pre><code class="python">def get_previous_partial_product(self, a_index: int, b_index: int, mult_type=&#34;&#34;):
&#34;&#34;&#34;Used in array multipliers to get previous row&#39;s component output wires for further connection to another component&#39;s input.
Args:
a_index (int): First input wire index.
b_index (int): Second input wire index.
mult_type (string, optional): Specifies what type of multiplier circuit has called this method. It is used for proper retrieval of index into the components list to allow appropriate interconnection of the multiplier circuit&#39;s inner subcomponents. It expects &#34;&#34; for ordinary multipliers, `bam` or `tm` for specific approximate multipliers. Defaults to &#34;&#34;.
Returns:
Wire: Previous row&#39;s component wire of corresponding pp.
&#34;&#34;&#34;
# To get the index of previous row&#39;s connecting adder and its generated pp
index = ((b_index-2) * (self.N*2)) + ((self.N-1)+2*(a_index+2))
if mult_type == &#34;bam&#34;:
#TODO alter to be more compact
ids_sum = 0
for row in range(self.horizontal_cut + self.ommited_rows, b_index):
first_row_elem_id = self.vertical_cut-row if self.vertical_cut-row &gt; 0 else 0
# First pp row composed just from gates
if row == self.horizontal_cut + self.ommited_rows:
# Minus one because the first component has index 0 instead of 1
ids_sum += sum([1 for gate_pos in range(first_row_elem_id, self.N)])-1
elif row == b_index-1:
ids_sum += sum([2 for gate_adder_pos in range(first_row_elem_id, self.N) if gate_adder_pos &lt;= a_index+1])
else:
ids_sum += sum([2 for gate_adder_pos in range(first_row_elem_id, self.N)])
# Index calculation should be redone, but it works even this way
index = ids_sum+2 if a_index == self.N-1 else ids_sum
elif mult_type == &#34;tm&#34;:
index = ((b_index-self.truncation_cut-2) * ((self.N-self.truncation_cut)*2)) + ((self.N-self.truncation_cut-1)+2*(a_index-self.truncation_cut+2))
else:
index = ((b_index-2) * ((self.N)*2)) + ((self.N-1)+2*(a_index+2))
# Get carry wire as input for the last adder in current row
if a_index == self.N-1:

View File

@ -39,8 +39,11 @@ from .one_bit_circuits import (
from .multi_bit_circuits import (
adders,
multipliers,
approximate_multipliers,
dividers
)</code></pre>
)
from .pdk import *</code></pre>
</details>
</section>
<section>
@ -58,6 +61,10 @@ from .multi_bit_circuits import (
<dd>
<div class="desc"></div>
</dd>
<dt><code class="name"><a title="ariths_gen.pdk" href="pdk.html">ariths_gen.pdk</a></code></dt>
<dd>
<div class="desc"><p>Support of custom PDK …</p></div>
</dd>
<dt><code class="name"><a title="ariths_gen.wire_components" href="wire_components/index.html">ariths_gen.wire_components</a></code></dt>
<dd>
<div class="desc"></div>
@ -82,6 +89,7 @@ from .multi_bit_circuits import (
<li><code><a title="ariths_gen.core" href="core/index.html">ariths_gen.core</a></code></li>
<li><code><a title="ariths_gen.multi_bit_circuits" href="multi_bit_circuits/index.html">ariths_gen.multi_bit_circuits</a></code></li>
<li><code><a title="ariths_gen.one_bit_circuits" href="one_bit_circuits/index.html">ariths_gen.one_bit_circuits</a></code></li>
<li><code><a title="ariths_gen.pdk" href="pdk.html">ariths_gen.pdk</a></code></li>
<li><code><a title="ariths_gen.wire_components" href="wire_components/index.html">ariths_gen.wire_components</a></code></li>
</ul>
</li>

View File

@ -95,7 +95,7 @@ class UnsignedCarryLookaheadAdder(ArithmeticCircuit):
&#34;&#34;&#34;
def __init__(self, a: Bus, b: Bus, cla_block_size: int = 4, prefix: str = &#34;&#34;, name: str = &#34;u_cla&#34;, **kwargs):
self.N = max(a.N, b.N)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N+1, **kwargs)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N+1, **kwargs)
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
@ -486,7 +486,7 @@ Cout S3 S1 S0 S0
&#34;&#34;&#34;
def __init__(self, a: Bus, b: Bus, cla_block_size: int = 4, prefix: str = &#34;&#34;, name: str = &#34;u_cla&#34;, **kwargs):
self.N = max(a.N, b.N)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N+1, **kwargs)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N+1, **kwargs)
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)

View File

@ -93,7 +93,7 @@ class UnsignedPGRippleCarryAdder(ArithmeticCircuit):
def __init__(self, a: Bus, b: Bus, prefix: str = &#34;&#34;, name: str = &#34;u_pg_rca&#34;, **kwargs):
self.N = max(a.N, b.N)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N+1, **kwargs)
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)
@ -433,7 +433,7 @@ Cout S3 S1 S0 S0
def __init__(self, a: Bus, b: Bus, prefix: str = &#34;&#34;, name: str = &#34;u_pg_rca&#34;, **kwargs):
self.N = max(a.N, b.N)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N+1, **kwargs)
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>ariths_gen.multi_bit_circuits.approximate_multipliers API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>ariths_gen.multi_bit_circuits.approximate_multipliers</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier import (
UnsignedTruncatedMultiplier,
SignedTruncatedMultiplier
)
from ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier import (
UnsignedBrokenArrayMultiplier,
SignedBrokenArrayMultiplier
)</code></pre>
</details>
</section>
<section>
<h2 class="section-title" id="header-submodules">Sub-modules</h2>
<dl>
<dt><code class="name"><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier" href="broken_array_multiplier.html">ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier</a></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt><code class="name"><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier" href="truncated_multiplier.html">ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier</a></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="ariths_gen.multi_bit_circuits" href="../index.html">ariths_gen.multi_bit_circuits</a></code></li>
</ul>
</li>
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
<ul>
<li><code><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier" href="broken_array_multiplier.html">ariths_gen.multi_bit_circuits.approximate_multipliers.broken_array_multiplier</a></code></li>
<li><code><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier" href="truncated_multiplier.html">ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>

View File

@ -0,0 +1,885 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier API documentation</title>
<meta name="description" content="" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from ariths_gen.wire_components import (
Wire,
ConstantWireValue0,
ConstantWireValue1,
Bus
)
from ariths_gen.core.arithmetic_circuits import (
ArithmeticCircuit,
MultiplierCircuit
)
from ariths_gen.one_bit_circuits.one_bit_components import (
HalfAdder,
FullAdder,
FullAdderPG
)
from ariths_gen.one_bit_circuits.logic_gates import (
AndGate,
NandGate,
OrGate,
NorGate,
XorGate,
XnorGate,
NotGate
)
from ariths_gen.multi_bit_circuits.multipliers import(
UnsignedArrayMultiplier,
SignedArrayMultiplier
)
class UnsignedTruncatedMultiplier(MultiplierCircuit):
&#34;&#34;&#34;Class representing unsigned truncated multiplier.
It represents an approximative version of unsigned array multiplier with simpler structure.
It is created by modifying an ordinary N-bit unsigned array multiplier by ignoring
(truncating) some of the partial products.
The design promises better area and power parameters in exchange for the loss of computation precision.
```
CUT=2
A3B0 A2B0 │ A1B0 A0B0
┌───┐ ┌───┐ ┌───┐ ┌───┐
│AND│ │AND│ │ │AND│ │AND│
└───┘ └───┘ └───┘ └───┘
┌ ─ ─ ─ ┘
A3B1 A2B1 A1B1 A0B1
┌───┐ ┌───┐ │ ┌───┐ ┌───┐
│AND│ │AND│ │AND│ │AND│
└───┘ └───┘ │ └───┘ └───┘
┌────┐ ┌────┐ ┌────┐ ┌────┐
│ │ │ │ │ │ │ │ │
│ HA │ │ FA │ │ FA │ │ HA │
│ │ │ │ │ │ │ │ │
└────┘ └────┘ └────┘ └────┘
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┬ ─ ─ ─ ─ ┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ CUT=2
A3B2 A2B2 A1B2 A0B2
┌▼─▼┐ ┌▼─▼┐ │ ┌───┐ ┌───┐
│AND│ │AND│ │AND│ │AND│
└┬──┘ └┬──┘ │ └───┘ └───┘
│ │ ┌────┐ ┌────┐
│ │ │ │ │ │ │
│ ┌ ─ ┼─ ─ ─ ┘ │ FA │ │ HA │
│ │ │ │ │ │
│ │ │ └────┘ └────┘
A3B3 │ A2B3 │ A1B3 A0B3
┌◄─►┐ │ ┌◄─►┐ │ │ ┌───┐ ┌───┐
│AND│ │ │AND│ │ │AND│ │AND│
└┬──┘ │ └┬──┘ │ │ └───┘ └───┘
┌───▼┐ ┌▼──▼┐ ┌┼───┐ ┌────┐
│ │ │ │ │ ││ │ │ │
┌──────┤ HA │◄────┤ HA │ ││FA │ │ HA │
│ │ │ │ │ │ ││ │ │ │
│ └──┬─┘ └──┬─┘ └┼───┘ └────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
P7 P6 P5 │ P4 P3=0 P2=0 P1=0 P0=0
```
Description of the __init__ method.
Args:
a (Bus): First input bus.
b (Bus): Second input bus.
truncation_cut (int, optional): Specifies truncation cut level used in the truncated multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.
prefix (str, optional): Prefix name of unsigned truncated multiplier. Defaults to &#34;&#34;.
name (str, optional): Name of unsigned truncated multiplier. Defaults to &#34;u_tm&#34;.
&#34;&#34;&#34;
def __init__(self, a: Bus, b: Bus, truncation_cut: int = 0, prefix: str = &#34;&#34;, name: str = &#34;u_tm&#34;, **kwargs):
# NOTE: If truncation_cut is specified as 0 the final circuit is a simple array multiplier
self.truncation_cut = truncation_cut
self.N = max(a.N, b.N)
# Cut level should be: 0 &lt;= truncation_cut &lt; N
assert truncation_cut &lt; self.N
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N*2, **kwargs)
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)
# Gradual generation of partial products
for b_multiplier_index in range(self.truncation_cut, self.N):
for a_multiplicand_index in range(self.truncation_cut, self.N):
# AND gates generation for calculation of partial products
obj_and = AndGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+&#34;_and&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_and)
if b_multiplier_index != self.truncation_cut:
previous_product = self.components[a_multiplicand_index + b_multiplier_index - 2*self.truncation_cut].out if b_multiplier_index == self.truncation_cut + 1 else self.get_previous_partial_product(a_index=a_multiplicand_index, b_index=b_multiplier_index, mult_type=&#34;tm&#34;)
# HA generation for first 1-bit adder in each row starting from the second one
if a_multiplicand_index == self.truncation_cut:
obj_adder = HalfAdder(self.get_previous_component().out, previous_product, prefix=self.prefix+&#34;_ha&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# Product generation
self.out.connect(b_multiplier_index + self.truncation_cut, obj_adder.get_sum_wire())
# HA generation, last 1-bit adder in second row
elif a_multiplicand_index == self.N-1 and b_multiplier_index == self.truncation_cut+1:
obj_adder = HalfAdder(self.get_previous_component().out, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+&#34;_ha&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# FA generation
else:
obj_adder = FullAdder(self.get_previous_component().out, previous_product, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+&#34;_fa&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# PRODUCT GENERATION
if (a_multiplicand_index == self.truncation_cut and b_multiplier_index == self.truncation_cut) or (self.truncation_cut == self.N-1):
self.out.connect(a_multiplicand_index + b_multiplier_index, obj_and.out)
# 1 bit multiplier case
if a_multiplicand_index == self.N-1 and b_multiplier_index == self.N-1:
self.out.connect(a_multiplicand_index+b_multiplier_index+1, ConstantWireValue0())
elif b_multiplier_index == self.N-1 and self.truncation_cut != self.N-1:
self.out.connect(b_multiplier_index + a_multiplicand_index, obj_adder.get_sum_wire())
if a_multiplicand_index == self.N-1:
self.out.connect(self.out.N-1, obj_adder.get_carry_wire())
# Connecting the output bits generated from ommited cells to ground
for grounded_out_index in range(0, self.truncation_cut*2):
self.out.connect(grounded_out_index, ConstantWireValue0())
class SignedTruncatedMultiplier(MultiplierCircuit):
&#34;&#34;&#34;Class representing signed truncated multiplier.
It represents an approximative version of signed array multiplier with simpler structure.
It is created by modifying an ordinary N-bit signed array multiplier by ignoring
(truncating) some of the partial products.
The design promises better area and power parameters in exchange for the loss of computation precision.
```TODO
A3B0 A2B0 A1B0 A0B0
│ │ │ │ │ │ │ │
┌▼─▼─┐ ┌▼─▼┐ ┌▼─▼┐ ┌▼─▼┐
│NAND│ │AND│ │AND│ │AND│
└┬───┘ └┬──┘ └┬──┘ └─┬─┘
A3B1 │ A2B1 │ A1B1 │ A0B1 │
┌▼─▼─┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │
│NAND│ │ │AND│ │ │AND│ │ │AND│ │
1 └┬───┘ │ └┬──┘ │ └┬──┘ │ └┬──┘ │
│ │ │ │ │ │ │ │ │
┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │
│ │ │ │ │ │ │ │ │
┌───────┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │
│ │ │ │ │ │ │ │ │ │
│ └┬───┘ └┬───┘ └┬───┘ └─┬──┘ │
│ A3B2 │ A2B2 │ A1B2 │ A0B2 │ │
│ ┌▼─▼─┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ │
│ │NAND│ │ │AND│ │ │AND│ │ │AND│ │ │
│ └┬───┘ │ └┬──┘ │ └┬──┘ │ └┬──┘ │ │
│ │ │ │ │ │ │ │ │ │
┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │ │
│ │ │ │ │ │ │ │ │ │
┌───────┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │ │
│ │ │ │ │ │ │ │ │ │ │
│ └┬───┘ └┬───┘ └┬───┘ └─┬──┘ │ │
│ A3B3 │ A2B3 │ A1B3 │ A0B3 │ │ │
│ ┌▼─▼┐ │ ┌▼─▼─┐ │ ┌▼─▼─┐ │ ┌▼─▼─┐ │ │ │
│ │AND│ │ │NAND│ │ │NAND│ │ │NAND│ │ │ │
1 │ └┬──┘ │ └┬───┘ │ └┬───┘ │ └┬───┘ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
┌─▼──┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
│XOR │◄──┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
└─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ │ │ │
│ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
P7 P6 P5 P4 P3 P2 P1 P0
```
Description of the __init__ method.
Args:
a (Bus): First input bus.
b (Bus): Second input bus.
truncation_cut (int, optional): Specifies truncation cut level used in the truncated multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.
prefix (str, optional): Prefix name of signed truncated multiplier. Defaults to &#34;&#34;.
name (str, optional): Name of signed truncated multiplier. Defaults to &#34;s_tm&#34;.
&#34;&#34;&#34;
def __init__(self, a: Bus, b: Bus, truncation_cut: int = 0, prefix: str = &#34;&#34;, name: str = &#34;s_tm&#34;, **kwargs):
# NOTE: If truncation_cut is specified as 0 the final circuit is a simple array multiplier
self.truncation_cut = truncation_cut
self.N = max(a.N, b.N)
# Cut level should be: 0 &lt;= truncation_cut &lt; N
assert truncation_cut &lt; self.N
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N*2, signed=True, **kwargs)
self.c_data_type = &#34;int64_t&#34;
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)
# Gradual generation of partial products
for b_multiplier_index in range(self.truncation_cut, self.N):
for a_multiplicand_index in range(self.truncation_cut, self.N):
# AND and NAND gates generation for calculation of partial products and sign extension
if (b_multiplier_index == self.N-1 and a_multiplicand_index != self.N-1) or (b_multiplier_index != self.N-1 and a_multiplicand_index == self.N-1):
obj_nand = NandGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+&#34;_nand&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index), parent_component=self)
self.add_component(obj_nand)
else:
obj_and = AndGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+&#34;_and&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index), parent_component=self)
self.add_component(obj_and)
if b_multiplier_index != self.truncation_cut:
previous_product = self.components[a_multiplicand_index + b_multiplier_index - 2*self.truncation_cut].out if b_multiplier_index == self.truncation_cut + 1 else self.get_previous_partial_product(a_index=a_multiplicand_index, b_index=b_multiplier_index, mult_type=&#34;tm&#34;)
# HA generation for first 1-bit adder in each row starting from the second one
if a_multiplicand_index == self.truncation_cut:
obj_adder = HalfAdder(self.get_previous_component().out, previous_product, prefix=self.prefix+&#34;_ha&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# Product generation
self.out.connect(b_multiplier_index + self.truncation_cut, obj_adder.get_sum_wire())
# FA generation
else:
# Constant wire with value 1 used at the last FA in second row (as one of its inputs) for signed multiplication (based on Baugh Wooley algorithm)
if a_multiplicand_index == self.N-1 and b_multiplier_index == self.truncation_cut+1:
previous_product = ConstantWireValue1()
obj_adder = FullAdder(self.get_previous_component().out, previous_product, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+&#34;_fa&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# PRODUCT GENERATION
if (a_multiplicand_index == self.truncation_cut and b_multiplier_index == self.truncation_cut) or (self.truncation_cut == self.N-1):
self.out.connect(a_multiplicand_index + b_multiplier_index, obj_and.out)
# 1 bit multiplier case
if a_multiplicand_index == self.N-1 and b_multiplier_index == self.N-1:
obj_nor = NorGate(ConstantWireValue1(), self.get_previous_component().out, prefix=self.prefix+&#34;_nor_zero_extend&#34;, parent_component=self)
self.add_component(obj_nor)
self.out.connect(a_multiplicand_index+1, obj_nor.out)
elif b_multiplier_index == self.N-1 and self.truncation_cut != self.N-1:
self.out.connect(b_multiplier_index + a_multiplicand_index, obj_adder.get_sum_wire())
if a_multiplicand_index == self.N-1:
obj_xor = XorGate(self.get_previous_component().get_carry_wire(), ConstantWireValue1(), prefix=self.prefix+&#34;_xor&#34;+str(a_multiplicand_index+1)+&#34;_&#34;+str(b_multiplier_index), parent_component=self)
self.add_component(obj_xor)
self.out.connect(self.out.N-1, obj_xor.out)
# Connecting the output bits generated from ommited cells to ground
for grounded_out_index in range(0, self.truncation_cut*2):
self.out.connect(grounded_out_index, ConstantWireValue0())</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.SignedTruncatedMultiplier"><code class="flex name class">
<span>class <span class="ident">SignedTruncatedMultiplier</span></span>
<span>(</span><span>a: <a title="ariths_gen.wire_components.buses.Bus" href="../../wire_components/buses.html#ariths_gen.wire_components.buses.Bus">Bus</a>, b: <a title="ariths_gen.wire_components.buses.Bus" href="../../wire_components/buses.html#ariths_gen.wire_components.buses.Bus">Bus</a>, truncation_cut: int = 0, prefix: str = '', name: str = 's_tm', **kwargs)</span>
</code></dt>
<dd>
<div class="desc"><p>Class representing signed truncated multiplier.</p>
<p>It represents an approximative version of signed array multiplier with simpler structure.
It is created by modifying an ordinary N-bit signed array multiplier by ignoring
(truncating) some of the partial products.</p>
<p>The design promises better area and power parameters in exchange for the loss of computation precision.</p>
<pre><code class="language-TODO"> A3B0 A2B0 A1B0 A0B0
│ │ │ │ │ │ │ │
┌▼─▼─┐ ┌▼─▼┐ ┌▼─▼┐ ┌▼─▼┐
│NAND│ │AND│ │AND│ │AND│
└┬───┘ └┬──┘ └┬──┘ └─┬─┘
A3B1 │ A2B1 │ A1B1 │ A0B1 │
┌▼─▼─┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │
│NAND│ │ │AND│ │ │AND│ │ │AND│ │
1 └┬───┘ │ └┬──┘ │ └┬──┘ │ └┬──┘ │
│ │ │ │ │ │ │ │ │
┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │
│ │ │ │ │ │ │ │ │
┌───────┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │
│ │ │ │ │ │ │ │ │ │
│ └┬───┘ └┬───┘ └┬───┘ └─┬──┘ │
│ A3B2 │ A2B2 │ A1B2 │ A0B2 │ │
│ ┌▼─▼─┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ │
│ │NAND│ │ │AND│ │ │AND│ │ │AND│ │ │
│ └┬───┘ │ └┬──┘ │ └┬──┘ │ └┬──┘ │ │
│ │ │ │ │ │ │ │ │ │
┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │ │
│ │ │ │ │ │ │ │ │ │
┌───────┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │ │
│ │ │ │ │ │ │ │ │ │ │
│ └┬───┘ └┬───┘ └┬───┘ └─┬──┘ │ │
│ A3B3 │ A2B3 │ A1B3 │ A0B3 │ │ │
│ ┌▼─▼┐ │ ┌▼─▼─┐ │ ┌▼─▼─┐ │ ┌▼─▼─┐ │ │ │
│ │AND│ │ │NAND│ │ │NAND│ │ │NAND│ │ │ │
1 │ └┬──┘ │ └┬───┘ │ └┬───┘ │ └┬───┘ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
┌─▼──┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
│XOR │◄──┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
└─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ │ │ │
│ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
P7 P6 P5 P4 P3 P2 P1 P0
</code></pre>
<p>Description of the <strong>init</strong> method.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>a</code></strong> :&ensp;<code>Bus</code></dt>
<dd>First input bus.</dd>
<dt><strong><code>b</code></strong> :&ensp;<code>Bus</code></dt>
<dd>Second input bus.</dd>
<dt><strong><code>truncation_cut</code></strong> :&ensp;<code>int</code>, optional</dt>
<dd>Specifies truncation cut level used in the truncated multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.</dd>
<dt><strong><code>prefix</code></strong> :&ensp;<code>str</code>, optional</dt>
<dd>Prefix name of signed truncated multiplier. Defaults to "".</dd>
<dt><strong><code>name</code></strong> :&ensp;<code>str</code>, optional</dt>
<dd>Name of signed truncated multiplier. Defaults to "s_tm".</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class SignedTruncatedMultiplier(MultiplierCircuit):
&#34;&#34;&#34;Class representing signed truncated multiplier.
It represents an approximative version of signed array multiplier with simpler structure.
It is created by modifying an ordinary N-bit signed array multiplier by ignoring
(truncating) some of the partial products.
The design promises better area and power parameters in exchange for the loss of computation precision.
```TODO
A3B0 A2B0 A1B0 A0B0
│ │ │ │ │ │ │ │
┌▼─▼─┐ ┌▼─▼┐ ┌▼─▼┐ ┌▼─▼┐
│NAND│ │AND│ │AND│ │AND│
└┬───┘ └┬──┘ └┬──┘ └─┬─┘
A3B1 │ A2B1 │ A1B1 │ A0B1 │
┌▼─▼─┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │
│NAND│ │ │AND│ │ │AND│ │ │AND│ │
1 └┬───┘ │ └┬──┘ │ └┬──┘ │ └┬──┘ │
│ │ │ │ │ │ │ │ │
┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │
│ │ │ │ │ │ │ │ │
┌───────┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │
│ │ │ │ │ │ │ │ │ │
│ └┬───┘ └┬───┘ └┬───┘ └─┬──┘ │
│ A3B2 │ A2B2 │ A1B2 │ A0B2 │ │
│ ┌▼─▼─┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ ┌▼─▼┐ │ │
│ │NAND│ │ │AND│ │ │AND│ │ │AND│ │ │
│ └┬───┘ │ └┬──┘ │ └┬──┘ │ └┬──┘ │ │
│ │ │ │ │ │ │ │ │ │
┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │ │
│ │ │ │ │ │ │ │ │ │
┌───────┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │ │
│ │ │ │ │ │ │ │ │ │ │
│ └┬───┘ └┬───┘ └┬───┘ └─┬──┘ │ │
│ A3B3 │ A2B3 │ A1B3 │ A0B3 │ │ │
│ ┌▼─▼┐ │ ┌▼─▼─┐ │ ┌▼─▼─┐ │ ┌▼─▼─┐ │ │ │
│ │AND│ │ │NAND│ │ │NAND│ │ │NAND│ │ │ │
1 │ └┬──┘ │ └┬───┘ │ └┬───┘ │ └┬───┘ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
┌─▼──┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ ┌▼──▼┐ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
│XOR │◄──┤ FA │◄──┤ FA │◄──┤ FA │◄──┤ HA │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │
└─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ └─┬──┘ │ │ │
│ │ │ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
P7 P6 P5 P4 P3 P2 P1 P0
```
Description of the __init__ method.
Args:
a (Bus): First input bus.
b (Bus): Second input bus.
truncation_cut (int, optional): Specifies truncation cut level used in the truncated multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.
prefix (str, optional): Prefix name of signed truncated multiplier. Defaults to &#34;&#34;.
name (str, optional): Name of signed truncated multiplier. Defaults to &#34;s_tm&#34;.
&#34;&#34;&#34;
def __init__(self, a: Bus, b: Bus, truncation_cut: int = 0, prefix: str = &#34;&#34;, name: str = &#34;s_tm&#34;, **kwargs):
# NOTE: If truncation_cut is specified as 0 the final circuit is a simple array multiplier
self.truncation_cut = truncation_cut
self.N = max(a.N, b.N)
# Cut level should be: 0 &lt;= truncation_cut &lt; N
assert truncation_cut &lt; self.N
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N*2, signed=True, **kwargs)
self.c_data_type = &#34;int64_t&#34;
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)
# Gradual generation of partial products
for b_multiplier_index in range(self.truncation_cut, self.N):
for a_multiplicand_index in range(self.truncation_cut, self.N):
# AND and NAND gates generation for calculation of partial products and sign extension
if (b_multiplier_index == self.N-1 and a_multiplicand_index != self.N-1) or (b_multiplier_index != self.N-1 and a_multiplicand_index == self.N-1):
obj_nand = NandGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+&#34;_nand&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index), parent_component=self)
self.add_component(obj_nand)
else:
obj_and = AndGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+&#34;_and&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index), parent_component=self)
self.add_component(obj_and)
if b_multiplier_index != self.truncation_cut:
previous_product = self.components[a_multiplicand_index + b_multiplier_index - 2*self.truncation_cut].out if b_multiplier_index == self.truncation_cut + 1 else self.get_previous_partial_product(a_index=a_multiplicand_index, b_index=b_multiplier_index, mult_type=&#34;tm&#34;)
# HA generation for first 1-bit adder in each row starting from the second one
if a_multiplicand_index == self.truncation_cut:
obj_adder = HalfAdder(self.get_previous_component().out, previous_product, prefix=self.prefix+&#34;_ha&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# Product generation
self.out.connect(b_multiplier_index + self.truncation_cut, obj_adder.get_sum_wire())
# FA generation
else:
# Constant wire with value 1 used at the last FA in second row (as one of its inputs) for signed multiplication (based on Baugh Wooley algorithm)
if a_multiplicand_index == self.N-1 and b_multiplier_index == self.truncation_cut+1:
previous_product = ConstantWireValue1()
obj_adder = FullAdder(self.get_previous_component().out, previous_product, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+&#34;_fa&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# PRODUCT GENERATION
if (a_multiplicand_index == self.truncation_cut and b_multiplier_index == self.truncation_cut) or (self.truncation_cut == self.N-1):
self.out.connect(a_multiplicand_index + b_multiplier_index, obj_and.out)
# 1 bit multiplier case
if a_multiplicand_index == self.N-1 and b_multiplier_index == self.N-1:
obj_nor = NorGate(ConstantWireValue1(), self.get_previous_component().out, prefix=self.prefix+&#34;_nor_zero_extend&#34;, parent_component=self)
self.add_component(obj_nor)
self.out.connect(a_multiplicand_index+1, obj_nor.out)
elif b_multiplier_index == self.N-1 and self.truncation_cut != self.N-1:
self.out.connect(b_multiplier_index + a_multiplicand_index, obj_adder.get_sum_wire())
if a_multiplicand_index == self.N-1:
obj_xor = XorGate(self.get_previous_component().get_carry_wire(), ConstantWireValue1(), prefix=self.prefix+&#34;_xor&#34;+str(a_multiplicand_index+1)+&#34;_&#34;+str(b_multiplier_index), parent_component=self)
self.add_component(obj_xor)
self.out.connect(self.out.N-1, obj_xor.out)
# Connecting the output bits generated from ommited cells to ground
for grounded_out_index in range(0, self.truncation_cut*2):
self.out.connect(grounded_out_index, ConstantWireValue0())</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit">MultiplierCircuit</a></li>
<li><a title="ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit" href="../../core/arithmetic_circuits/arithmetic_circuit.html#ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit">ArithmeticCircuit</a></li>
<li><a title="ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit">GeneralCircuit</a></li>
</ul>
<h3>Inherited members</h3>
<ul class="hlist">
<li><code><b><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit">MultiplierCircuit</a></b></code>:
<ul class="hlist">
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wire" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wire">add_column_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wires" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wires">add_column_wires</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_component" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.add_component">add_component</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_blif_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_blif_code_flat">get_blif_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_blif_code_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_blif_code_hier">get_blif_code_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_c_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_c_code_flat">get_c_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_c_code_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_c_code_hier">get_c_code_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_carry_wire" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_carry_wire">get_carry_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_cgp_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_cgp_code_flat">get_cgp_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_cgp_wires" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_cgp_wires">get_cgp_wires</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_blif">get_circuit_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_c">get_circuit_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_gates" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_gates">get_circuit_gates</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_v">get_circuit_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_wire_index" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_wire_index">get_circuit_wire_index</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_height" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_height">get_column_height</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_wire" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_wire">get_column_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_component_types" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_component_types">get_component_types</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_blif">get_declaration_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_c_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_c_flat">get_declaration_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_c_hier">get_declaration_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_v_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_v_flat">get_declaration_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_v_hier">get_declaration_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declarations_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declarations_c_hier">get_declarations_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declarations_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declarations_v_hier">get_declarations_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blif_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blif_flat">get_function_blif_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_block_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_block_blif">get_function_block_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_block_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_block_c">get_function_block_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_block_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_block_v">get_function_block_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blocks_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blocks_blif">get_function_blocks_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blocks_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blocks_c">get_function_blocks_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blocks_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blocks_v">get_function_blocks_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_blif">get_function_out_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_c_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_c_flat">get_function_out_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_c_hier">get_function_out_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_python_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_python_flat">get_function_out_python_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_v_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_v_flat">get_function_out_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_v_hier">get_function_out_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_includes_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_includes_c">get_includes_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_c_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_c_flat">get_init_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_c_hier">get_init_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_python_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_python_flat">get_init_python_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_v_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_v_flat">get_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_v_hier">get_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_instance_num" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_instance_num">get_instance_num</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_invocation_blif_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_invocation_blif_hier">get_invocation_blif_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_invocations_blif_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_invocations_blif_hier">get_invocations_blif_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_maximum_height" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_maximum_height">get_maximum_height</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_multi_bit_components" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_multi_bit_components">get_multi_bit_components</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_one_bit_components" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_one_bit_components">get_one_bit_components</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_out_invocation_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_out_invocation_c">get_out_invocation_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_out_invocation_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_out_invocation_v">get_out_invocation_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_outputs_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_outputs_cgp">get_outputs_cgp</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_parameters_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_parameters_cgp">get_parameters_cgp</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_component" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_previous_component">get_previous_component</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_partial_product" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_partial_product">get_previous_partial_product</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_blif">get_prototype_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_c">get_prototype_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_python" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_python">get_prototype_python</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_v">get_prototype_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_python_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_python_code_flat">get_python_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_sum_wire" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_sum_wire">get_sum_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_triplets_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_triplets_cgp">get_triplets_cgp</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_unique_types" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_unique_types">get_unique_types</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_v_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_v_code_flat">get_v_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_v_code_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_v_code_hier">get_v_code_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.init_column_heights" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.init_column_heights">init_column_heights</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.save_wire_id" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.save_wire_id">save_wire_id</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_heights" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_heights">update_column_heights</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_wires" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_wires">update_column_wires</a></code></li>
</ul>
</li>
</ul>
</dd>
<dt id="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.UnsignedTruncatedMultiplier"><code class="flex name class">
<span>class <span class="ident">UnsignedTruncatedMultiplier</span></span>
<span>(</span><span>a: <a title="ariths_gen.wire_components.buses.Bus" href="../../wire_components/buses.html#ariths_gen.wire_components.buses.Bus">Bus</a>, b: <a title="ariths_gen.wire_components.buses.Bus" href="../../wire_components/buses.html#ariths_gen.wire_components.buses.Bus">Bus</a>, truncation_cut: int = 0, prefix: str = '', name: str = 'u_tm', **kwargs)</span>
</code></dt>
<dd>
<div class="desc"><p>Class representing unsigned truncated multiplier.</p>
<p>It represents an approximative version of unsigned array multiplier with simpler structure.
It is created by modifying an ordinary N-bit unsigned array multiplier by ignoring
(truncating) some of the partial products.</p>
<p>The design promises better area and power parameters in exchange for the loss of computation precision.
</p>
<pre><code> CUT=2
A3B0 A2B0 │ A1B0 A0B0
┌───┐ ┌───┐ ┌───┐ ┌───┐
│AND│ │AND│ │ │AND│ │AND│
└───┘ └───┘ └───┘ └───┘
┌ ─ ─ ─ ┘
A3B1 A2B1 A1B1 A0B1
┌───┐ ┌───┐ │ ┌───┐ ┌───┐
│AND│ │AND│ │AND│ │AND│
└───┘ └───┘ │ └───┘ └───┘
┌────┐ ┌────┐ ┌────┐ ┌────┐
│ │ │ │ │ │ │ │ │
│ HA │ │ FA │ │ FA │ │ HA │
│ │ │ │ │ │ │ │ │
└────┘ └────┘ └────┘ └────┘
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┬ ─ ─ ─ ─ ┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ CUT=2
A3B2 A2B2 A1B2 A0B2
┌▼─▼┐ ┌▼─▼┐ │ ┌───┐ ┌───┐
│AND│ │AND│ │AND│ │AND│
└┬──┘ └┬──┘ │ └───┘ └───┘
│ │ ┌────┐ ┌────┐
│ │ │ │ │ │ │
│ ┌ ─ ┼─ ─ ─ ┘ │ FA │ │ HA │
│ │ │ │ │ │
│ │ │ └────┘ └────┘
A3B3 │ A2B3 │ A1B3 A0B3
┌◄─►┐ │ ┌◄─►┐ │ │ ┌───┐ ┌───┐
│AND│ │ │AND│ │ │AND│ │AND│
└┬──┘ │ └┬──┘ │ │ └───┘ └───┘
┌───▼┐ ┌▼──▼┐ ┌┼───┐ ┌────┐
│ │ │ │ │ ││ │ │ │
┌──────┤ HA │◄────┤ HA │ ││FA │ │ HA │
│ │ │ │ │ │ ││ │ │ │
│ └──┬─┘ └──┬─┘ └┼───┘ └────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
P7 P6 P5 │ P4 P3=0 P2=0 P1=0 P0=0
</code></pre>
<p>Description of the <strong>init</strong> method.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>a</code></strong> :&ensp;<code>Bus</code></dt>
<dd>First input bus.</dd>
<dt><strong><code>b</code></strong> :&ensp;<code>Bus</code></dt>
<dd>Second input bus.</dd>
<dt><strong><code>truncation_cut</code></strong> :&ensp;<code>int</code>, optional</dt>
<dd>Specifies truncation cut level used in the truncated multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.</dd>
<dt><strong><code>prefix</code></strong> :&ensp;<code>str</code>, optional</dt>
<dd>Prefix name of unsigned truncated multiplier. Defaults to "".</dd>
<dt><strong><code>name</code></strong> :&ensp;<code>str</code>, optional</dt>
<dd>Name of unsigned truncated multiplier. Defaults to "u_tm".</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class UnsignedTruncatedMultiplier(MultiplierCircuit):
&#34;&#34;&#34;Class representing unsigned truncated multiplier.
It represents an approximative version of unsigned array multiplier with simpler structure.
It is created by modifying an ordinary N-bit unsigned array multiplier by ignoring
(truncating) some of the partial products.
The design promises better area and power parameters in exchange for the loss of computation precision.
```
CUT=2
A3B0 A2B0 │ A1B0 A0B0
┌───┐ ┌───┐ ┌───┐ ┌───┐
│AND│ │AND│ │ │AND│ │AND│
└───┘ └───┘ └───┘ └───┘
┌ ─ ─ ─ ┘
A3B1 A2B1 A1B1 A0B1
┌───┐ ┌───┐ │ ┌───┐ ┌───┐
│AND│ │AND│ │AND│ │AND│
└───┘ └───┘ │ └───┘ └───┘
┌────┐ ┌────┐ ┌────┐ ┌────┐
│ │ │ │ │ │ │ │ │
│ HA │ │ FA │ │ FA │ │ HA │
│ │ │ │ │ │ │ │ │
└────┘ └────┘ └────┘ └────┘
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┬ ─ ─ ─ ─ ┴─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ CUT=2
A3B2 A2B2 A1B2 A0B2
┌▼─▼┐ ┌▼─▼┐ │ ┌───┐ ┌───┐
│AND│ │AND│ │AND│ │AND│
└┬──┘ └┬──┘ │ └───┘ └───┘
│ │ ┌────┐ ┌────┐
│ │ │ │ │ │ │
│ ┌ ─ ┼─ ─ ─ ┘ │ FA │ │ HA │
│ │ │ │ │ │
│ │ │ └────┘ └────┘
A3B3 │ A2B3 │ A1B3 A0B3
┌◄─►┐ │ ┌◄─►┐ │ │ ┌───┐ ┌───┐
│AND│ │ │AND│ │ │AND│ │AND│
└┬──┘ │ └┬──┘ │ │ └───┘ └───┘
┌───▼┐ ┌▼──▼┐ ┌┼───┐ ┌────┐
│ │ │ │ │ ││ │ │ │
┌──────┤ HA │◄────┤ HA │ ││FA │ │ HA │
│ │ │ │ │ │ ││ │ │ │
│ └──┬─┘ └──┬─┘ └┼───┘ └────┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
P7 P6 P5 │ P4 P3=0 P2=0 P1=0 P0=0
```
Description of the __init__ method.
Args:
a (Bus): First input bus.
b (Bus): Second input bus.
truncation_cut (int, optional): Specifies truncation cut level used in the truncated multiplier circuit creation. Note: If equal to 0, the final circuit behaves as an ordinary array multiplier. Defaults to 0.
prefix (str, optional): Prefix name of unsigned truncated multiplier. Defaults to &#34;&#34;.
name (str, optional): Name of unsigned truncated multiplier. Defaults to &#34;u_tm&#34;.
&#34;&#34;&#34;
def __init__(self, a: Bus, b: Bus, truncation_cut: int = 0, prefix: str = &#34;&#34;, name: str = &#34;u_tm&#34;, **kwargs):
# NOTE: If truncation_cut is specified as 0 the final circuit is a simple array multiplier
self.truncation_cut = truncation_cut
self.N = max(a.N, b.N)
# Cut level should be: 0 &lt;= truncation_cut &lt; N
assert truncation_cut &lt; self.N
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N*2, **kwargs)
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)
# Gradual generation of partial products
for b_multiplier_index in range(self.truncation_cut, self.N):
for a_multiplicand_index in range(self.truncation_cut, self.N):
# AND gates generation for calculation of partial products
obj_and = AndGate(self.a.get_wire(a_multiplicand_index), self.b.get_wire(b_multiplier_index), prefix=self.prefix+&#34;_and&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_and)
if b_multiplier_index != self.truncation_cut:
previous_product = self.components[a_multiplicand_index + b_multiplier_index - 2*self.truncation_cut].out if b_multiplier_index == self.truncation_cut + 1 else self.get_previous_partial_product(a_index=a_multiplicand_index, b_index=b_multiplier_index, mult_type=&#34;tm&#34;)
# HA generation for first 1-bit adder in each row starting from the second one
if a_multiplicand_index == self.truncation_cut:
obj_adder = HalfAdder(self.get_previous_component().out, previous_product, prefix=self.prefix+&#34;_ha&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# Product generation
self.out.connect(b_multiplier_index + self.truncation_cut, obj_adder.get_sum_wire())
# HA generation, last 1-bit adder in second row
elif a_multiplicand_index == self.N-1 and b_multiplier_index == self.truncation_cut+1:
obj_adder = HalfAdder(self.get_previous_component().out, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+&#34;_ha&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# FA generation
else:
obj_adder = FullAdder(self.get_previous_component().out, previous_product, self.get_previous_component(number=2).get_carry_wire(), prefix=self.prefix+&#34;_fa&#34;+str(a_multiplicand_index)+&#34;_&#34;+str(b_multiplier_index))
self.add_component(obj_adder)
# PRODUCT GENERATION
if (a_multiplicand_index == self.truncation_cut and b_multiplier_index == self.truncation_cut) or (self.truncation_cut == self.N-1):
self.out.connect(a_multiplicand_index + b_multiplier_index, obj_and.out)
# 1 bit multiplier case
if a_multiplicand_index == self.N-1 and b_multiplier_index == self.N-1:
self.out.connect(a_multiplicand_index+b_multiplier_index+1, ConstantWireValue0())
elif b_multiplier_index == self.N-1 and self.truncation_cut != self.N-1:
self.out.connect(b_multiplier_index + a_multiplicand_index, obj_adder.get_sum_wire())
if a_multiplicand_index == self.N-1:
self.out.connect(self.out.N-1, obj_adder.get_carry_wire())
# Connecting the output bits generated from ommited cells to ground
for grounded_out_index in range(0, self.truncation_cut*2):
self.out.connect(grounded_out_index, ConstantWireValue0())</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit">MultiplierCircuit</a></li>
<li><a title="ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit" href="../../core/arithmetic_circuits/arithmetic_circuit.html#ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit">ArithmeticCircuit</a></li>
<li><a title="ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit">GeneralCircuit</a></li>
</ul>
<h3>Inherited members</h3>
<ul class="hlist">
<li><code><b><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit">MultiplierCircuit</a></b></code>:
<ul class="hlist">
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wire" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wire">add_column_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wires" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_column_wires">add_column_wires</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.add_component" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.add_component">add_component</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_blif_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_blif_code_flat">get_blif_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_blif_code_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_blif_code_hier">get_blif_code_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_c_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_c_code_flat">get_c_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_c_code_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_c_code_hier">get_c_code_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_carry_wire" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_carry_wire">get_carry_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_cgp_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_cgp_code_flat">get_cgp_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_cgp_wires" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_cgp_wires">get_cgp_wires</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_blif">get_circuit_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_c">get_circuit_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_gates" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_gates">get_circuit_gates</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_v">get_circuit_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_circuit_wire_index" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_circuit_wire_index">get_circuit_wire_index</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_height" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_height">get_column_height</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_wire" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_column_wire">get_column_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_component_types" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_component_types">get_component_types</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_blif">get_declaration_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_c_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_c_flat">get_declaration_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_c_hier">get_declaration_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_v_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_v_flat">get_declaration_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declaration_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declaration_v_hier">get_declaration_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declarations_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declarations_c_hier">get_declarations_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_declarations_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_declarations_v_hier">get_declarations_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blif_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blif_flat">get_function_blif_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_block_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_block_blif">get_function_block_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_block_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_block_c">get_function_block_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_block_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_block_v">get_function_block_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blocks_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blocks_blif">get_function_blocks_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blocks_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blocks_c">get_function_blocks_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_blocks_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_blocks_v">get_function_blocks_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_blif">get_function_out_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_c_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_c_flat">get_function_out_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_c_hier">get_function_out_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_python_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_python_flat">get_function_out_python_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_v_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_v_flat">get_function_out_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_function_out_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_function_out_v_hier">get_function_out_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_includes_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_includes_c">get_includes_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_c_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_c_flat">get_init_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_c_hier">get_init_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_python_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_python_flat">get_init_python_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_v_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_v_flat">get_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_init_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_v_hier">get_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_instance_num" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_instance_num">get_instance_num</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_invocation_blif_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_invocation_blif_hier">get_invocation_blif_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_invocations_blif_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_invocations_blif_hier">get_invocations_blif_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_maximum_height" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_maximum_height">get_maximum_height</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_multi_bit_components" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_multi_bit_components">get_multi_bit_components</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_one_bit_components" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_one_bit_components">get_one_bit_components</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_out_invocation_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_out_invocation_c">get_out_invocation_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_out_invocation_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_out_invocation_v">get_out_invocation_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_outputs_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_outputs_cgp">get_outputs_cgp</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_parameters_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_parameters_cgp">get_parameters_cgp</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_component" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_previous_component">get_previous_component</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_partial_product" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_previous_partial_product">get_previous_partial_product</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_blif" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_blif">get_prototype_blif</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_c" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_c">get_prototype_c</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_python" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_python">get_prototype_python</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_prototype_v" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_prototype_v">get_prototype_v</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_python_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_python_code_flat">get_python_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_sum_wire" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_sum_wire">get_sum_wire</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_triplets_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_triplets_cgp">get_triplets_cgp</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_unique_types" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_unique_types">get_unique_types</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_v_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_v_code_flat">get_v_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.get_v_code_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_v_code_hier">get_v_code_hier</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.init_column_heights" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.init_column_heights">init_column_heights</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.save_wire_id" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.save_wire_id">save_wire_id</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_heights" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_heights">update_column_heights</a></code></li>
<li><code><a title="ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_wires" href="../../core/arithmetic_circuits/multiplier_circuit.html#ariths_gen.core.arithmetic_circuits.multiplier_circuit.MultiplierCircuit.update_column_wires">update_column_wires</a></code></li>
</ul>
</li>
</ul>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="ariths_gen.multi_bit_circuits.approximate_multipliers" href="index.html">ariths_gen.multi_bit_circuits.approximate_multipliers</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.SignedTruncatedMultiplier" href="#ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.SignedTruncatedMultiplier">SignedTruncatedMultiplier</a></code></h4>
</li>
<li>
<h4><code><a title="ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.UnsignedTruncatedMultiplier" href="#ariths_gen.multi_bit_circuits.approximate_multipliers.truncated_multiplier.UnsignedTruncatedMultiplier">UnsignedTruncatedMultiplier</a></code></h4>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>

View File

@ -30,6 +30,10 @@
<dd>
<div class="desc"></div>
</dd>
<dt><code class="name"><a title="ariths_gen.multi_bit_circuits.approximate_multipliers" href="approximate_multipliers/index.html">ariths_gen.multi_bit_circuits.approximate_multipliers</a></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt><code class="name"><a title="ariths_gen.multi_bit_circuits.dividers" href="dividers/index.html">ariths_gen.multi_bit_circuits.dividers</a></code></dt>
<dd>
<div class="desc"></div>
@ -61,6 +65,7 @@
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
<ul>
<li><code><a title="ariths_gen.multi_bit_circuits.adders" href="adders/index.html">ariths_gen.multi_bit_circuits.adders</a></code></li>
<li><code><a title="ariths_gen.multi_bit_circuits.approximate_multipliers" href="approximate_multipliers/index.html">ariths_gen.multi_bit_circuits.approximate_multipliers</a></code></li>
<li><code><a title="ariths_gen.multi_bit_circuits.dividers" href="dividers/index.html">ariths_gen.multi_bit_circuits.dividers</a></code></li>
<li><code><a title="ariths_gen.multi_bit_circuits.multipliers" href="multipliers/index.html">ariths_gen.multi_bit_circuits.multipliers</a></code></li>
</ul>

View File

@ -221,7 +221,7 @@ class SignedArrayMultiplier(MultiplierCircuit):
self.N = max(a.N, b.N)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N*2, signed=True, **kwargs)
self.c_data_type = &#34;int64_t&#34;
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)
@ -412,7 +412,7 @@ gradually sum them.</p>
self.N = max(a.N, b.N)
super().__init__(a=a, b=b, prefix=prefix, name=name, out_N=self.N*2, signed=True, **kwargs)
self.c_data_type = &#34;int64_t&#34;
# Bus sign extension in case buses have different lengths
self.a.bus_extend(N=self.N, prefix=a.prefix)
self.b.bus_extend(N=self.N, prefix=b.prefix)

View File

@ -51,6 +51,8 @@ class FullAdder(ThreeInputOneBitCircuit):
c (Wire, optional): Carry input wire. Defaults to Wire(name=&#34;cin&#34;).
prefix (str, optional): Prefix name of full adder. Defaults to &#34;fa&#34;.
&#34;&#34;&#34;
use_verilog_instance = False
def __init__(self, a: Wire = Wire(name=&#34;a&#34;), b: Wire = Wire(name=&#34;b&#34;), c: Wire = Wire(name=&#34;cin&#34;), prefix: str = &#34;fa&#34;):
super().__init__(a, b, c, prefix)
# 2 wires for component&#39;s bus output (sum, cout)
@ -78,6 +80,40 @@ class FullAdder(ThreeInputOneBitCircuit):
self.out.connect(1, obj_or.out)
def get_init_v_flat(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_init_v_flat()
return &#34; &#34; + self.use_verilog_instance.format(
**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.prefix,
&#34;wireb&#34;: self.b.prefix,
&#34;wirec&#34;: self.c.prefix,
&#34;wireys&#34;: self.get_sum_wire().prefix,
&#34;wireyc&#34;: self.get_carry_wire().prefix,
}
) + &#34;;\n&#34;
def get_self_init_v_hier(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_self_init_v_hier()
unique_out_wires = []
for o in self.out.bus:
unique_out_wires.append(o.name+&#34;_outid&#34;+str(self.out.bus.index(o))) if o.is_const() or o.name in [self.a.name, self.b.name] else unique_out_wires.append(o.name)
return &#34; &#34; + self.use_verilog_instance.format(**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.name,
&#34;wireb&#34;: self.b.name,
&#34;wirec&#34;: self.c.name,
&#34;wireys&#34;: unique_out_wires[0],
&#34;wireyc&#34;: unique_out_wires[1],
}) + &#34;;\n&#34;
class FullAdderPG(ThreeInputOneBitCircuit):
&#34;&#34;&#34;Class representing modified three input one bit full adder with propagate/generate logic.
@ -308,6 +344,8 @@ class FullSubtractor(ThreeInputOneBitCircuit):
c (Wire, optional): Carry input wire. Defaults to Wire(name=&#34;cin&#34;).
prefix (str, optional): Prefix name of full adder. Defaults to &#34;fa&#34;.
&#34;&#34;&#34;
use_verilog_instance = False
def __init__(self, a: Wire = Wire(name=&#34;a&#34;), b: Wire = Wire(name=&#34;b&#34;), c: Wire = Wire(name=&#34;cin&#34;), prefix: str = &#34;fa&#34;):
super().__init__(a, b, c, prefix)
# 2 wires for component&#39;s bus output (sum, cout)
@ -333,7 +371,42 @@ class FullSubtractor(ThreeInputOneBitCircuit):
obj_or = OrGate(generate_and.out, obj_and.out, prefix=self.prefix+&#34;_or&#34;+str(self.get_instance_num(cls=OrGate)), outid=1, parent_component=self)
self.add_component(obj_or)
self.out.connect(1, obj_or.out)</code></pre>
self.out.connect(1, obj_or.out)
def get_init_v_flat(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_init_v_flat()
return &#34; &#34; + self.use_verilog_instance.format(
**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.prefix,
&#34;wireb&#34;: self.b.prefix,
&#34;wirec&#34;: self.c.prefix,
&#34;wireys&#34;: self.get_sum_wire().prefix,
&#34;wireyc&#34;: self.get_carry_wire().prefix,
}
) + &#34;;\n&#34;
def get_self_init_v_hier(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_self_init_v_hier()
unique_out_wires = []
for o in self.out.bus:
unique_out_wires.append(o.name+&#34;_outid&#34;+str(self.out.bus.index(o))) if o.is_const() or o.name in [self.a.name, self.b.name] else unique_out_wires.append(o.name)
return &#34; &#34; + self.use_verilog_instance.format(**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.name,
&#34;wireb&#34;: self.b.name,
&#34;wirec&#34;: self.c.name,
&#34;wireys&#34;: unique_out_wires[0],
&#34;wireyc&#34;: unique_out_wires[1],
}) + &#34;;\n&#34;</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
@ -342,6 +415,70 @@ class FullSubtractor(ThreeInputOneBitCircuit):
<li><a title="ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit" href="../../core/arithmetic_circuits/arithmetic_circuit.html#ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit">ArithmeticCircuit</a></li>
<li><a title="ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit">GeneralCircuit</a></li>
</ul>
<h3>Class variables</h3>
<dl>
<dt id="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.use_verilog_instance"><code class="name">var <span class="ident">use_verilog_instance</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
<h3>Methods</h3>
<dl>
<dt id="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.get_init_v_flat"><code class="name flex">
<span>def <span class="ident">get_init_v_flat</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>support of custom PDK</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_init_v_flat(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_init_v_flat()
return &#34; &#34; + self.use_verilog_instance.format(
**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.prefix,
&#34;wireb&#34;: self.b.prefix,
&#34;wirec&#34;: self.c.prefix,
&#34;wireys&#34;: self.get_sum_wire().prefix,
&#34;wireyc&#34;: self.get_carry_wire().prefix,
}
) + &#34;;\n&#34;</code></pre>
</details>
</dd>
<dt id="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.get_self_init_v_hier"><code class="name flex">
<span>def <span class="ident">get_self_init_v_hier</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>support of custom PDK</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_self_init_v_hier(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_self_init_v_hier()
unique_out_wires = []
for o in self.out.bus:
unique_out_wires.append(o.name+&#34;_outid&#34;+str(self.out.bus.index(o))) if o.is_const() or o.name in [self.a.name, self.b.name] else unique_out_wires.append(o.name)
return &#34; &#34; + self.use_verilog_instance.format(**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.name,
&#34;wireb&#34;: self.b.name,
&#34;wirec&#34;: self.c.name,
&#34;wireys&#34;: unique_out_wires[0],
&#34;wireyc&#34;: unique_out_wires[1],
}) + &#34;;\n&#34;</code></pre>
</details>
</dd>
</dl>
<h3>Inherited members</h3>
<ul class="hlist">
<li><code><b><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit" href="../../core/one_bit_circuits/three_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit">ThreeInputOneBitCircuit</a></b></code>:
@ -385,7 +522,6 @@ class FullSubtractor(ThreeInputOneBitCircuit):
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_init_c_flat" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_c_flat">get_init_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_init_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_c_hier">get_init_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_init_python_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_python_flat">get_init_python_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_init_v_flat" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_v_flat">get_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_init_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_v_hier">get_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_instance_num" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_instance_num">get_instance_num</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_invocation_blif_hier" href="../../core/one_bit_circuits/three_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_invocation_blif_hier">get_invocation_blif_hier</a></code></li>
@ -404,7 +540,6 @@ class FullSubtractor(ThreeInputOneBitCircuit):
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_prototype_v_hier" href="../../core/one_bit_circuits/three_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_prototype_v_hier">get_prototype_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_python_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_python_code_flat">get_python_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_self_init_v_flat" href="../../core/one_bit_circuits/three_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_self_init_v_flat">get_self_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_self_init_v_hier" href="../../core/one_bit_circuits/three_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_self_init_v_hier">get_self_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_sum_wire" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_sum_wire">get_sum_wire</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_triplets_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_triplets_cgp">get_triplets_cgp</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.three_input_one_bit_circuit.ThreeInputOneBitCircuit.get_unique_types" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_unique_types">get_unique_types</a></code></li>
@ -1026,6 +1161,11 @@ Sel ────┘
<ul>
<li>
<h4><code><a title="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder" href="#ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder">FullAdder</a></code></h4>
<ul class="">
<li><code><a title="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.get_init_v_flat" href="#ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.get_init_v_flat">get_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.get_self_init_v_hier" href="#ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.get_self_init_v_hier">get_self_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.use_verilog_instance" href="#ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdder.use_verilog_instance">use_verilog_instance</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdderPG" href="#ariths_gen.one_bit_circuits.one_bit_components.three_input_one_bit_components.FullAdderPG">FullAdderPG</a></code></h4>

View File

@ -49,6 +49,8 @@ class HalfAdder(TwoInputOneBitCircuit):
b (Wire, optional): Second input wire. Defaults to Wire(name=&#34;b&#34;).
prefix (str, optional): Prefix name of half adder. Defaults to &#34;ha&#34;.
&#34;&#34;&#34;
use_verilog_instance = False
def __init__(self, a: Wire = Wire(name=&#34;a&#34;), b: Wire = Wire(name=&#34;b&#34;), prefix: str = &#34;ha&#34;):
super().__init__(a, b, prefix)
# 2 wires for component&#39;s bus output (sum, cout)
@ -66,6 +68,38 @@ class HalfAdder(TwoInputOneBitCircuit):
self.add_component(obj_and)
self.out.connect(1, obj_and.out)
def get_init_v_flat(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_init_v_flat()
return &#34; &#34; + self.use_verilog_instance.format(
**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.prefix,
&#34;wireb&#34;: self.b.prefix,
&#34;wireys&#34;: self.get_sum_wire().prefix,
&#34;wireyc&#34;: self.get_carry_wire().prefix,
}
) + &#34;;\n&#34;
def get_self_init_v_hier(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_self_init_v_hier()
unique_out_wires = []
for o in self.out.bus:
unique_out_wires.append(o.name+&#34;_outid&#34;+str(self.out.bus.index(o))) if o.is_const() or o.name in [self.a.name, self.b.name] else unique_out_wires.append(o.name)
return &#34; &#34; + self.use_verilog_instance.format(**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.name,
&#34;wireb&#34;: self.b.name,
&#34;wireys&#34;: unique_out_wires[0],
&#34;wireyc&#34;: unique_out_wires[1],
}) + &#34;;\n&#34;
class PGLogicBlock(TwoInputOneBitCircuit):
&#34;&#34;&#34;Class representing two input one bit propagate/generate logic block.
@ -235,6 +269,8 @@ class HalfSubtractor(TwoInputOneBitCircuit):
b (Wire, optional): Second input wire. Defaults to Wire(name=&#34;b&#34;).
prefix (str, optional): Prefix name of half adder. Defaults to &#34;ha&#34;.
&#34;&#34;&#34;
use_verilog_instance = False
def __init__(self, a: Wire = Wire(name=&#34;a&#34;), b: Wire = Wire(name=&#34;b&#34;), prefix: str = &#34;ha&#34;):
super().__init__(a, b, prefix)
# 2 wires for component&#39;s bus output (sum, cout)
@ -250,7 +286,40 @@ class HalfSubtractor(TwoInputOneBitCircuit):
# AND gate for calculation of 1-bit cout
obj_and = AndGate(a, b, prefix=self.prefix+&#34;_and&#34;+str(self.get_instance_num(cls=AndGate)), outid=1, parent_component=self)
self.add_component(obj_and)
self.out.connect(1, obj_and.out)</code></pre>
self.out.connect(1, obj_and.out)
def get_init_v_flat(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_init_v_flat()
return &#34; &#34; + self.use_verilog_instance.format(
**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.prefix,
&#34;wireb&#34;: self.b.prefix,
&#34;wireys&#34;: self.get_sum_wire().prefix,
&#34;wireyc&#34;: self.get_carry_wire().prefix,
}
) + &#34;;\n&#34;
def get_self_init_v_hier(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_self_init_v_hier()
unique_out_wires = []
for o in self.out.bus:
unique_out_wires.append(o.name+&#34;_outid&#34;+str(self.out.bus.index(o))) if o.is_const() or o.name in [self.a.name, self.b.name] else unique_out_wires.append(o.name)
return &#34; &#34; + self.use_verilog_instance.format(**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.name,
&#34;wireb&#34;: self.b.name,
&#34;wireys&#34;: unique_out_wires[0],
&#34;wireyc&#34;: unique_out_wires[1],
}) + &#34;;\n&#34;</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
@ -258,6 +327,68 @@ class HalfSubtractor(TwoInputOneBitCircuit):
<li><a title="ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit" href="../../core/arithmetic_circuits/arithmetic_circuit.html#ariths_gen.core.arithmetic_circuits.arithmetic_circuit.ArithmeticCircuit">ArithmeticCircuit</a></li>
<li><a title="ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit">GeneralCircuit</a></li>
</ul>
<h3>Class variables</h3>
<dl>
<dt id="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.use_verilog_instance"><code class="name">var <span class="ident">use_verilog_instance</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
<h3>Methods</h3>
<dl>
<dt id="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.get_init_v_flat"><code class="name flex">
<span>def <span class="ident">get_init_v_flat</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>support of custom PDK</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_init_v_flat(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_init_v_flat()
return &#34; &#34; + self.use_verilog_instance.format(
**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.prefix,
&#34;wireb&#34;: self.b.prefix,
&#34;wireys&#34;: self.get_sum_wire().prefix,
&#34;wireyc&#34;: self.get_carry_wire().prefix,
}
) + &#34;;\n&#34;</code></pre>
</details>
</dd>
<dt id="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.get_self_init_v_hier"><code class="name flex">
<span>def <span class="ident">get_self_init_v_hier</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>support of custom PDK</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_self_init_v_hier(self):
&#34;&#34;&#34; support of custom PDK &#34;&#34;&#34;
if not self.use_verilog_instance:
return super().get_self_init_v_hier()
unique_out_wires = []
for o in self.out.bus:
unique_out_wires.append(o.name+&#34;_outid&#34;+str(self.out.bus.index(o))) if o.is_const() or o.name in [self.a.name, self.b.name] else unique_out_wires.append(o.name)
return &#34; &#34; + self.use_verilog_instance.format(**{
&#34;unit&#34;: self.prefix,
&#34;wirea&#34;: self.a.name,
&#34;wireb&#34;: self.b.name,
&#34;wireys&#34;: unique_out_wires[0],
&#34;wireyc&#34;: unique_out_wires[1],
}) + &#34;;\n&#34;</code></pre>
</details>
</dd>
</dl>
<h3>Inherited members</h3>
<ul class="hlist">
<li><code><b><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit">TwoInputOneBitCircuit</a></b></code>:
@ -301,7 +432,6 @@ class HalfSubtractor(TwoInputOneBitCircuit):
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_c_flat" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_c_flat">get_init_c_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_c_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_c_hier">get_init_c_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_python_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_python_flat">get_init_python_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_v_flat" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_v_flat">get_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_init_v_hier" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_init_v_hier">get_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_instance_num" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_instance_num">get_instance_num</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_invocation_blif_hier" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_invocation_blif_hier">get_invocation_blif_hier</a></code></li>
@ -320,7 +450,6 @@ class HalfSubtractor(TwoInputOneBitCircuit):
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_prototype_v_hier" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_prototype_v_hier">get_prototype_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_python_code_flat" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_python_code_flat">get_python_code_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_self_init_v_flat" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_self_init_v_flat">get_self_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_self_init_v_hier" href="../../core/one_bit_circuits/two_input_one_bit_circuit.html#ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_self_init_v_hier">get_self_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_sum_wire" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_sum_wire">get_sum_wire</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_triplets_cgp" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_triplets_cgp">get_triplets_cgp</a></code></li>
<li><code><a title="ariths_gen.core.one_bit_circuits.two_input_one_bit_circuit.TwoInputOneBitCircuit.get_unique_types" href="../../core/arithmetic_circuits/general_circuit.html#ariths_gen.core.arithmetic_circuits.general_circuit.GeneralCircuit.get_unique_types">get_unique_types</a></code></li>
@ -770,6 +899,11 @@ class HalfSubtractor(TwoInputOneBitCircuit):
<ul>
<li>
<h4><code><a title="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder" href="#ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder">HalfAdder</a></code></h4>
<ul class="">
<li><code><a title="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.get_init_v_flat" href="#ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.get_init_v_flat">get_init_v_flat</a></code></li>
<li><code><a title="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.get_self_init_v_hier" href="#ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.get_self_init_v_hier">get_self_init_v_hier</a></code></li>
<li><code><a title="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.use_verilog_instance" href="#ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfAdder.use_verilog_instance">use_verilog_instance</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfSubtractor" href="#ariths_gen.one_bit_circuits.one_bit_components.two_input_one_bit_components.HalfSubtractor">HalfSubtractor</a></code></h4>

103
pdk.html Normal file
View File

@ -0,0 +1,103 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.10.0" />
<title>ariths_gen.pdk API documentation</title>
<meta name="description" content="Support of custom PDK …" />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>ariths_gen.pdk</code></h1>
</header>
<section id="section-intro">
<p>Support of custom PDK</p>
<p>This file defines functions for generating of full and half adders
directly on the level of CMOS modules. </p>
<p>You may add your own modules as in example in set_pdk45_library()</p>
<p>Please call this function before calling get_verilog_code_XXX()</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;
Support of custom PDK
This file defines functions for generating of full and half adders
directly on the level of CMOS modules.
You may add your own modules as in example in set_pdk45_library()
Please call this function before calling get_verilog_code_XXX()
&#34;&#34;&#34;
from .one_bit_circuits import (
one_bit_components
)
def set_pdk45_library():
one_bit_components.FullAdder.use_verilog_instance = &#34;FAX1 {unit} (.A({wirea}), .B({wireb}), .C({wirec}), .YS({wireys}), .YC({wireyc}))&#34;
one_bit_components.HalfAdder.use_verilog_instance = &#34;HAX1 {unit} (.A({wirea}), .B({wireb}), .YS({wireys}), .YC({wireyc}))&#34;</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="ariths_gen.pdk.set_pdk45_library"><code class="name flex">
<span>def <span class="ident">set_pdk45_library</span></span>(<span>)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def set_pdk45_library():
one_bit_components.FullAdder.use_verilog_instance = &#34;FAX1 {unit} (.A({wirea}), .B({wireb}), .C({wirec}), .YS({wireys}), .YC({wireyc}))&#34;
one_bit_components.HalfAdder.use_verilog_instance = &#34;HAX1 {unit} (.A({wirea}), .B({wireb}), .YS({wireys}), .YC({wireyc}))&#34;</code></pre>
</details>
</dd>
</dl>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="ariths_gen" href="index.html">ariths_gen</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="ariths_gen.pdk.set_pdk45_library" href="#ariths_gen.pdk.set_pdk45_library">set_pdk45_library</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc" title="pdoc: Python API documentation generator"><cite>pdoc</cite> 0.10.0</a>.</p>
</footer>
</body>
</html>

View File

@ -37,7 +37,7 @@ class Bus():
Args:
prefix (str, optional): Prefix name of the bus. Defaults to &#34;bus&#34;.
N (int, optional): Number of wires in the bus. Defaults to 1.
wires_list (list, optional): List of Wire objects used to clone one bus to another. Defaults to 0.
wires_list (list, optional): List of Wire objects used to clone one bus to another. Defaults to None.
out_bus (bool, optional): Specifies whether this Bus is an output bus of some previous component. Defaults to False.
signed (bool, optional): Specifies whether this Bus should consider signed numbers or not (used for C code generation). Defaults to False.
&#34;&#34;&#34;
@ -76,18 +76,23 @@ class Bus():
&#34;&#34;&#34;
return self.out_bus
def bus_extend(self, N: int, prefix: str = &#34;bus&#34;):
def bus_extend(self, N: int, prefix: str = &#34;bus&#34;, last_wire_extend: bool = True):
&#34;&#34;&#34;Provides bus extension to contain more wires.
Args:
N (int): Number of wires in the bus. Defaults to 1.
prefix (str, optional): Prefix name of the bus. Defaults to &#34;bus&#34;.
last_wire_extend (bool, optional): Specifies whether the last wire of the bus should be extended (connected) to all the extending wires. Defaults to True.
&#34;&#34;&#34;
# Checks if any extension is neccesarry and if so, proceeds to wire extend the bus
if self.N &lt; N:
# Adding wires into current bus&#39;s wires list (wire names are concatenated from bus prefix and their index position inside the bus in square brackets)
self.bus += [Wire(name=prefix+f&#34;[{i}]&#34;, prefix=prefix, index=i, parent_bus=self) for i in range(self.N, N)]
if last_wire_extend is True:
for w_index in range(self.N, N):
self.connect(bus_wire_index=w_index, inner_component_out_wire=self.get_wire(self.N - 1))
self.N = N
def get_wire(self, wire_index: int = 0):
&#34;&#34;&#34;Retrieves a wire from the bus by a given index.
@ -288,7 +293,7 @@ class Bus():
<dt><strong><code>N</code></strong> :&ensp;<code>int</code>, optional</dt>
<dd>Number of wires in the bus. Defaults to 1.</dd>
<dt><strong><code>wires_list</code></strong> :&ensp;<code>list</code>, optional</dt>
<dd>List of Wire objects used to clone one bus to another. Defaults to 0.</dd>
<dd>List of Wire objects used to clone one bus to another. Defaults to None.</dd>
<dt><strong><code>out_bus</code></strong> :&ensp;<code>bool</code>, optional</dt>
<dd>Specifies whether this Bus is an output bus of some previous component. Defaults to False.</dd>
<dt><strong><code>signed</code></strong> :&ensp;<code>bool</code>, optional</dt>
@ -306,7 +311,7 @@ class Bus():
Args:
prefix (str, optional): Prefix name of the bus. Defaults to &#34;bus&#34;.
N (int, optional): Number of wires in the bus. Defaults to 1.
wires_list (list, optional): List of Wire objects used to clone one bus to another. Defaults to 0.
wires_list (list, optional): List of Wire objects used to clone one bus to another. Defaults to None.
out_bus (bool, optional): Specifies whether this Bus is an output bus of some previous component. Defaults to False.
signed (bool, optional): Specifies whether this Bus should consider signed numbers or not (used for C code generation). Defaults to False.
&#34;&#34;&#34;
@ -345,18 +350,23 @@ class Bus():
&#34;&#34;&#34;
return self.out_bus
def bus_extend(self, N: int, prefix: str = &#34;bus&#34;):
def bus_extend(self, N: int, prefix: str = &#34;bus&#34;, last_wire_extend: bool = True):
&#34;&#34;&#34;Provides bus extension to contain more wires.
Args:
N (int): Number of wires in the bus. Defaults to 1.
prefix (str, optional): Prefix name of the bus. Defaults to &#34;bus&#34;.
last_wire_extend (bool, optional): Specifies whether the last wire of the bus should be extended (connected) to all the extending wires. Defaults to True.
&#34;&#34;&#34;
# Checks if any extension is neccesarry and if so, proceeds to wire extend the bus
if self.N &lt; N:
# Adding wires into current bus&#39;s wires list (wire names are concatenated from bus prefix and their index position inside the bus in square brackets)
self.bus += [Wire(name=prefix+f&#34;[{i}]&#34;, prefix=prefix, index=i, parent_bus=self) for i in range(self.N, N)]
if last_wire_extend is True:
for w_index in range(self.N, N):
self.connect(bus_wire_index=w_index, inner_component_out_wire=self.get_wire(self.N - 1))
self.N = N
def get_wire(self, wire_index: int = 0):
&#34;&#34;&#34;Retrieves a wire from the bus by a given index.
@ -536,7 +546,7 @@ class Bus():
<h3>Methods</h3>
<dl>
<dt id="ariths_gen.wire_components.buses.Bus.bus_extend"><code class="name flex">
<span>def <span class="ident">bus_extend</span></span>(<span>self, N: int, prefix: str = 'bus')</span>
<span>def <span class="ident">bus_extend</span></span>(<span>self, N: int, prefix: str = 'bus', last_wire_extend: bool = True)</span>
</code></dt>
<dd>
<div class="desc"><p>Provides bus extension to contain more wires.</p>
@ -546,22 +556,28 @@ class Bus():
<dd>Number of wires in the bus. Defaults to 1.</dd>
<dt><strong><code>prefix</code></strong> :&ensp;<code>str</code>, optional</dt>
<dd>Prefix name of the bus. Defaults to "bus".</dd>
<dt><strong><code>last_wire_extend</code></strong> :&ensp;<code>bool</code>, optional</dt>
<dd>Specifies whether the last wire of the bus should be extended (connected) to all the extending wires. Defaults to True.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def bus_extend(self, N: int, prefix: str = &#34;bus&#34;):
<pre><code class="python">def bus_extend(self, N: int, prefix: str = &#34;bus&#34;, last_wire_extend: bool = True):
&#34;&#34;&#34;Provides bus extension to contain more wires.
Args:
N (int): Number of wires in the bus. Defaults to 1.
prefix (str, optional): Prefix name of the bus. Defaults to &#34;bus&#34;.
last_wire_extend (bool, optional): Specifies whether the last wire of the bus should be extended (connected) to all the extending wires. Defaults to True.
&#34;&#34;&#34;
# Checks if any extension is neccesarry and if so, proceeds to wire extend the bus
if self.N &lt; N:
# Adding wires into current bus&#39;s wires list (wire names are concatenated from bus prefix and their index position inside the bus in square brackets)
self.bus += [Wire(name=prefix+f&#34;[{i}]&#34;, prefix=prefix, index=i, parent_bus=self) for i in range(self.N, N)]
if last_wire_extend is True:
for w_index in range(self.N, N):
self.connect(bus_wire_index=w_index, inner_component_out_wire=self.get_wire(self.N - 1))
self.N = N</code></pre>
</details>
</dd>