781 lines
47 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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.9.2" />
<title>ariths_gen.wire_components.buses 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.wire_components.buses</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from .wires import Wire
class Bus():
&#34;&#34;&#34;Class representing bus of wires used as inputs/outputs of bigger circuits.
Description of the __init__ method.
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.
&#34;&#34;&#34;
def __init__(self, prefix: str = &#34;bus&#34;, N: int = 1, wires_list: list = None):
if wires_list is None:
self.prefix = prefix
# 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(N)]
self.N = N
else:
self.prefix = prefix
self.bus = wires_list
self.N = len(self.bus)
def bus_extend(self, N: int, prefix: str = &#34;bus&#34;):
&#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;.
&#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)]
self.N = N
def get_wire(self, wire_index: int = 0):
&#34;&#34;&#34;Retrieves a wire from the bus by a given index.
Args:
wire_index (int, optional): Index of wire to be retrieved from the bus. Defaults to 0.
Returns:
Wire: Returning wire from the bus.
&#34;&#34;&#34;
return self.bus[wire_index]
# Connecting output wire of the inner circuit component to desired position in the described circuit&#39;s output bus
def connect(self, bus_wire_index: int, inner_component_out_wire: Wire, inserted_wire_desired_index: int = -1):
&#34;&#34;&#34;Connects given &#39;Wire&#39; object to a &#39;bus_wire_index&#39; within this bus.
Used for connection of output wire of the inner circuit component
to the appropriate wire of the circuit&#39;s output bus.
Args:
bus_wire_index (int): Index in bus to store given wire in.
inner_component_out_wire (Wire): Wire of some other component (mostly its output) to store in the bus.
inserted_wire_desired_index(int, optional): Optional desired explicit index, where &#39;inner_component_out_wire&#39; value resides in the inner components&#39;s output bus. Otherwise &#39;inner_component_out_wire&#39; self index value is used. Defaults to -1.
&#34;&#34;&#34;
inserted_wire_index = inserted_wire_desired_index if inserted_wire_desired_index != -1 else inner_component_out_wire.index
# Used for connection of constant wire value into a bus
if inner_component_out_wire.is_const():
self.bus[bus_wire_index] = inner_component_out_wire
# Proper connection of wires that themselves are not yet a member of any other bus and also those that could be part of some bus but do not have `inserted_wire_desired_index` defined
elif inner_component_out_wire.parent_bus is None or inserted_wire_desired_index == -1:
self.bus[bus_wire_index] = Wire(name=inner_component_out_wire.name, prefix=inner_component_out_wire.prefix, index=inserted_wire_index, value=inner_component_out_wire.value, parent_bus=self)
# Proper connection of wires that are already a member of some other bus and are desired to connect value from their previous bus to this one at desired index position
elif inserted_wire_desired_index != -1:
self.bus[bus_wire_index] = Wire(name=inner_component_out_wire.name, prefix=inner_component_out_wire.parent_bus.prefix, index=inserted_wire_index, value=inner_component_out_wire.value, parent_bus=self)
&#34;&#34;&#34; C CODE GENERATION &#34;&#34;&#34;
def get_declaration_c(self):
&#34;&#34;&#34;Bus declaration in C code.
Returns:
str: C code for declaration and initialization of bus name.
&#34;&#34;&#34;
if self.N &gt; 8:
return f&#34; uint64_t {self.prefix} = 0;\n&#34;
else:
return f&#34; uint8_t {self.prefix} = 0;\n&#34;
def return_bus_wires_values_c_flat(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding C variable at proper offset bit position in the bus for flat generation.
Returns:
str: C code for assigning wire values into bus represented in C code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {self.prefix} |= {w.return_wire_value_c_flat(offset=self.bus.index(w))}&#34; for w in self.bus])
def return_bus_wires_values_c_hier(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding C variable at proper offset bit position in the bus for hierarchical generation.
Returns:
str: C code for assigning wire values into bus represented in C code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {self.prefix} |= {w.return_wire_value_c_hier(offset=self.bus.index(w))}&#34; for w in self.bus])
&#34;&#34;&#34; VERILOG CODE GENERATION &#34;&#34;&#34;
def return_bus_wires_values_v_flat(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding Verilog variable at proper offset bit position in the bus for flat generation.
Returns:
str: Verilog code for assigning wire values into bus represented in Verilog code bus variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; assign {self.prefix}[{self.bus.index(w)}] = {w.return_wire_value_v_flat()}&#34; for w in self.bus])
def return_bus_wires_values_v_hier(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding Verilog variable at proper offset bit position in the bus for hierarchical generation.
Returns:
str: Verilog code for assigning wire values into bus represented in Verilog code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; assign {self.prefix}[{self.bus.index(w)}] = {w.return_wire_value_v_hier()}&#34; for w in self.bus])
def get_unique_assign_out_wires_v(self, circuit_block: object):
&#34;&#34;&#34;Returns bus&#39;s wires used for hierarchical one bit subcomponent&#39;s function block invocation and output wires assignments.
Args:
circuit_block (object): Object describing corresponding function block that is being invoked for proper output wires assignment during instantiation.
Returns:
str: Verilog code unique bus wires for proper subcomponent&#39;s function block invocation.
&#34;&#34;&#34;
unique_out_wires = []
[unique_out_wires.append(w.prefix) if w.prefix not in unique_out_wires else None for w in self.bus]
return &#34;&#34;.join([f&#34;, .{circuit_block.out.get_wire(self.bus.index(o)).prefix}({unique_out_wires.pop(unique_out_wires.index(o.prefix))})&#34; if o.prefix in unique_out_wires else f&#34;, .{circuit_block.out.get_wire(self.bus.index(o)).prefix}()&#34; for o in self.bus])
&#34;&#34;&#34; BLIF CODE GENERATION &#34;&#34;&#34;
def get_wire_declaration_blif(self, array: bool = True):
&#34;&#34;&#34;Declare each wire from the bus independently in Blif code representation.
Args:
array (bool, optional): Specifies whether to declare wires from bus by their offset e.g. out[0] or by their wire name e.g. out_0. Defaults to True.
Returns:
str: Blif code for declaration of individual bus wires.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {w.get_declaration_blif(prefix=self.prefix, offset=self.bus.index(w), array=array)}&#34; for w in self.bus])
def get_wire_assign_blif(self, output: bool = False):
&#34;&#34;&#34;Assign all bits from the bus as each individual wires or assign wires into the corresponding output bus position in Blif code representation.
Args:
output (bool, optional): Specifies whether bus wires are used as outputs (True, assigned to) or as inputs (False, assigned from). Defaults to False.
Returns:
str: Blif code for bus wires assignments.
&#34;&#34;&#34;
return &#34;&#34;.join([w.get_assign_blif(prefix=self.prefix+f&#34;[{self.bus.index(w)}]&#34;, output=output) for w in self.bus])
def get_unique_assign_out_wires_blif(self, function_block_out_bus: object):
&#34;&#34;&#34;Assigns unique output wires to their respective outputs of subcomponent&#39;s function block modul in hierarchical Blif subcomponent&#39;s invocation.
Args:
function_block_out_bus (object): Specifies output bus of corresponding function block&#39;s outputs for proper subcomponent modul invocation.
Returns:
str: Blif code for proper subcomponent&#39;s function block invocation with respective output wires assignment.
&#34;&#34;&#34;
unique_out_wires = []
[unique_out_wires.append(w.prefix) if w.prefix not in unique_out_wires else None for w in self.bus]
return &#34;&#34;.join([f&#34; {function_block_out_bus.get_wire(self.bus.index(o)).name}={unique_out_wires.pop(unique_out_wires.index(o.prefix))}&#34; if o.prefix in unique_out_wires else &#34;&#34; for o in self.bus])</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.wire_components.buses.Bus"><code class="flex name class">
<span>class <span class="ident">Bus</span></span>
<span>(</span><span>prefix: str = 'bus', N: int = 1, wires_list: list = None)</span>
</code></dt>
<dd>
<div class="desc"><p>Class representing bus of wires used as inputs/outputs of bigger circuits.</p>
<p>Description of the <strong>init</strong> method.</p>
<h2 id="args">Args</h2>
<dl>
<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>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>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class Bus():
&#34;&#34;&#34;Class representing bus of wires used as inputs/outputs of bigger circuits.
Description of the __init__ method.
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.
&#34;&#34;&#34;
def __init__(self, prefix: str = &#34;bus&#34;, N: int = 1, wires_list: list = None):
if wires_list is None:
self.prefix = prefix
# 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(N)]
self.N = N
else:
self.prefix = prefix
self.bus = wires_list
self.N = len(self.bus)
def bus_extend(self, N: int, prefix: str = &#34;bus&#34;):
&#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;.
&#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)]
self.N = N
def get_wire(self, wire_index: int = 0):
&#34;&#34;&#34;Retrieves a wire from the bus by a given index.
Args:
wire_index (int, optional): Index of wire to be retrieved from the bus. Defaults to 0.
Returns:
Wire: Returning wire from the bus.
&#34;&#34;&#34;
return self.bus[wire_index]
# Connecting output wire of the inner circuit component to desired position in the described circuit&#39;s output bus
def connect(self, bus_wire_index: int, inner_component_out_wire: Wire, inserted_wire_desired_index: int = -1):
&#34;&#34;&#34;Connects given &#39;Wire&#39; object to a &#39;bus_wire_index&#39; within this bus.
Used for connection of output wire of the inner circuit component
to the appropriate wire of the circuit&#39;s output bus.
Args:
bus_wire_index (int): Index in bus to store given wire in.
inner_component_out_wire (Wire): Wire of some other component (mostly its output) to store in the bus.
inserted_wire_desired_index(int, optional): Optional desired explicit index, where &#39;inner_component_out_wire&#39; value resides in the inner components&#39;s output bus. Otherwise &#39;inner_component_out_wire&#39; self index value is used. Defaults to -1.
&#34;&#34;&#34;
inserted_wire_index = inserted_wire_desired_index if inserted_wire_desired_index != -1 else inner_component_out_wire.index
# Used for connection of constant wire value into a bus
if inner_component_out_wire.is_const():
self.bus[bus_wire_index] = inner_component_out_wire
# Proper connection of wires that themselves are not yet a member of any other bus and also those that could be part of some bus but do not have `inserted_wire_desired_index` defined
elif inner_component_out_wire.parent_bus is None or inserted_wire_desired_index == -1:
self.bus[bus_wire_index] = Wire(name=inner_component_out_wire.name, prefix=inner_component_out_wire.prefix, index=inserted_wire_index, value=inner_component_out_wire.value, parent_bus=self)
# Proper connection of wires that are already a member of some other bus and are desired to connect value from their previous bus to this one at desired index position
elif inserted_wire_desired_index != -1:
self.bus[bus_wire_index] = Wire(name=inner_component_out_wire.name, prefix=inner_component_out_wire.parent_bus.prefix, index=inserted_wire_index, value=inner_component_out_wire.value, parent_bus=self)
&#34;&#34;&#34; C CODE GENERATION &#34;&#34;&#34;
def get_declaration_c(self):
&#34;&#34;&#34;Bus declaration in C code.
Returns:
str: C code for declaration and initialization of bus name.
&#34;&#34;&#34;
if self.N &gt; 8:
return f&#34; uint64_t {self.prefix} = 0;\n&#34;
else:
return f&#34; uint8_t {self.prefix} = 0;\n&#34;
def return_bus_wires_values_c_flat(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding C variable at proper offset bit position in the bus for flat generation.
Returns:
str: C code for assigning wire values into bus represented in C code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {self.prefix} |= {w.return_wire_value_c_flat(offset=self.bus.index(w))}&#34; for w in self.bus])
def return_bus_wires_values_c_hier(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding C variable at proper offset bit position in the bus for hierarchical generation.
Returns:
str: C code for assigning wire values into bus represented in C code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {self.prefix} |= {w.return_wire_value_c_hier(offset=self.bus.index(w))}&#34; for w in self.bus])
&#34;&#34;&#34; VERILOG CODE GENERATION &#34;&#34;&#34;
def return_bus_wires_values_v_flat(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding Verilog variable at proper offset bit position in the bus for flat generation.
Returns:
str: Verilog code for assigning wire values into bus represented in Verilog code bus variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; assign {self.prefix}[{self.bus.index(w)}] = {w.return_wire_value_v_flat()}&#34; for w in self.bus])
def return_bus_wires_values_v_hier(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding Verilog variable at proper offset bit position in the bus for hierarchical generation.
Returns:
str: Verilog code for assigning wire values into bus represented in Verilog code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; assign {self.prefix}[{self.bus.index(w)}] = {w.return_wire_value_v_hier()}&#34; for w in self.bus])
def get_unique_assign_out_wires_v(self, circuit_block: object):
&#34;&#34;&#34;Returns bus&#39;s wires used for hierarchical one bit subcomponent&#39;s function block invocation and output wires assignments.
Args:
circuit_block (object): Object describing corresponding function block that is being invoked for proper output wires assignment during instantiation.
Returns:
str: Verilog code unique bus wires for proper subcomponent&#39;s function block invocation.
&#34;&#34;&#34;
unique_out_wires = []
[unique_out_wires.append(w.prefix) if w.prefix not in unique_out_wires else None for w in self.bus]
return &#34;&#34;.join([f&#34;, .{circuit_block.out.get_wire(self.bus.index(o)).prefix}({unique_out_wires.pop(unique_out_wires.index(o.prefix))})&#34; if o.prefix in unique_out_wires else f&#34;, .{circuit_block.out.get_wire(self.bus.index(o)).prefix}()&#34; for o in self.bus])
&#34;&#34;&#34; BLIF CODE GENERATION &#34;&#34;&#34;
def get_wire_declaration_blif(self, array: bool = True):
&#34;&#34;&#34;Declare each wire from the bus independently in Blif code representation.
Args:
array (bool, optional): Specifies whether to declare wires from bus by their offset e.g. out[0] or by their wire name e.g. out_0. Defaults to True.
Returns:
str: Blif code for declaration of individual bus wires.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {w.get_declaration_blif(prefix=self.prefix, offset=self.bus.index(w), array=array)}&#34; for w in self.bus])
def get_wire_assign_blif(self, output: bool = False):
&#34;&#34;&#34;Assign all bits from the bus as each individual wires or assign wires into the corresponding output bus position in Blif code representation.
Args:
output (bool, optional): Specifies whether bus wires are used as outputs (True, assigned to) or as inputs (False, assigned from). Defaults to False.
Returns:
str: Blif code for bus wires assignments.
&#34;&#34;&#34;
return &#34;&#34;.join([w.get_assign_blif(prefix=self.prefix+f&#34;[{self.bus.index(w)}]&#34;, output=output) for w in self.bus])
def get_unique_assign_out_wires_blif(self, function_block_out_bus: object):
&#34;&#34;&#34;Assigns unique output wires to their respective outputs of subcomponent&#39;s function block modul in hierarchical Blif subcomponent&#39;s invocation.
Args:
function_block_out_bus (object): Specifies output bus of corresponding function block&#39;s outputs for proper subcomponent modul invocation.
Returns:
str: Blif code for proper subcomponent&#39;s function block invocation with respective output wires assignment.
&#34;&#34;&#34;
unique_out_wires = []
[unique_out_wires.append(w.prefix) if w.prefix not in unique_out_wires else None for w in self.bus]
return &#34;&#34;.join([f&#34; {function_block_out_bus.get_wire(self.bus.index(o)).name}={unique_out_wires.pop(unique_out_wires.index(o.prefix))}&#34; if o.prefix in unique_out_wires else &#34;&#34; for o in self.bus])</code></pre>
</details>
<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>
</code></dt>
<dd>
<div class="desc"><p>Provides bus extension to contain more wires.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>N</code></strong> :&ensp;<code>int</code></dt>
<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>
</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;):
&#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;.
&#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)]
self.N = N</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.connect"><code class="name flex">
<span>def <span class="ident">connect</span></span>(<span>self, bus_wire_index: int, inner_component_out_wire: <a title="ariths_gen.wire_components.wires.Wire" href="wires.html#ariths_gen.wire_components.wires.Wire">Wire</a>, inserted_wire_desired_index: int = -1)</span>
</code></dt>
<dd>
<div class="desc"><p>Connects given 'Wire' object to a 'bus_wire_index' within this bus.</p>
<p>Used for connection of output wire of the inner circuit component
to the appropriate wire of the circuit's output bus.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>bus_wire_index</code></strong> :&ensp;<code>int</code></dt>
<dd>Index in bus to store given wire in.</dd>
<dt><strong><code>inner_component_out_wire</code></strong> :&ensp;<code>Wire</code></dt>
<dd>Wire of some other component (mostly its output) to store in the bus.</dd>
</dl>
<p>inserted_wire_desired_index(int, optional): Optional desired explicit index, where 'inner_component_out_wire' value resides in the inner components's output bus. Otherwise 'inner_component_out_wire' self index value is used. Defaults to -1.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def connect(self, bus_wire_index: int, inner_component_out_wire: Wire, inserted_wire_desired_index: int = -1):
&#34;&#34;&#34;Connects given &#39;Wire&#39; object to a &#39;bus_wire_index&#39; within this bus.
Used for connection of output wire of the inner circuit component
to the appropriate wire of the circuit&#39;s output bus.
Args:
bus_wire_index (int): Index in bus to store given wire in.
inner_component_out_wire (Wire): Wire of some other component (mostly its output) to store in the bus.
inserted_wire_desired_index(int, optional): Optional desired explicit index, where &#39;inner_component_out_wire&#39; value resides in the inner components&#39;s output bus. Otherwise &#39;inner_component_out_wire&#39; self index value is used. Defaults to -1.
&#34;&#34;&#34;
inserted_wire_index = inserted_wire_desired_index if inserted_wire_desired_index != -1 else inner_component_out_wire.index
# Used for connection of constant wire value into a bus
if inner_component_out_wire.is_const():
self.bus[bus_wire_index] = inner_component_out_wire
# Proper connection of wires that themselves are not yet a member of any other bus and also those that could be part of some bus but do not have `inserted_wire_desired_index` defined
elif inner_component_out_wire.parent_bus is None or inserted_wire_desired_index == -1:
self.bus[bus_wire_index] = Wire(name=inner_component_out_wire.name, prefix=inner_component_out_wire.prefix, index=inserted_wire_index, value=inner_component_out_wire.value, parent_bus=self)
# Proper connection of wires that are already a member of some other bus and are desired to connect value from their previous bus to this one at desired index position
elif inserted_wire_desired_index != -1:
self.bus[bus_wire_index] = Wire(name=inner_component_out_wire.name, prefix=inner_component_out_wire.parent_bus.prefix, index=inserted_wire_index, value=inner_component_out_wire.value, parent_bus=self)</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.get_declaration_c"><code class="name flex">
<span>def <span class="ident">get_declaration_c</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Bus declaration in C code.</p>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>C code for declaration and initialization of bus name.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_declaration_c(self):
&#34;&#34;&#34;Bus declaration in C code.
Returns:
str: C code for declaration and initialization of bus name.
&#34;&#34;&#34;
if self.N &gt; 8:
return f&#34; uint64_t {self.prefix} = 0;\n&#34;
else:
return f&#34; uint8_t {self.prefix} = 0;\n&#34;</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.get_unique_assign_out_wires_blif"><code class="name flex">
<span>def <span class="ident">get_unique_assign_out_wires_blif</span></span>(<span>self, function_block_out_bus: object)</span>
</code></dt>
<dd>
<div class="desc"><p>Assigns unique output wires to their respective outputs of subcomponent's function block modul in hierarchical Blif subcomponent's invocation.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>function_block_out_bus</code></strong> :&ensp;<code>object</code></dt>
<dd>Specifies output bus of corresponding function block's outputs for proper subcomponent modul invocation.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>Blif code for proper subcomponent's function block invocation with respective output wires assignment.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_unique_assign_out_wires_blif(self, function_block_out_bus: object):
&#34;&#34;&#34;Assigns unique output wires to their respective outputs of subcomponent&#39;s function block modul in hierarchical Blif subcomponent&#39;s invocation.
Args:
function_block_out_bus (object): Specifies output bus of corresponding function block&#39;s outputs for proper subcomponent modul invocation.
Returns:
str: Blif code for proper subcomponent&#39;s function block invocation with respective output wires assignment.
&#34;&#34;&#34;
unique_out_wires = []
[unique_out_wires.append(w.prefix) if w.prefix not in unique_out_wires else None for w in self.bus]
return &#34;&#34;.join([f&#34; {function_block_out_bus.get_wire(self.bus.index(o)).name}={unique_out_wires.pop(unique_out_wires.index(o.prefix))}&#34; if o.prefix in unique_out_wires else &#34;&#34; for o in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.get_unique_assign_out_wires_v"><code class="name flex">
<span>def <span class="ident">get_unique_assign_out_wires_v</span></span>(<span>self, circuit_block: object)</span>
</code></dt>
<dd>
<div class="desc"><p>Returns bus's wires used for hierarchical one bit subcomponent's function block invocation and output wires assignments.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>circuit_block</code></strong> :&ensp;<code>object</code></dt>
<dd>Object describing corresponding function block that is being invoked for proper output wires assignment during instantiation.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>Verilog code unique bus wires for proper subcomponent's function block invocation.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_unique_assign_out_wires_v(self, circuit_block: object):
&#34;&#34;&#34;Returns bus&#39;s wires used for hierarchical one bit subcomponent&#39;s function block invocation and output wires assignments.
Args:
circuit_block (object): Object describing corresponding function block that is being invoked for proper output wires assignment during instantiation.
Returns:
str: Verilog code unique bus wires for proper subcomponent&#39;s function block invocation.
&#34;&#34;&#34;
unique_out_wires = []
[unique_out_wires.append(w.prefix) if w.prefix not in unique_out_wires else None for w in self.bus]
return &#34;&#34;.join([f&#34;, .{circuit_block.out.get_wire(self.bus.index(o)).prefix}({unique_out_wires.pop(unique_out_wires.index(o.prefix))})&#34; if o.prefix in unique_out_wires else f&#34;, .{circuit_block.out.get_wire(self.bus.index(o)).prefix}()&#34; for o in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.get_wire"><code class="name flex">
<span>def <span class="ident">get_wire</span></span>(<span>self, wire_index: int = 0)</span>
</code></dt>
<dd>
<div class="desc"><p>Retrieves a wire from the bus by a given index.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>wire_index</code></strong> :&ensp;<code>int</code>, optional</dt>
<dd>Index of wire to be retrieved from the bus. Defaults to 0.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>Wire</code></dt>
<dd>Returning wire from the bus.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_wire(self, wire_index: int = 0):
&#34;&#34;&#34;Retrieves a wire from the bus by a given index.
Args:
wire_index (int, optional): Index of wire to be retrieved from the bus. Defaults to 0.
Returns:
Wire: Returning wire from the bus.
&#34;&#34;&#34;
return self.bus[wire_index]</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.get_wire_assign_blif"><code class="name flex">
<span>def <span class="ident">get_wire_assign_blif</span></span>(<span>self, output: bool = False)</span>
</code></dt>
<dd>
<div class="desc"><p>Assign all bits from the bus as each individual wires or assign wires into the corresponding output bus position in Blif code representation.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>output</code></strong> :&ensp;<code>bool</code>, optional</dt>
<dd>Specifies whether bus wires are used as outputs (True, assigned to) or as inputs (False, assigned from). Defaults to False.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>Blif code for bus wires assignments.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_wire_assign_blif(self, output: bool = False):
&#34;&#34;&#34;Assign all bits from the bus as each individual wires or assign wires into the corresponding output bus position in Blif code representation.
Args:
output (bool, optional): Specifies whether bus wires are used as outputs (True, assigned to) or as inputs (False, assigned from). Defaults to False.
Returns:
str: Blif code for bus wires assignments.
&#34;&#34;&#34;
return &#34;&#34;.join([w.get_assign_blif(prefix=self.prefix+f&#34;[{self.bus.index(w)}]&#34;, output=output) for w in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.get_wire_declaration_blif"><code class="name flex">
<span>def <span class="ident">get_wire_declaration_blif</span></span>(<span>self, array: bool = True)</span>
</code></dt>
<dd>
<div class="desc"><p>Declare each wire from the bus independently in Blif code representation.</p>
<h2 id="args">Args</h2>
<dl>
<dt><strong><code>array</code></strong> :&ensp;<code>bool</code>, optional</dt>
<dd>Specifies whether to declare wires from bus by their offset e.g. out[0] or by their wire name e.g. out_0. Defaults to True.</dd>
</dl>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>Blif code for declaration of individual bus wires.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_wire_declaration_blif(self, array: bool = True):
&#34;&#34;&#34;Declare each wire from the bus independently in Blif code representation.
Args:
array (bool, optional): Specifies whether to declare wires from bus by their offset e.g. out[0] or by their wire name e.g. out_0. Defaults to True.
Returns:
str: Blif code for declaration of individual bus wires.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {w.get_declaration_blif(prefix=self.prefix, offset=self.bus.index(w), array=array)}&#34; for w in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_c_flat"><code class="name flex">
<span>def <span class="ident">return_bus_wires_values_c_flat</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Retrieves values from bus's wires and stores them in bus's corresponding C variable at proper offset bit position in the bus for flat generation.</p>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>C code for assigning wire values into bus represented in C code variable.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def return_bus_wires_values_c_flat(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding C variable at proper offset bit position in the bus for flat generation.
Returns:
str: C code for assigning wire values into bus represented in C code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {self.prefix} |= {w.return_wire_value_c_flat(offset=self.bus.index(w))}&#34; for w in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_c_hier"><code class="name flex">
<span>def <span class="ident">return_bus_wires_values_c_hier</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Retrieves values from bus's wires and stores them in bus's corresponding C variable at proper offset bit position in the bus for hierarchical generation.</p>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>C code for assigning wire values into bus represented in C code variable.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def return_bus_wires_values_c_hier(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding C variable at proper offset bit position in the bus for hierarchical generation.
Returns:
str: C code for assigning wire values into bus represented in C code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; {self.prefix} |= {w.return_wire_value_c_hier(offset=self.bus.index(w))}&#34; for w in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_v_flat"><code class="name flex">
<span>def <span class="ident">return_bus_wires_values_v_flat</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Retrieves values from bus's wires and stores them in bus's corresponding Verilog variable at proper offset bit position in the bus for flat generation.</p>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>Verilog code for assigning wire values into bus represented in Verilog code bus variable.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def return_bus_wires_values_v_flat(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding Verilog variable at proper offset bit position in the bus for flat generation.
Returns:
str: Verilog code for assigning wire values into bus represented in Verilog code bus variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; assign {self.prefix}[{self.bus.index(w)}] = {w.return_wire_value_v_flat()}&#34; for w in self.bus])</code></pre>
</details>
</dd>
<dt id="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_v_hier"><code class="name flex">
<span>def <span class="ident">return_bus_wires_values_v_hier</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Retrieves values from bus's wires and stores them in bus's corresponding Verilog variable at proper offset bit position in the bus for hierarchical generation.</p>
<h2 id="returns">Returns</h2>
<dl>
<dt><code>str</code></dt>
<dd>Verilog code for assigning wire values into bus represented in Verilog code variable.</dd>
</dl></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def return_bus_wires_values_v_hier(self):
&#34;&#34;&#34;Retrieves values from bus&#39;s wires and stores them in bus&#39;s corresponding Verilog variable at proper offset bit position in the bus for hierarchical generation.
Returns:
str: Verilog code for assigning wire values into bus represented in Verilog code variable.
&#34;&#34;&#34;
return &#34;&#34;.join([f&#34; assign {self.prefix}[{self.bus.index(w)}] = {w.return_wire_value_v_hier()}&#34; for w in self.bus])</code></pre>
</details>
</dd>
</dl>
</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.wire_components" href="index.html">ariths_gen.wire_components</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="ariths_gen.wire_components.buses.Bus" href="#ariths_gen.wire_components.buses.Bus">Bus</a></code></h4>
<ul class="">
<li><code><a title="ariths_gen.wire_components.buses.Bus.bus_extend" href="#ariths_gen.wire_components.buses.Bus.bus_extend">bus_extend</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.connect" href="#ariths_gen.wire_components.buses.Bus.connect">connect</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.get_declaration_c" href="#ariths_gen.wire_components.buses.Bus.get_declaration_c">get_declaration_c</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.get_unique_assign_out_wires_blif" href="#ariths_gen.wire_components.buses.Bus.get_unique_assign_out_wires_blif">get_unique_assign_out_wires_blif</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.get_unique_assign_out_wires_v" href="#ariths_gen.wire_components.buses.Bus.get_unique_assign_out_wires_v">get_unique_assign_out_wires_v</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.get_wire" href="#ariths_gen.wire_components.buses.Bus.get_wire">get_wire</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.get_wire_assign_blif" href="#ariths_gen.wire_components.buses.Bus.get_wire_assign_blif">get_wire_assign_blif</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.get_wire_declaration_blif" href="#ariths_gen.wire_components.buses.Bus.get_wire_declaration_blif">get_wire_declaration_blif</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_c_flat" href="#ariths_gen.wire_components.buses.Bus.return_bus_wires_values_c_flat">return_bus_wires_values_c_flat</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_c_hier" href="#ariths_gen.wire_components.buses.Bus.return_bus_wires_values_c_hier">return_bus_wires_values_c_hier</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_v_flat" href="#ariths_gen.wire_components.buses.Bus.return_bus_wires_values_v_flat">return_bus_wires_values_v_flat</a></code></li>
<li><code><a title="ariths_gen.wire_components.buses.Bus.return_bus_wires_values_v_hier" href="#ariths_gen.wire_components.buses.Bus.return_bus_wires_values_v_hier">return_bus_wires_values_v_hier</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.2</a>.</p>
</footer>
</body>
</html>