diff --git a/LICENSE b/LICENSE
index 63b4b68..a46a1e0 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) [year] [fullname]
+Copyright (c) 2018 James Jiang
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.rst b/README.rst
index b1092da..838c6f3 100644
--- a/README.rst
+++ b/README.rst
@@ -46,7 +46,7 @@ Interacting with it in a Python session::
In [2]: b.value = 0
- In [3]: sum.value
+ In [3]: sum_.value
Out[3]: 0
In [4]: carry_out.value
@@ -54,7 +54,7 @@ Interacting with it in a Python session::
In [5]: a.value = 1
- In [6]: sum.value
+ In [6]: sum_.value
Out[6]: 1
In [7]: carry_out.value
@@ -62,7 +62,7 @@ Interacting with it in a Python session::
In [8]: b.value = 1
- In [9]: sum.value
+ In [9]: sum_.value
Out[9]: 0
In [10]: carry_out.value
diff --git a/bitwise/signal/__init__.py b/bitwise/signal/__init__.py
index 7170fe7..140db94 100644
--- a/bitwise/signal/__init__.py
+++ b/bitwise/signal/__init__.py
@@ -3,6 +3,4 @@
from .ENC import *
from .MUX import *
from .INV_CTRL import *
-from .PISO import *
-from .SIPO import *
from .SSD import *
diff --git a/bitwise/storage/FLOP.py b/bitwise/storage/FLOP.py
index 180d511..38a3567 100644
--- a/bitwise/storage/FLOP.py
+++ b/bitwise/storage/FLOP.py
@@ -1,9 +1,4 @@
"""
-This module defines classes that simulate primitive storage elements, namely
-1-bit latches and 1-bit flip-flops. Latches are level-sensitive, changing their
-value according to the value of a clock input, while flip-flops are edge-
-sensitive, changing their value according to edges of a clock input.
-
The following classes are defined:
SRLatch
GatedSRLatch
@@ -24,16 +19,15 @@
class SRLatch:
- """
- This class simulates an SR latch, which has two inputs and two outputs:
- ________
- set ----| |---- output
- reset ----|________|---- output_not
-
- If set is 1 and reset is 0, output and output_not are 1 and 0,
- respectively. If set is 0 and reset is 1, output and output_not are 0 and
- 1, respectively. If both set and reset are 0, output and output_not hold
- their current values. The input where both set and reset are 1 is not used.
+ """Construct a new SR latch.
+
+ Args:
+ set_: An object of type Wire. The set input to the latch.
+ reset: An object of type Wire. The reset input to the latch.
+ output: An object of type Wire. The output of the latch. Takes on the
+ value of 1 if the value of set is 1 and the value of 0 if the value
+ of reset is 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, set_, reset, output, output_not):
gate.NORGate2(set_, output, output_not)
@@ -41,21 +35,16 @@ def __init__(self, set_, reset, output, output_not):
class GatedSRLatch:
- """
- This class simulates a gated SR latch, which has three inputs, including a
- clock, and two outputs:
- ________
- set ----| |---- output
- reset ----| |---- output_not
- clock ----|________|
-
- If clock is 0, output and output_not hold their current values, regardless
- of the set and reset inputs. If clock is 1 and set and reset are 1 and 0,
- respectively, output and output_not are 1 and 0, respectively. If clock is
- 1 and set and reset are 1 and 0, respectively, output and output_not are 0
- and 1, respectively. If clock is 1 and both set and reset are 0, output and
- output_not hold their current values. The input where both set and reset
- are 1 is not used.
+ """Construct a new gated SR latch.
+
+ Args:
+ set_: An object of type Wire. The set input to the latch.
+ reset: An object of type Wire. The reset input to the latch.
+ clock: An object of type Wire. The clock input to the latch.
+ output: An object of type Wire. The output of the latch. When the value
+ of clock is 1, takes on the value of 1 if the value of set is 1 and
+ the value of 0 if the value of reset is 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, set_, reset, clock, output, output_not):
wire_1 = Wire()
@@ -67,16 +56,14 @@ def __init__(self, set_, reset, clock, output, output_not):
class GatedDLatch:
- """
- This class simulates a gated D latch, which has two inputs, including a
- clock, and two outputs:
- ________
- data ----| |---- output
- clock ----|________|---- output_not
-
- If clock is 0, output and output_not hold their current values, regardless
- of the data input. If clock is 1, output takes on the value of data and
- output_not takes on the opposite value.
+ """Construct a new gated D latch.
+
+ Args:
+ data: An object of type Wire. The data input to the latch.
+ clock: An object of type Wire. The clock input to the latch.
+ output: An object of type Wire. The output of the latch. Takes on the
+ value of data if the value of clock is 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, data, clock, output, output_not):
wire_1 = Wire()
@@ -86,17 +73,14 @@ def __init__(self, data, clock, output, output_not):
class DFlipFlop:
- """
- This class simulates a D flip-flop, which has two inputs, including a
- clock, and two outputs:
- ________
- data ----| |---- output
- clock ----|________|---- output_not
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), output takes on the value of data and output_not takes on
- the opposite value. Otherwise, output and output_not hold their current
- values.
+ """Construct a new positive edge-triggered D flip-flop.
+
+ Args:
+ data: An object of type Wire. The data input to the flip-flop.
+ clock: An object of type Wire. The clock input to the flip-flop.
+ output: An object of type Wire. The output of the flip-flop. Takes on
+ the value of data on the positive edges of clock.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, data, clock, output, output_not):
q_1 = Wire()
@@ -109,24 +93,19 @@ def __init__(self, data, clock, output, output_not):
class DFlipFlopPresetClear:
- """
- This class simulates a D flip-flop, with additional inputs for presetting
- and clearing the flip_flop. It has four inputs, including a clock, and two
- outputs:
- ________
- data ----| |---- output
- preset_n ----| |---- output_not
- clear_n ----| |
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), output takes on the value of data and output_not takes on
- the opposite value. Otherwise, output and output_not hold their current
- values.
-
- Inputs preset_n and clear_n are, respectively, an active low
- asynchronous preset (setting output to 1 and output_not to 0) and an active
- low asynchronous clear (setting output to 0 and output_not to 1).
+ """Construct a new positive edge-triggered D flip-flop with preset/clear
+ capabilities.
+
+ Args:
+ data: An object of type Wire. The data input to the flip-flop.
+ preset_n: An object of type Wire. Presets output to 1 and output_not to
+ 0 if its value is 0.
+ clear_n: An object of type Wire. Clears output to 0 and output_not to 1
+ if its value is 0.
+ clock: An object of type Wire. The clock input to the flip-flop.
+ output: An object of type Wire. The output of the flip-flop. Takes on
+ the value of data on the positive edges of clock.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, data, preset_n, clear_n, clock, output, output_not):
not_clock = Wire()
@@ -151,17 +130,15 @@ def __init__(self, data, preset_n, clear_n, clock, output, output_not):
class TFlipFlop:
- """
- This class simulates a T flip-flop, which has two inputs, including a
- clock, and two outputs:
- ________
- toggle ----| |---- output
- clock ----|________|---- output_not
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), if toggle has the value 1, both output and output_not toggle
- their current values. If toggle has the value 0, both output and output_not
- are unchanged.
+ """Construct a new positive edge-triggered T flip-flop.
+
+ Args:
+ toggle: An object of type Wire. The toggle input to the flip-flop.
+ clock: An object of type Wire. The clock input to the flip-flop.
+ output: An object of type Wire. The output of the flip-flop. Toggles
+ its value on the positive edges of clock if the value of toggle is
+ 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, toggle, clock, output, output_not):
mux_output = Wire()
@@ -173,24 +150,20 @@ def __init__(self, toggle, clock, output, output_not):
class TFlipFlopPresetClear:
- """
- This class simulates a T flip-flop, with additional inputs for presetting
- and clearing the flip_flop. It has four inputs, including a clock, and two
- outputs:
- ________
- toggle ----| |---- output
- preset_n ----| |---- output_not
- clear_n ----| |
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), if toggle has the value 1, both output and output_not toggle
- their current values. If toggle has the value 0, both output and output_not
- are unchanged.
-
- Inputs preset_n and clear_n are, respectively, an active low
- asynchronous preset (setting output to 1 and output_not to 0) and an active
- low asynchronous clear (setting output to 0 and output_not to 1).
+ """Construct a new positive edge-triggered T flip-flop with preset/clear
+ capabilities.
+
+ Args:
+ toggle: An object of type Wire. The toggle input to the flip-flop.
+ preset_n: An object of type Wire. Presets output to 1 and output_not to
+ 0 if its value is 0.
+ clear_n: An object of type Wire. Clears output to 0 and output_not to 1
+ if its value is 0.
+ clock: An object of type Wire. The clock input to the flip-flop.
+ output: An object of type Wire. The output of the flip-flop. Toggles
+ its value on the positive edges of clock if the value of toggle is
+ 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, toggle, preset_n, clear_n, clock, output, output_not):
mux_output = Wire()
@@ -209,20 +182,17 @@ def __init__(self, toggle, preset_n, clear_n, clock, output, output_not):
class JKFlipFlop:
- """
- This class simulates a JK flip-flop, which has three inputs, including a
- clock, and two outputs:
- ________
- J ----| |---- output
- K ----| |---- output_not
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), if J is 1 and K is 0, output and output_not are 1 and 0,
- respectively. If J is 0 and K is 1, output and output_not are 0 and 1,
- respectively. If J and K are both 0, both output and output_not hold their
- current values. If J and K are both 1, both output and output_not toggle
- their current values.
+ """Construct a new positive edge-triggered JK flip-flop.
+
+ Args:
+ J: An object of type Wire. The J input to the flip-flop.
+ K: An object of type Wire. The K input to the flip-flop.
+ clock: An object of type Wire. The clock input to the flip-flop.
+ output: An object of type Wire. The output of the flip-flop. On the
+ positive edges of clock, takes on the value of 1 if the value of J
+ is 1, takes on the value of 0 if the value of K is 1, and toggles
+ its value if both J and K have value 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, j, k, clock, output, output_not):
and_1 = Wire()
@@ -238,27 +208,22 @@ def __init__(self, j, k, clock, output, output_not):
class JKFlipFlopPresetClear:
- """
- This class simulates a JK flip-flop, with additional inputs for presetting
- and clearing the flip_flop. It has five inputs, including a clock, and two
- outputs:
- ________
- J ----| |---- output
- K ----| |---- output_not
- preset_n ----| |
- clear_n ----| |
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), if J is 1 and K is 0, output and output_not are 1 and 0,
- respectively. If J is 0 and K is 1, output and output_not are 0 and 1,
- respectively. If J and K are both 0, both output and output_not hold their
- current values. If J and K are both 1, both output and output_not toggle
- their current values.
-
- Inputs preset_n and clear_n are, respectively, an active low
- asynchronous preset (setting output to 1 and output_not to 0) and an active
- low asynchronous clear (setting output to 0 and output_not to 1).
+ """Construct a new positive edge-triggered JK flip-flop with preset/clear
+ capabilities.
+
+ Args:
+ J: An object of type Wire. The J input to the flip-flop.
+ K: An object of type Wire. The K input to the flip-flop.
+ preset_n: An object of type Wire. Presets output to 1 and output_not to
+ 0 if its value is 0.
+ clear_n: An object of type Wire. Clears output to 0 and output_not to 1
+ if its value is 0.
+ clock: An object of type Wire. The clock input to the flip-flop.
+ output: An object of type Wire. The output of the flip-flop. On the
+ positive edges of clock, takes on the value of 1 if the value of J
+ is 1, takes on the value of 0 if the value of K is 1, and toggles
+ its value if both J and K have value 1.
+ output_not: An object of type Wire. The complemented form of output.
"""
def __init__(self, j, k, preset_n, clear_n, clock, output, output_not):
and_1 = Wire()
diff --git a/bitwise/signal/PISO.py b/bitwise/storage/PISO.py
similarity index 52%
rename from bitwise/signal/PISO.py
rename to bitwise/storage/PISO.py
index 7702196..3ed651e 100644
--- a/bitwise/signal/PISO.py
+++ b/bitwise/storage/PISO.py
@@ -15,8 +15,23 @@
class ParallelToSerialConverter4To1:
- """
-
+ """Construct a new 4-bit-parallel-to-serial converter.
+
+ Args:
+ enable: An object of type Wire. Enables the converter.
+ clear_n: An object of type Wire. Clears all 4 internal registers to 0
+ if its value is 0.
+ load_n: An object of type Wire. The mode select. A value of 0 indicates
+ a parallel load operation, where the values of data_bus are loaded
+ into the internal registers. A value of 1 indicates a shift-right
+ operation.
+ data_bus: An object of type Bus4. The parallel data input.
+ clock: An object of type Wire or Clock. The clock input.
+ output: An object of type Wire. The serial output of the converter.
+ data_bus[3] is outputted first, and data_bus[0] is outputted last.
+
+ Raises:
+ TypeError: If data_bus is not a bus of width 4.
"""
def __init__(
self,
@@ -27,10 +42,10 @@ def __init__(
clock,
output
):
- if len(data_bus.wires) != 4:
+ if len(data_bus) != 4:
raise TypeError(
"Expected bus of width 4, received bus of width {0}.".format(
- len(data_bus.wires)
+ len(data_bus)
)
)
@@ -59,8 +74,23 @@ def __init__(
class ParallelToSerialConverter8To1:
- """
-
+ """Construct a new 8-bit-parallel-to-serial converter.
+
+ Args:
+ enable: An object of type Wire. Enables the converter.
+ clear_n: An object of type Wire. Clears all 8 internal registers to 0
+ if its value is 0.
+ load_n: An object of type Wire. The mode select. A value of 0 indicates
+ a parallel load operation, where the values of data_bus are loaded
+ into the internal registers. A value of 1 indicates a shift-right
+ operation.
+ data_bus: An object of type Bus8. The parallel data input.
+ clock: An object of type Wire or Clock. The clock input.
+ output: An object of type Wire. The serial output of the converter.
+ data_bus[7] is outputted first, and data_bus[0] is outputted last.
+
+ Raises:
+ TypeError: If data_bus is not a bus of width 8.
"""
def __init__(
self,
@@ -71,10 +101,10 @@ def __init__(
clock,
output
):
- if len(data_bus.wires) != 8:
+ if len(data_bus) != 8:
raise TypeError(
"Expected bus of width 8, received bus of width {0}.".format(
- len(data_bus.wires)
+ len(data_bus)
)
)
@@ -107,8 +137,23 @@ def __init__(
class ParallelToSerialConverter16To1:
- """
-
+ """Construct a new 16-bit-parallel-to-serial converter.
+
+ Args:
+ enable: An object of type Wire. Enables the converter.
+ clear_n: An object of type Wire. Clears all 16 internal registers to 0
+ if its value is 0.
+ load_n: An object of type Wire. The mode select. A value of 0 indicates
+ a parallel load operation, where the values of data_bus are loaded
+ into the internal registers. A value of 1 indicates a shift-right
+ operation.
+ data_bus: An object of type Bus16. The parallel data input.
+ clock: An object of type Wire or Clock. The clock input.
+ output: An object of type Wire. The serial output of the converter.
+ data_bus[15] is outputted first, and data_bus[0] is outputted last.
+
+ Raises:
+ TypeError: If data_bus is not a bus of width 16.
"""
def __init__(
self,
@@ -119,10 +164,10 @@ def __init__(
clock,
output
):
- if len(data_bus.wires) != 16:
+ if len(data_bus) != 16:
raise TypeError(
"Expected bus of width 16, received bus of width {0}.".format(
- len(data_bus.wires)
+ len(data_bus)
)
)
diff --git a/bitwise/storage/REG.py b/bitwise/storage/REG.py
index 4437693..8c80f93 100644
--- a/bitwise/storage/REG.py
+++ b/bitwise/storage/REG.py
@@ -1,8 +1,4 @@
"""
-This module defines classes that simulate storage registers. These registers
-are simply arrays of single-bit flip-flops, and they serve the same purpose as
-flip-flops as well, being used for storing data.
-
The following classes are defined:
Register4
Register8
@@ -16,33 +12,30 @@
class Register4:
- """
- This register has four inputs in a single 4-bit bus, a clock input, and
- four outputs in a single 4-bit bus:
- ________
- input_1 ----| |---- output_1
- input_2 ----| |---- output_2
- input_3 ----| |---- output_3
- input_4 ----| |---- output_4
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), the outputs takes on the value of the inputs, with output_1
- corresponding to input_1, output_2, corresponding to input_2, and so on.
- Otherwise, the outputs hold their current values.
+ """Construct a new 4-bit storage register.
+
+ Args:
+ data_bus: An object of type Bus4. The data input to the register.
+ clock: An object of type Wire or Clock. The clock input to the
+ register.
+ output_bus: An object of type Bus4. The output of the register. Takes
+ on the value of data_bus on the positive edges of clock.
+
+ Raises:
+ TypeError: If either data_bus or output_bus is not a bus of width 4.
"""
def __init__(self, input_bus, clock, output_bus):
- if len(input_bus.wires) != 4:
+ if len(input_bus) != 4:
raise TypeError(
"Expected bus of width 4, received bus of width {0}.".format(
- len(input_bus.wires)
+ len(input_bus)
)
)
- if len(output_bus.wires) != 4:
+ if len(output_bus) != 4:
raise TypeError(
"Expected bus of width 4, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -51,44 +44,37 @@ def __init__(self, input_bus, clock, output_bus):
not_3 = Wire()
not_4 = Wire()
- FLOP.DFlipFlop(input_bus.wires[0], clock, output_bus.wires[0], not_1)
- FLOP.DFlipFlop(input_bus.wires[1], clock, output_bus.wires[1], not_2)
- FLOP.DFlipFlop(input_bus.wires[2], clock, output_bus.wires[2], not_3)
- FLOP.DFlipFlop(input_bus.wires[3], clock, output_bus.wires[3], not_4)
+ FLOP.DFlipFlop(input_bus[0], clock, output_bus[0], not_1)
+ FLOP.DFlipFlop(input_bus[1], clock, output_bus[1], not_2)
+ FLOP.DFlipFlop(input_bus[2], clock, output_bus[2], not_3)
+ FLOP.DFlipFlop(input_bus[3], clock, output_bus[3], not_4)
class Register8:
- """
- This register has eight inputs in a single 8-bit bus, a clock input, and
- eight outputs in a single 8-bit bus:
- ________
- input_1 ----| |---- output_1
- input_2 ----| |---- output_2
- input_3 ----| |---- output_3
- input_4 ----| |---- output_4
- input_5 ----| |---- output_5
- input_6 ----| |---- output_6
- input_7 ----| |---- output_7
- input_8 ----| |---- output_8
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), the outputs takes on the value of the inputs, with output_1
- corresponding to input_1, output_2, corresponding to input_2, and so on.
- Otherwise, the outputs hold their current values.
+ """Construct a new 8-bit storage register.
+
+ Args:
+ data_bus: An object of type Bus8. The data input to the register.
+ clock: An object of type Wire or Clock. The clock input to the
+ register.
+ output_bus: An object of type Bus8. The output of the register. Takes
+ on the value of data_bus on the positive edges of clock.
+
+ Raises:
+ TypeError: If either data_bus or output_bus is not a bus of width 8.
"""
def __init__(self, input_bus, clock, output_bus):
- if len(input_bus.wires) != 8:
+ if len(input_bus) != 8:
raise TypeError(
"Expected bus of width 8, received bus of width {0}.".format(
- len(input_bus.wires)
+ len(input_bus)
)
)
- if len(output_bus.wires) != 8:
+ if len(output_bus) != 8:
raise TypeError(
"Expected bus of width 8, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -101,56 +87,41 @@ def __init__(self, input_bus, clock, output_bus):
not_7 = Wire()
not_8 = Wire()
- FLOP.DFlipFlop(input_bus.wires[0], clock, output_bus.wires[0], not_1)
- FLOP.DFlipFlop(input_bus.wires[1], clock, output_bus.wires[1], not_2)
- FLOP.DFlipFlop(input_bus.wires[2], clock, output_bus.wires[2], not_3)
- FLOP.DFlipFlop(input_bus.wires[3], clock, output_bus.wires[3], not_4)
- FLOP.DFlipFlop(input_bus.wires[4], clock, output_bus.wires[4], not_5)
- FLOP.DFlipFlop(input_bus.wires[5], clock, output_bus.wires[5], not_6)
- FLOP.DFlipFlop(input_bus.wires[6], clock, output_bus.wires[6], not_7)
- FLOP.DFlipFlop(input_bus.wires[7], clock, output_bus.wires[7], not_8)
+ FLOP.DFlipFlop(input_bus[0], clock, output_bus[0], not_1)
+ FLOP.DFlipFlop(input_bus[1], clock, output_bus[1], not_2)
+ FLOP.DFlipFlop(input_bus[2], clock, output_bus[2], not_3)
+ FLOP.DFlipFlop(input_bus[3], clock, output_bus[3], not_4)
+ FLOP.DFlipFlop(input_bus[4], clock, output_bus[4], not_5)
+ FLOP.DFlipFlop(input_bus[5], clock, output_bus[5], not_6)
+ FLOP.DFlipFlop(input_bus[6], clock, output_bus[6], not_7)
+ FLOP.DFlipFlop(input_bus[7], clock, output_bus[7], not_8)
class Register16:
- """
- This register has sixteen inputs in a single 16-bit bus, a clock input, and
- sixteen outputs in a single 16-bit bus:
- ________
- input_1 ----| |---- output_1
- input_2 ----| |---- output_2
- input_3 ----| |---- output_3
- input_4 ----| |---- output_4
- input_5 ----| |---- output_5
- input_6 ----| |---- output_6
- input_7 ----| |---- output_7
- input_8 ----| |---- output_8
- input_9 ----| |---- output_9
- input_10 ----| |---- output_10
- input_11 ----| |---- output_11
- input_12 ----| |---- output_12
- input_13 ----| |---- output_13
- input_14 ----| |---- output_14
- input_15 ----| |---- output_15
- input_16 ----| |---- output_16
- clock ----|________|
-
- On the positive edge of clock (i.e. on the clock transition from a 0 value
- to a 1 value), the outputs takes on the value of the inputs, with output_1
- corresponding to input_1, output_2, corresponding to input_2, and so on.
- Otherwise, the outputs hold their current values.
+ """Construct a new 16-bit storage register.
+
+ Args:
+ data_bus: An object of type Bus16. The data input to the register.
+ clock: An object of type Wire or Clock. The clock input to the
+ register.
+ output_bus: An object of type Bus16. The output of the register. Takes
+ on the value of data_bus on the positive edges of clock.
+
+ Raises:
+ TypeError: If either data_bus or output_bus is not a bus of width 16.
"""
def __init__(self, input_bus, clock, output_bus):
- if len(input_bus.wires) != 16:
+ if len(input_bus) != 16:
raise TypeError(
"Expected bus of width 16, received bus of width {0}.".format(
- len(input_bus.wires)
+ len(input_bus)
)
)
- if len(output_bus.wires) != 16:
+ if len(output_bus) != 16:
raise TypeError(
"Expected bus of width 16, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -171,21 +142,19 @@ def __init__(self, input_bus, clock, output_bus):
not_15 = Wire()
not_16 = Wire()
- output = output_bus.wires
-
- FLOP.DFlipFlop(input_bus.wires[0], clock, output[0], not_1)
- FLOP.DFlipFlop(input_bus.wires[1], clock, output[1], not_2)
- FLOP.DFlipFlop(input_bus.wires[2], clock, output[2], not_3)
- FLOP.DFlipFlop(input_bus.wires[3], clock, output[3], not_4)
- FLOP.DFlipFlop(input_bus.wires[4], clock, output[4], not_5)
- FLOP.DFlipFlop(input_bus.wires[5], clock, output[5], not_6)
- FLOP.DFlipFlop(input_bus.wires[6], clock, output[6], not_7)
- FLOP.DFlipFlop(input_bus.wires[7], clock, output[7], not_8)
- FLOP.DFlipFlop(input_bus.wires[8], clock, output[8], not_9)
- FLOP.DFlipFlop(input_bus.wires[9], clock, output[9], not_10)
- FLOP.DFlipFlop(input_bus.wires[10], clock, output[10], not_11)
- FLOP.DFlipFlop(input_bus.wires[11], clock, output[11], not_12)
- FLOP.DFlipFlop(input_bus.wires[12], clock, output[12], not_13)
- FLOP.DFlipFlop(input_bus.wires[13], clock, output[13], not_14)
- FLOP.DFlipFlop(input_bus.wires[14], clock, output[14], not_15)
- FLOP.DFlipFlop(input_bus.wires[15], clock, output[15], not_16)
+ FLOP.DFlipFlop(input_bus[0], clock, output_bus[0], not_1)
+ FLOP.DFlipFlop(input_bus[1], clock, output_bus[1], not_2)
+ FLOP.DFlipFlop(input_bus[2], clock, output_bus[2], not_3)
+ FLOP.DFlipFlop(input_bus[3], clock, output_bus[3], not_4)
+ FLOP.DFlipFlop(input_bus[4], clock, output_bus[4], not_5)
+ FLOP.DFlipFlop(input_bus[5], clock, output_bus[5], not_6)
+ FLOP.DFlipFlop(input_bus[6], clock, output_bus[6], not_7)
+ FLOP.DFlipFlop(input_bus[7], clock, output_bus[7], not_8)
+ FLOP.DFlipFlop(input_bus[8], clock, output_bus[8], not_9)
+ FLOP.DFlipFlop(input_bus[9], clock, output_bus[9], not_10)
+ FLOP.DFlipFlop(input_bus[10], clock, output_bus[10], not_11)
+ FLOP.DFlipFlop(input_bus[11], clock, output_bus[11], not_12)
+ FLOP.DFlipFlop(input_bus[12], clock, output_bus[12], not_13)
+ FLOP.DFlipFlop(input_bus[13], clock, output_bus[13], not_14)
+ FLOP.DFlipFlop(input_bus[14], clock, output_bus[14], not_15)
+ FLOP.DFlipFlop(input_bus[15], clock, output_bus[15], not_16)
diff --git a/bitwise/storage/SHIFT.py b/bitwise/storage/SHIFT.py
index 0720e05..17dc9b2 100644
--- a/bitwise/storage/SHIFT.py
+++ b/bitwise/storage/SHIFT.py
@@ -17,8 +17,28 @@
class ShiftRegister4:
- """
+ """Construct a new 4-bit shift register.
+
+ Args:
+ enable: An object of type Wire. Enables the shift register.
+ clear_n: An object of type Wire. Clears output_bus and output_serial to
+ 0 if its value is 1.
+ shift_load: An object of type Wire. The mode select. A value of 0
+ indicates a parallel load operation, where output_bus takes on the
+ value of data_bus. A value of 1 indicates a shift-right operation,
+ where output_bus[3] takes on the value of output_bus[2],
+ output_bus[2] takes on the value of output_bus[1], and so on;
+ output_bus[0] takes on the value of data_serial.
+ data_bus: An object of type Bus4. The parallel data input.
+ data_serial. An object of type Wire. The serial data input.
+ clock. An object of type Wire or Clock. The clock input to the shift
+ register.
+ output_bus. An object of type Bus4. The parallel data output.
+ output_serial. An object of type Wire. The serial data output.
+ Identical to output_bus[3].
+ Raises:
+ TypeError: If either data_bus or output_bus is not a bus of width 4.
"""
def __init__(
self,
@@ -31,17 +51,17 @@ def __init__(
output_bus,
output_s
):
- if len(data_bus.wires) != 4:
+ if len(data_bus) != 4:
raise TypeError(
"Expected bus of width 4, received bus of width {0}.".format(
- len(data_bus.wires)
+ len(data_bus)
)
)
- if len(output_bus.wires) != 4:
+ if len(output_bus) != 4:
raise TypeError(
"Expected bus of width 4, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -126,8 +146,28 @@ def __init__(
class ShiftRegister8:
- """
+ """Construct a new 8-bit shift register.
+ Args:
+ enable: An object of type Wire. Enables the shift register.
+ clear_n: An object of type Wire. Clears output_bus and output_serial to
+ 0 if its value is 1.
+ shift_load: An object of type Wire. The mode select. A value of 0
+ indicates a parallel load operation, where output_bus takes on the
+ value of data_bus. A value of 1 indicates a shift-right operation,
+ where output_bus[7] takes on the value of output_bus[6],
+ output_bus[6] takes on the value of output_bus[5], and so on;
+ output_bus[0] takes on the value of data_serial.
+ data_bus: An object of type Bus8. The parallel data input.
+ data_serial. An object of type Wire. The serial data input.
+ clock. An object of type Wire or Clock. The clock input to the shift
+ register.
+ output_bus. An object of type Bus8. The parallel data output.
+ output_serial. An object of type Wire. The serial data output.
+ Identical to output_bus[7].
+
+ Raises:
+ TypeError: If either data_bus or output_bus is not a bus of width 8.
"""
def __init__(
self,
@@ -140,17 +180,17 @@ def __init__(
output_bus,
output_s
):
- if len(data_bus.wires) != 8:
+ if len(data_bus) != 8:
raise TypeError(
"Expected bus of width 8, received bus of width {0}.".format(
- len(data_bus.wires)
+ len(data_bus)
)
)
- if len(output_bus.wires) != 8:
+ if len(output_bus) != 8:
raise TypeError(
"Expected bus of width 8, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -302,8 +342,28 @@ def __init__(
class ShiftRegister16:
- """
+ """Construct a new 16-bit shift register.
+
+ Args:
+ enable: An object of type Wire. Enables the shift register.
+ clear_n: An object of type Wire. Clears output_bus and output_serial to
+ 0 if its value is 1.
+ shift_load: An object of type Wire. The mode select. A value of 0
+ indicates a parallel load operation, where output_bus takes on the
+ value of data_bus. A value of 1 indicates a shift-right operation,
+ where output_bus[15] takes on the value of output_bus[14],
+ output_bus[14] takes on the value of output_bus[13], and so on;
+ output_bus[0] takes on the value of data_serial.
+ data_bus: An object of type Bus16. The parallel data input.
+ data_serial. An object of type Wire. The serial data input.
+ clock. An object of type Wire or Clock. The clock input to the shift
+ register.
+ output_bus. An object of type Bus16. The parallel data output.
+ output_serial. An object of type Wire. The serial data output.
+ Identical to output_bus[15].
+ Raises:
+ TypeError: If either data_bus or output_bus is not a bus of width 16.
"""
def __init__(
self,
@@ -316,17 +376,17 @@ def __init__(
output_bus,
output_s
):
- if len(data_bus.wires) != 16:
+ if len(data_bus) != 16:
raise TypeError(
"Expected bus of width 16, received bus of width {0}.".format(
- len(data_bus.wires)
+ len(data_bus)
)
)
- if len(output_bus.wires) != 16:
+ if len(output_bus) != 16:
raise TypeError(
"Expected bus of width 16, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
diff --git a/bitwise/signal/SIPO.py b/bitwise/storage/SIPO.py
similarity index 57%
rename from bitwise/signal/SIPO.py
rename to bitwise/storage/SIPO.py
index ff9d0e5..b0ba305 100644
--- a/bitwise/signal/SIPO.py
+++ b/bitwise/storage/SIPO.py
@@ -15,14 +15,26 @@
class SerialToParallelConverter1To4:
- """
-
+ """Construct a new serial-to-4-bit-parallel converter.
+
+ Args:
+ enable: An object of type Wire. Enables the converter.
+ clear_n: An object of type Wire. Clears all 4 internal registers to 0
+ if its value is 0.
+ data: An object of type Wire. The serial data input.
+ clock: An object of type Wire or Clock. The clock input.
+ output_bus: An object of type Bus4. The parallel output of the
+ converter. output[0] corresponds to the most recent serial data
+ input.
+
+ Raises:
+ TypeError: If output_bus is not a bus of width 4.
"""
def __init__(self, enable, reset_n, data, clock, output_bus):
- if len(output_bus.wires) != 4:
+ if len(output_bus) != 4:
raise TypeError(
"Expected bus of width 4, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -51,14 +63,26 @@ def __init__(self, enable, reset_n, data, clock, output_bus):
class SerialToParallelConverter1To8:
- """
-
+ """Construct a new serial-to-8-bit-parallel converter.
+
+ Args:
+ enable: An object of type Wire. Enables the converter.
+ clear_n: An object of type Wire. Clears all 8 internal registers to 0
+ if its value is 0.
+ data: An object of type Wire. The serial data input.
+ clock: An object of type Wire or Clock. The clock input.
+ output_bus: An object of type Bus8. The parallel output of the
+ converter. output[0] corresponds to the most recent serial data
+ input.
+
+ Raises:
+ TypeError: If output_bus is not a bus of width 8.
"""
def __init__(self, enable, reset_n, data, clock, output_bus):
- if len(output_bus.wires) != 8:
+ if len(output_bus) != 8:
raise TypeError(
"Expected bus of width 8, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
@@ -91,14 +115,26 @@ def __init__(self, enable, reset_n, data, clock, output_bus):
class SerialToParallelConverter1To16:
- """
-
+ """Construct a new serial-to-16-bit-parallel converter.
+
+ Args:
+ enable: An object of type Wire. Enables the converter.
+ clear_n: An object of type Wire. Clears all 16 internal registers to 0
+ if its value is 0.
+ data: An object of type Wire. The serial data input.
+ clock: An object of type Wire or Clock. The clock input.
+ output_bus: An object of type Bus16. The parallel output of the
+ converter. output[0] corresponds to the most recent serial data
+ input.
+
+ Raises:
+ TypeError: If output_bus is not a bus of width 16.
"""
def __init__(self, enable, reset_n, data, clock, output_bus):
- if len(output_bus.wires) != 16:
+ if len(output_bus) != 16:
raise TypeError(
"Expected bus of width 16, received bus of width {0}.".format(
- len(output_bus.wires)
+ len(output_bus)
)
)
diff --git a/bitwise/storage/__init__.py b/bitwise/storage/__init__.py
index dec80fd..79a024e 100644
--- a/bitwise/storage/__init__.py
+++ b/bitwise/storage/__init__.py
@@ -1,3 +1,5 @@
from .FLOP import *
+from .PISO import *
from .REG import *
from .SHIFT import *
+from .SIPO import *
diff --git a/docs/_build/doctrees/api.doctree b/docs/_build/doctrees/api.doctree
index b8330a2..2f76a4e 100644
Binary files a/docs/_build/doctrees/api.doctree and b/docs/_build/doctrees/api.doctree differ
diff --git a/docs/_build/doctrees/changelog.doctree b/docs/_build/doctrees/changelog.doctree
new file mode 100644
index 0000000..839b536
Binary files /dev/null and b/docs/_build/doctrees/changelog.doctree differ
diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle
index 580ba48..679f51b 100644
Binary files a/docs/_build/doctrees/environment.pickle and b/docs/_build/doctrees/environment.pickle differ
diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree
index 38d0d84..24ddbb2 100644
Binary files a/docs/_build/doctrees/index.doctree and b/docs/_build/doctrees/index.doctree differ
diff --git a/docs/_build/doctrees/signal.doctree b/docs/_build/doctrees/signal.doctree
index f1ae094..e6acddd 100644
Binary files a/docs/_build/doctrees/signal.doctree and b/docs/_build/doctrees/signal.doctree differ
diff --git a/docs/_build/doctrees/storage.doctree b/docs/_build/doctrees/storage.doctree
index 8690209..17424c7 100644
Binary files a/docs/_build/doctrees/storage.doctree and b/docs/_build/doctrees/storage.doctree differ
diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo
index 91bce97..715c16b 100644
--- a/docs/_build/html/.buildinfo
+++ b/docs/_build/html/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 40b3bb7ac50d6bdd9837b581875ce877
+config: a2f2ebb05638847ca43a223a4bebb03f
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/_build/html/_images/DFlipFlop.svg b/docs/_build/html/_images/DFlipFlop.svg
new file mode 100644
index 0000000..05bd7cc
--- /dev/null
+++ b/docs/_build/html/_images/DFlipFlop.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/DFlipFlopPresetClear.svg b/docs/_build/html/_images/DFlipFlopPresetClear.svg
new file mode 100644
index 0000000..ffa23ae
--- /dev/null
+++ b/docs/_build/html/_images/DFlipFlopPresetClear.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/GatedDLatch.svg b/docs/_build/html/_images/GatedDLatch.svg
new file mode 100644
index 0000000..db90007
--- /dev/null
+++ b/docs/_build/html/_images/GatedDLatch.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/GatedSRLatch.svg b/docs/_build/html/_images/GatedSRLatch.svg
new file mode 100644
index 0000000..41e48e4
--- /dev/null
+++ b/docs/_build/html/_images/GatedSRLatch.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/JKFlipFlop.svg b/docs/_build/html/_images/JKFlipFlop.svg
new file mode 100644
index 0000000..37bef4c
--- /dev/null
+++ b/docs/_build/html/_images/JKFlipFlop.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/JKFlipFlopPresetClear.svg b/docs/_build/html/_images/JKFlipFlopPresetClear.svg
new file mode 100644
index 0000000..455776a
--- /dev/null
+++ b/docs/_build/html/_images/JKFlipFlopPresetClear.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/ParallelToSerialConverter16To1.svg b/docs/_build/html/_images/ParallelToSerialConverter16To1.svg
new file mode 100644
index 0000000..5211248
--- /dev/null
+++ b/docs/_build/html/_images/ParallelToSerialConverter16To1.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/ParallelToSerialConverter4To1.svg b/docs/_build/html/_images/ParallelToSerialConverter4To1.svg
new file mode 100644
index 0000000..15639e8
--- /dev/null
+++ b/docs/_build/html/_images/ParallelToSerialConverter4To1.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/ParallelToSerialConverter8To1.svg b/docs/_build/html/_images/ParallelToSerialConverter8To1.svg
new file mode 100644
index 0000000..ed18105
--- /dev/null
+++ b/docs/_build/html/_images/ParallelToSerialConverter8To1.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/Register16.svg b/docs/_build/html/_images/Register16.svg
new file mode 100644
index 0000000..932632a
--- /dev/null
+++ b/docs/_build/html/_images/Register16.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/Register4.svg b/docs/_build/html/_images/Register4.svg
new file mode 100644
index 0000000..4386d80
--- /dev/null
+++ b/docs/_build/html/_images/Register4.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/Register8.svg b/docs/_build/html/_images/Register8.svg
new file mode 100644
index 0000000..23757db
--- /dev/null
+++ b/docs/_build/html/_images/Register8.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/SRLatch.svg b/docs/_build/html/_images/SRLatch.svg
new file mode 100644
index 0000000..6221399
--- /dev/null
+++ b/docs/_build/html/_images/SRLatch.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/SerialToParallelConverter1To16.svg b/docs/_build/html/_images/SerialToParallelConverter1To16.svg
new file mode 100644
index 0000000..0576e1e
--- /dev/null
+++ b/docs/_build/html/_images/SerialToParallelConverter1To16.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/SerialToParallelConverter1To4.svg b/docs/_build/html/_images/SerialToParallelConverter1To4.svg
new file mode 100644
index 0000000..542fdc9
--- /dev/null
+++ b/docs/_build/html/_images/SerialToParallelConverter1To4.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/SerialToParallelConverter1To8.svg b/docs/_build/html/_images/SerialToParallelConverter1To8.svg
new file mode 100644
index 0000000..ea70b6a
--- /dev/null
+++ b/docs/_build/html/_images/SerialToParallelConverter1To8.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/ShiftRegister16.svg b/docs/_build/html/_images/ShiftRegister16.svg
new file mode 100644
index 0000000..fa9f6bb
--- /dev/null
+++ b/docs/_build/html/_images/ShiftRegister16.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/ShiftRegister4.svg b/docs/_build/html/_images/ShiftRegister4.svg
new file mode 100644
index 0000000..a22837a
--- /dev/null
+++ b/docs/_build/html/_images/ShiftRegister4.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/ShiftRegister8.svg b/docs/_build/html/_images/ShiftRegister8.svg
new file mode 100644
index 0000000..13ae06e
--- /dev/null
+++ b/docs/_build/html/_images/ShiftRegister8.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/TFlipFlop.svg b/docs/_build/html/_images/TFlipFlop.svg
new file mode 100644
index 0000000..d499c37
--- /dev/null
+++ b/docs/_build/html/_images/TFlipFlop.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_images/TFlipFlopPresetClear.svg b/docs/_build/html/_images/TFlipFlopPresetClear.svg
new file mode 100644
index 0000000..8b56ef5
--- /dev/null
+++ b/docs/_build/html/_images/TFlipFlopPresetClear.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/_build/html/_sources/api.rst.txt b/docs/_build/html/_sources/api.rst.txt
index 16bf3bc..024fc36 100644
--- a/docs/_build/html/_sources/api.rst.txt
+++ b/docs/_build/html/_sources/api.rst.txt
@@ -69,6 +69,27 @@ API Documentation
:doc:`storage`
==============
+* :ref:`DFlipFlop`
+* :ref:`DFlipFlopPresetClear`
+* :ref:`GatedDLatch`
+* :ref:`GatedSRLatch`
+* :ref:`JKFlipFlop`
+* :ref:`JKFlipFlopPresetClear`
+* :ref:`ParallelToSerialConverter4To1`
+* :ref:`ParallelToSerialConverter8To1`
+* :ref:`ParallelToSerialConverter16To1`
+* :ref:`SerialToParallelConverter1To4`
+* :ref:`SerialToParallelConverter1To8`
+* :ref:`SerialToParallelConverter1To16`
+* :ref:`Register4`
+* :ref:`Register8`
+* :ref:`Register16`
+* :ref:`ShiftRegister4`
+* :ref:`ShiftRegister8`
+* :ref:`ShiftRegister16`
+* :ref:`SRLatch`
+* :ref:`TFlipFlop`
+* :ref:`TFlipFlopPresetClear`
:doc:`wire`
===========
diff --git a/docs/_build/html/_sources/changelog.rst.txt b/docs/_build/html/_sources/changelog.rst.txt
new file mode 100644
index 0000000..0281a3a
--- /dev/null
+++ b/docs/_build/html/_sources/changelog.rst.txt
@@ -0,0 +1,49 @@
+:tocdepth: 2
+
+=========
+Changelog
+=========
+
+
+Unreleased
+==========
+
+Added
+-----
+* Shift register classes to storage subpackage
+ * ``ShiftRegister4``
+ * ``ShiftRegister8``
+ * ``ShiftRegister16``
+
+* Parallel-to-serial converter classes to signal subpackage
+ * ``ParallelToSerialConverter4To1``
+ * ``ParallelToSerialConverter8To1``
+ * ``ParallelToSerialConverter16To1``
+
+* Serial-to-parallel converter classes to signal subpackage
+ * ``SerialToParallelConverter1To4``
+ * ``SerialToParallelConverter1To8``
+ * ``SerialToParallelConverter1To16``
+
+* Buffer class to gate subpackage
+* ``__getitem__()`` and ``__len__()`` methods to ``Bus4``, ``Bus8``, ``Bus16``, and ``BusSevenSegmentDisplay`` classes
+
+Changed
+-------
+* Rewrote docstrings for all classes
+* Misc improvements
+
+
+v0.1.1 - 2018-10-17
+===================
+
+Added
+-----
+* Storage register classes to storage subpackage
+ * ``Register4``
+ * ``Register8``
+ * ``Register16``
+
+Changed
+-------
+* Misc improvements
diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt
index c377826..4d8ccee 100644
--- a/docs/_build/html/_sources/index.rst.txt
+++ b/docs/_build/html/_sources/index.rst.txt
@@ -1,3 +1,17 @@
+.. toctree::
+ :hidden:
+
+ api
+ arithmetic
+ changelog
+ gate
+ install
+ logic
+ signal
+ storage
+ wire
+
+
=============
About Bitwise
=============
@@ -40,7 +54,7 @@ Interacting with it in a Python session::
In [2]: b.value = 0
- In [3]: sum.value
+ In [3]: sum_.value
Out[3]: 0
In [4]: carry_out.value
@@ -48,7 +62,7 @@ Interacting with it in a Python session::
In [5]: a.value = 1
- In [6]: sum.value
+ In [6]: sum_.value
Out[6]: 1
In [7]: carry_out.value
@@ -56,7 +70,7 @@ Interacting with it in a Python session::
In [8]: b.value = 1
- In [9]: sum.value
+ In [9]: sum_.value
Out[9]: 0
In [10]: carry_out.value
diff --git a/docs/_build/html/_sources/signal.rst.txt b/docs/_build/html/_sources/signal.rst.txt
index 7664be0..5184dde 100644
--- a/docs/_build/html/_sources/signal.rst.txt
+++ b/docs/_build/html/_sources/signal.rst.txt
@@ -578,7 +578,7 @@ Args:
* ``select``: An object of type ``Wire``. The select input.
* ``input_1``: An object of type ``Wire``. The first data input to the multiplexer.
* ``input_2``: An object of type ``Wire``. The second data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_1`` for a 1 select and ``input_2`` for a 0 select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_1`` for a 1 select and ``input_2`` for a 0 select.
.. _Multiplexer4To1:
@@ -617,7 +617,7 @@ Args:
* ``select_1``: An object of type ``Wire``. The most significant bit of the select input.
* ``select_2``: An object of type ``Wire``. The least significant bit of the select input.
* ``input_bus``: An object of type ``Bus4``. The data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_bus[0]`` for a (1, 1) select and ``input_bus[3]`` for a (0, 0) select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_bus[0]`` for a (1, 1) select and ``input_bus[3]`` for a (0, 0) select.
Raises:
~~~~~~~
@@ -662,7 +662,7 @@ Args:
* ``select_2``: An object of type ``Wire``.
* ``select_3``: An object of type ``Wire``. The least significant bit of the select input.
* ``input_bus``: An object of type ``Bus8``. The data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_bus[0]`` for a (1, 1, 1) select and ``input_bus[7]`` for a (0, 0, 0) select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_bus[0]`` for a (1, 1, 1) select and ``input_bus[7]`` for a (0, 0, 0) select.
Raises:
~~~~~~~
@@ -703,7 +703,7 @@ Args:
* ``enable``: An object of type ``Wire``. Enables the multiplexer.
* ``select_bus``: An object of type ``Bus4``. ``select_bus[0]`` and ``select_bus[3]`` are the most and least significant bit, respectively.
* ``input_bus``: An object of type ``Bus16``. The data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_bus[0]`` for a (1, 1, 1, 1) select and ``input_bus[15]`` for a (0, 0, 0, 0) select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_bus[0]`` for a (1, 1, 1, 1) select and ``input_bus[15]`` for a (0, 0, 0, 0) select.
Raises:
~~~~~~~
diff --git a/docs/_build/html/_sources/storage.rst.txt b/docs/_build/html/_sources/storage.rst.txt
index e318e4e..cdcb1ff 100644
--- a/docs/_build/html/_sources/storage.rst.txt
+++ b/docs/_build/html/_sources/storage.rst.txt
@@ -3,3 +3,882 @@
=======
Storage
=======
+
+
+.. _DFlipFlop:
+
+DFlipFlop
+=========
+
+Class ``bw.storage.DFlipFlop``
+------------------------------
+
+.. image:: images/schematics/storage/DFlipFlop.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `D flip-flop `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered D flip-flop.
+
+Args:
+~~~~~
+* ``data``: An object of type ``Wire``. The data input to the flip-flop.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Takes on the value of ``data`` on the positive edges of ``clock``.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _DFlipFlopPresetClear:
+
+DFlipFlopPresetClear
+====================
+
+Class ``bw.storage.DFlipFlopPresetClear``
+-----------------------------------------
+
+.. image:: images/schematics/storage/DFlipFlopPresetClear.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `D flip-flop `_ with asynchronous active low preset and clear.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data,
+ preset_n,
+ clear_n,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered D flip-flop with preset/clear capabilities.
+
+Args:
+~~~~~
+* ``data``: An object of type ``Wire``. The data input to the flip-flop.
+* ``preset_n``: An object of type ``Wire``. Presets ``output`` to 1 and ``output_not`` to 0 if its value is 0.
+* ``clear_n``: An object of type ``Wire``. Clears ``output`` to 0 and ``output_not`` to 1 if its value is 0.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Takes on the value of ``data`` on the positive edges of ``clock``.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _GatedDLatch:
+
+GatedDLatch
+===========
+
+Class ``bw.storage.GatedDLatch``
+--------------------------------
+
+.. image:: images/schematics/storage/GatedDLatch.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+`Gated D latch `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new gated D latch.
+
+Args:
+~~~~~
+* ``data``: An object of type ``Wire``. The data input to the latch.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the latch.
+* ``output``: An object of type ``Wire``. The output of the latch. Takes on the value of ``data`` if the value of ``clock`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _GatedSRLatch:
+
+GatedSRLatch
+============
+
+Class ``bw.storage.GatedSRLatch``
+---------------------------------
+
+.. image:: images/schematics/storage/GatedSRLatch.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+`Gated SR latch `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ set_,
+ reset,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new gated SR latch.
+
+Args:
+~~~~~
+* ``set_``: An object of type ``Wire``. The set input to the latch.
+* ``reset``: An object of type ``Wire``. The reset input to the latch.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the latch.
+* ``output``: An object of type ``Wire``. The output of the latch. When the value of ``clock`` is 1, takes on the value of 1 if the value of ``set`` is 1 and the value of 0 if the value of ``reset`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _JKFlipFlop:
+
+JKFlipFlop
+==========
+
+Class ``bw.storage.JKFlipFlop``
+-------------------------------
+
+.. image:: images/schematics/storage/JKFlipFlop.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `JK flip-flop `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ J,
+ K,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered JK flip-flop.
+
+Args:
+~~~~~
+* ``J``: An object of type ``Wire``. The J input to the flip-flop.
+* ``K``: An object of type ``Wire``. The K input to the flip-flop.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. On the positive edges of ``clock``, takes on the value of 1 if the value of ``J`` is 1, takes on the value of 0 if the value of ``K`` is 1, and toggles its value if both ``J`` and ``K`` have value 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _JKFlipFlopPresetClear:
+
+JKFlipFlopPresetClear
+=====================
+
+Class ``bw.storage.JKFlipFlopPresetClear``
+------------------------------------------
+
+.. image:: images/schematics/storage/JKFlipFlopPresetClear.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `JK flip-flop `_ with asynchronous active low preset and clear.
+
+__init__
+--------
+
+::
+
+ __init__(
+ J,
+ K,
+ preset_n,
+ clear_n,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered JK flip-flop with preset/clear capabilities.
+
+Args:
+~~~~~
+* ``J``: An object of type ``Wire``. The J input to the flip-flop.
+* ``K``: An object of type ``Wire``. The K input to the flip-flop.
+* ``preset_n``: An object of type ``Wire``. Presets ``output`` to 1 and ``output_not`` to 0 if its value is 0.
+* ``clear_n``: An object of type ``Wire``. Clears ``output`` to 0 and ``output_not`` to 1 if its value is 0.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. On the positive edges of ``clock``, takes on the value of 1 if the value of ``J`` is 1, takes on the value of 0 if the value of ``K`` is 1, and toggles its value if both ``J`` and ``K`` have value 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _ParallelToSerialConverter4To1:
+
+ParallelToSerialConverter4To1
+=============================
+
+Class ``bw.signal.ParallelToSerialConverter4To1``
+-------------------------------------------------
+
+.. image:: images/schematics/storage/ParallelToSerialConverter4To1.svg
+ :width: 600px
+
+Defined in `bitwise/storage/PISO.py `_.
+
+`4-bit-parallel-to-serial converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ load_n,
+ data_bus,
+ clock,
+ output
+ )
+
+Construct a new 4-bit-parallel-to-serial converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 4 internal registers to 0 if its value is 0.
+* ``load_n``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where the values of ``data_bus`` are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+* ``data_bus``: An object of type ``Bus4``. The parallel data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output``: An object of type ``Wire``. The serial output of the converter. ``data_bus[3]`` is outputted first, and ``data_bus[0]`` is outputted last.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``data_bus`` is not a bus of width 4.
+
+
+.. _ParallelToSerialConverter8To1:
+
+ParallelToSerialConverter8To1
+=============================
+
+Class ``bw.signal.ParallelToSerialConverter8To1``
+-------------------------------------------------
+
+.. image:: images/schematics/storage/ParallelToSerialConverter8To1.svg
+ :width: 600px
+
+Defined in `bitwise/storage/PISO.py `_.
+
+`8-bit-parallel-to-serial converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ load_n,
+ data_bus,
+ clock,
+ output
+ )
+
+Construct a new 8-bit-parallel-to-serial converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 8 internal registers to 0 if its value is 0.
+* ``load_n``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where the values of ``data_bus`` are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+* ``data_bus``: An object of type ``Bus8``. The parallel data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output``: An object of type ``Wire``. The serial output of the converter. ``data_bus[7]`` is outputted first, and ``data_bus[0]`` is outputted last.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``data_bus`` is not a bus of width 8.
+
+
+.. _ParallelToSerialConverter16To1:
+
+ParallelToSerialConverter16To1
+==============================
+
+Class ``bw.signal.ParallelToSerialConverter16To1``
+--------------------------------------------------
+
+.. image:: images/schematics/storage/ParallelToSerialConverter16To1.svg
+ :width: 600px
+
+Defined in `bitwise/storage/PISO.py `_.
+
+`16-bit-parallel-to-serial converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ load_n,
+ data_bus,
+ clock,
+ output
+ )
+
+Construct a new 16-bit-parallel-to-serial converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 16 internal registers to 0 if its value is 0.
+* ``load_n``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where the values of ``data_bus`` are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+* ``data_bus``: An object of type ``Bus16``. The parallel data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output``: An object of type ``Wire``. The serial output of the converter. ``data_bus[15]`` is outputted first, and ``data_bus[0]`` is outputted last.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``data_bus`` is not a bus of width 16.
+
+
+.. _Register4:
+
+Register4
+=========
+
+Class ``bw.storage.Register4``
+------------------------------
+
+.. image:: images/schematics/storage/Register4.svg
+ :width: 800px
+
+Defined in `bitwise/storage/REG.py `_.
+
+`4-bit storage register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data_bus,
+ clock,
+ output_bus
+ )
+
+Construct a new 4-bit storage register.
+
+Args:
+~~~~~
+* ``data_bus``: An object of type ``Bus4``. The data input to the register.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the register.
+* ``output_bus``: An object of type ``Bus4``. The output of the register. Takes on the value of ``data_bus`` on the positive edges of ``clock``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 4.
+
+
+.. _Register8:
+
+Register8
+=========
+
+Class ``bw.storage.Register8``
+------------------------------
+
+.. image:: images/schematics/storage/Register8.svg
+ :width: 800px
+
+Defined in `bitwise/storage/REG.py `_.
+
+`8-bit storage register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data_bus,
+ clock,
+ output_bus
+ )
+
+Construct a new 8-bit storage register.
+
+Args:
+~~~~~
+* ``data_bus``: An object of type ``Bus8``. The data input to the register.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the register.
+* ``output_bus``: An object of type ``Bus8``. The output of the register. Takes on the value of ``data_bus`` on the positive edges of ``clock``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 8.
+
+
+.. _Register16:
+
+Register16
+==========
+
+Class ``bw.storage.Register16``
+-------------------------------
+
+.. image:: images/schematics/storage/Register16.svg
+ :width: 800px
+
+Defined in `bitwise/storage/REG.py `_.
+
+`16-bit storage register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data_bus,
+ clock,
+ output_bus
+ )
+
+Construct a new 16-bit storage register.
+
+Args:
+~~~~~
+* ``data_bus``: An object of type ``Bus16``. The data input to the register.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the register.
+* ``output_bus``: An object of type ``Bus16``. The output of the register. Takes on the value of ``data_bus`` on the positive edges of ``clock``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 16.
+
+
+.. _SerialToParallelConverter1To4:
+
+SerialToParallelConverter1To4
+=============================
+
+Class ``bw.storage.SerialToParallelConverter1To4``
+--------------------------------------------------
+
+.. image:: images/schematics/storage/SerialToParallelConverter1To4.svg
+ :width: 600px
+
+Defined in `bitwise/storage/SIPO.py `_.
+
+`Serial-to-4-bit-parallel converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ data,
+ clock,
+ output_bus
+ )
+
+Construct a new serial-to-4-bit-parallel converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 4 internal registers to 0 if its value is 0.
+* ``data``: An object of type ``Wire``. The serial data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output_bus``: An object of type ``Bus4``. The parallel output of the converter. ``output[0]`` corresponds to the most recent serial data input.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``output_bus`` is not a bus of width 4.
+
+
+.. _SerialToParallelConverter1To8:
+
+SerialToParallelConverter1To8
+=============================
+
+Class ``bw.storage.SerialToParallelConverter1To8``
+--------------------------------------------------
+
+.. image:: images/schematics/storage/SerialToParallelConverter1To8.svg
+ :width: 600px
+
+Defined in `bitwise/storage/SIPO.py `_.
+
+`Serial-to-8-bit-parallel converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ data,
+ clock,
+ output_bus
+ )
+
+Construct a new serial-to-8-bit-parallel converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 8 internal registers to 0 if its value is 0.
+* ``data``: An object of type ``Wire``. The serial data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output_bus``: An object of type ``Bus8``. The parallel output of the converter. ``output[0]`` corresponds to the most recent serial data input.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``output_bus`` is not a bus of width 8.
+
+
+.. _SerialToParallelConverter1To16:
+
+SerialToParallelConverter1To16
+==============================
+
+Class ``bw.storage.SerialToParallelConverter1To16``
+---------------------------------------------------
+
+.. image:: images/schematics/storage/SerialToParallelConverter1To16.svg
+ :width: 600px
+
+Defined in `bitwise/storage/SIPO.py `_.
+
+`Serial-to-16-bit-parallel converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ data,
+ clock,
+ output_bus
+ )
+
+Construct a new serial-to-16-bit-parallel converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 16 internal registers to 0 if its value is 0.
+* ``data``: An object of type ``Wire``. The serial data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output_bus``: An object of type ``Bus16``. The parallel output of the converter. ``output[0]`` corresponds to the most recent serial data input.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``output_bus`` is not a bus of width 16.
+
+
+.. _ShiftRegister4:
+
+ShiftRegister4
+==============
+
+Class ``bw.storage.ShiftRegister4``
+-----------------------------------
+
+.. image:: images/schematics/storage/ShiftRegister4.svg
+ :width: 800px
+
+Defined in `bitwise/storage/SHIFT.py `_.
+
+`4-bit shift register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ shift_load,
+ data_bus,
+ data_serial,
+ clock,
+ output_bus,
+ output_serial
+ )
+
+Construct a new 4-bit shift register.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the shift register.
+* ``clear_n``: An object of type ``Wire``. Clears ``output_bus`` and ``output_serial`` to 0 if its value is 1.
+* ``shift_load``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where ``output_bus`` takes on the value of ``data_bus``. A value of 1 indicates a shift-right operation, where ``output_bus[3]`` takes on the value of ``output_bus[2]``, ``output_bus[2]`` takes on the value of ``output_bus[1]``, and so on; ``output_bus[0]`` takes on the value of ``data_serial``.
+* ``data_bus``: An object of type ``Bus4``. The parallel data input.
+* ``data_serial``. An object of type ``Wire``. The serial data input.
+* ``clock``. An object of type ``Wire`` or ``Clock``. The clock input to the shift register.
+* ``output_bus``. An object of type ``Bus4``. The parallel data output.
+* ``output_serial``. An object of type ``Wire``. The serial data output. Identical to ``output_bus[3]``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 4.
+
+
+.. _ShiftRegister8:
+
+ShiftRegister8
+==============
+
+Class ``bw.storage.ShiftRegister8``
+-----------------------------------
+
+.. image:: images/schematics/storage/ShiftRegister8.svg
+ :width: 800px
+
+Defined in `bitwise/storage/SHIFT.py `_.
+
+`8-bit shift register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ shift_load,
+ data_bus,
+ data_serial,
+ clock,
+ output_bus,
+ output_serial
+ )
+
+Construct a new 8-bit shift register.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the shift register.
+* ``clear_n``: An object of type ``Wire``. Clears ``output_bus`` and ``output_serial`` to 0 if its value is 1.
+* ``shift_load``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where ``output_bus`` takes on the value of ``data_bus``. A value of 1 indicates a shift-right operation, where ``output_bus[7]`` takes on the value of ``output_bus[6]``, ``output_bus[6]`` takes on the value of ``output_bus[5]``, and so on; ``output_bus[0]`` takes on the value of ``data_serial``.
+* ``data_bus``: An object of type ``Bus8``. The parallel data input.
+* ``data_serial``. An object of type ``Wire``. The serial data input.
+* ``clock``. An object of type ``Wire`` or ``Clock``. The clock input to the shift register.
+* ``output_bus``. An object of type ``Bus8``. The parallel data output.
+* ``output_serial``. An object of type ``Wire``. The serial data output. Identical to ``output_bus[7]``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 8.
+
+
+.. _ShiftRegister16:
+
+ShiftRegister16
+===============
+
+Class ``bw.storage.ShiftRegister16``
+------------------------------------
+
+.. image:: images/schematics/storage/ShiftRegister16.svg
+ :width: 800px
+
+Defined in `bitwise/storage/SHIFT.py `_.
+
+`16-bit shift register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ shift_load,
+ data_bus,
+ data_serial,
+ clock,
+ output_bus,
+ output_serial
+ )
+
+Construct a new 16-bit shift register.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the shift register.
+* ``clear_n``: An object of type ``Wire``. Clears ``output_bus`` and ``output_serial`` to 0 if its value is 1.
+* ``shift_load``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where ``output_bus`` takes on the value of ``data_bus``. A value of 1 indicates a shift-right operation, where ``output_bus[15]`` takes on the value of ``output_bus[14]``, ``output_bus[14]`` takes on the value of ``output_bus[13]``, and so on; ``output_bus[0]`` takes on the value of ``data_serial``.
+* ``data_bus``: An object of type ``Bus16``. The parallel data input.
+* ``data_serial``. An object of type ``Wire``. The serial data input.
+* ``clock``. An object of type ``Wire`` or ``Clock``. The clock input to the shift register.
+* ``output_bus``. An object of type ``Bus16``. The parallel data output.
+* ``output_serial``. An object of type ``Wire``. The serial data output. Identical to ``output_bus[15]``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 16.
+
+
+.. _SRLatch:
+
+SRLatch
+=======
+
+Class ``bw.storage.SRLatch``
+----------------------------
+
+.. image:: images/schematics/storage/SRLatch.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+`SR latch `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ set_,
+ reset,
+ output,
+ output_not
+ )
+
+Construct a new SR latch.
+
+Args:
+~~~~~
+* ``set_``: An object of type ``Wire``. The set input to the latch.
+* ``reset``: An object of type ``Wire``. The reset input to the latch.
+* ``output``: An object of type ``Wire``. The output of the latch. Takes on the value of 1 if the value of ``set`` is 1 and the value of 0 if the value of ``reset`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _TFlipFlop:
+
+TFlipFlop
+=========
+
+Class ``bw.storage.TFlipFlop``
+------------------------------
+
+.. image:: images/schematics/storage/TFlipFlop.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `T flip-flop `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ toggle,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered T flip-flop.
+
+Args:
+~~~~~
+* ``toggle``: An object of type ``Wire``. The toggle input to the flip-flop.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Toggles its value on the positive edges of ``clock`` if the value of ``toggle`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _TFlipFlopPresetClear:
+
+TFlipFlopPresetClear
+====================
+
+Class ``bw.storage.TFlipFlopPresetClear``
+-----------------------------------------
+
+.. image:: images/schematics/storage/TFlipFlopPresetClear.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `T flip-flop `_ with asynchronous active low preset and clear.
+
+__init__
+--------
+
+::
+
+ __init__(
+ toggle,
+ preset_n,
+ clear_n,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered T flip-flop with preset/clear capabilities.
+
+Args:
+~~~~~
+* ``toggle``: An object of type ``Wire``. The toggle input to the flip-flop.
+* ``preset_n``: An object of type ``Wire``. Presets ``output`` to 1 and ``output_not`` to 0 if its value is 0.
+* ``clear_n``: An object of type ``Wire``. Clears ``output`` to 0 and ``output_not`` to 1 if its value is 0.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Toggles its value on the positive edges of ``clock`` if the value of ``toggle`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
diff --git a/docs/_build/html/_static/alabaster.css b/docs/_build/html/_static/alabaster.css
index 4966909..900083d 100644
--- a/docs/_build/html/_static/alabaster.css
+++ b/docs/_build/html/_static/alabaster.css
@@ -75,11 +75,11 @@ div.documentwrapper {
}
div.bodywrapper {
- margin: 0 0 0 220px;
+ margin: 0 0 0 240px;
}
div.sphinxsidebar {
- width: 220px;
+ width: 240px;
font-size: 14px;
line-height: 1.5;
}
diff --git a/docs/_build/html/_static/custom.css b/docs/_build/html/_static/custom.css
index 3a79c64..1a0230e 100644
--- a/docs/_build/html/_static/custom.css
+++ b/docs/_build/html/_static/custom.css
@@ -1,10 +1,40 @@
@import url('https://fonts.googleapis.com/css?family=Sorts+Mill+Goudy');
+@import url('https://fonts.googleapis.com/css?family=EB+Garamond');
body {
font-family: 'Sorts Mill Goudy', serif;
}
+/*
+div.sphinxsidebar {
+ width: 240px;
+ font-size: 14px;
+ line-height: 1.5;
+ overflow-y: scroll;
+ top: 40px;
+ bottom: 0;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 18px 10px;
+}
+*/
+div.sphinxsidebar input {
+ font-family: 'Sorts Mill Goudy', serif;
+}
a:hover, a:visited, a:link, a:active {
/* text-decoration: none !important; */
border-bottom: none !important;
}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: 'Garamond', 'Georgia', serif;
+ font-weight: normal;
+ margin: 30px 0px 10px 0px;
+ padding: 0;
+}
diff --git a/docs/_build/html/api.html b/docs/_build/html/api.html
index ed7d68d..f617b91 100644
--- a/docs/_build/html/api.html
+++ b/docs/_build/html/api.html
@@ -24,6 +24,8 @@
+
+
@@ -64,6 +66,8 @@
Bitwise is a Python library intended to make hardware design and simulation more accessible
for software engineers. While it can never replace a true hardware description language,
@@ -127,7 +132,7 @@
input_1: An object of type Wire. The first data input to the multiplexer.
input_2: An object of type Wire. The second data input to the multiplexer.
-
output: An object of type Wire. The output of the multiplexer, which takes on the value of input_1 for a 1 select and input_2 for a 0 select.
+
output: An object of type Wire. The output of the multiplexer. Takes on the value of input_1 for a 1 select and input_2 for a 0 select.
@@ -625,7 +629,7 @@
Args:
select_1: An object of type Wire. The most significant bit of the select input.
select_2: An object of type Wire. The least significant bit of the select input.
input_bus: An object of type Bus4. The data input to the multiplexer.
-
output: An object of type Wire. The output of the multiplexer, which takes on the value of input_bus[0] for a (1, 1) select and input_bus[3] for a (0, 0) select.
+
output: An object of type Wire. The output of the multiplexer. Takes on the value of input_bus[0] for a (1, 1) select and input_bus[3] for a (0, 0) select.
@@ -664,7 +668,7 @@
Args:
select_2: An object of type Wire.
select_3: An object of type Wire. The least significant bit of the select input.
input_bus: An object of type Bus8. The data input to the multiplexer.
-
output: An object of type Wire. The output of the multiplexer, which takes on the value of input_bus[0] for a (1, 1, 1) select and input_bus[7] for a (0, 0, 0) select.
+
output: An object of type Wire. The output of the multiplexer. Takes on the value of input_bus[0] for a (1, 1, 1) select and input_bus[7] for a (0, 0, 0) select.
@@ -699,7 +703,7 @@
Args:
enable: An object of type Wire. Enables the multiplexer.
select_bus: An object of type Bus4. select_bus[0] and select_bus[3] are the most and least significant bit, respectively.
input_bus: An object of type Bus16. The data input to the multiplexer.
-
output: An object of type Wire. The output of the multiplexer, which takes on the value of input_bus[0] for a (1, 1, 1, 1) select and input_bus[15] for a (0, 0, 0, 0) select.
+
output: An object of type Wire. The output of the multiplexer. Takes on the value of input_bus[0] for a (1, 1, 1, 1) select and input_bus[15] for a (0, 0, 0, 0) select.
set_: An object of type Wire. The set input to the latch.
+
reset: An object of type Wire. The reset input to the latch.
+
clock: An object of type Wire or Clock. The clock input to the latch.
+
output: An object of type Wire. The output of the latch. When the value of clock is 1, takes on the value of 1 if the value of set is 1 and the value of 0 if the value of reset is 1.
+
output_not: An object of type Wire. The complemented form of output.
Construct a new positive edge-triggered JK flip-flop.
+
+
Args:
+
+
J: An object of type Wire. The J input to the flip-flop.
+
K: An object of type Wire. The K input to the flip-flop.
+
clock: An object of type Wire or Clock. The clock input to the flip-flop.
+
output: An object of type Wire. The output of the flip-flop. On the positive edges of clock, takes on the value of 1 if the value of J is 1, takes on the value of 0 if the value of K is 1, and toggles its value if both J and K have value 1.
+
output_not: An object of type Wire. The complemented form of output.
Construct a new positive edge-triggered JK flip-flop with preset/clear capabilities.
+
+
Args:
+
+
J: An object of type Wire. The J input to the flip-flop.
+
K: An object of type Wire. The K input to the flip-flop.
+
preset_n: An object of type Wire. Presets output to 1 and output_not to 0 if its value is 0.
+
clear_n: An object of type Wire. Clears output to 0 and output_not to 1 if its value is 0.
+
clock: An object of type Wire or Clock. The clock input to the flip-flop.
+
output: An object of type Wire. The output of the flip-flop. On the positive edges of clock, takes on the value of 1 if the value of J is 1, takes on the value of 0 if the value of K is 1, and toggles its value if both J and K have value 1.
+
output_not: An object of type Wire. The complemented form of output.
Construct a new 4-bit-parallel-to-serial converter.
+
+
Args:
+
+
enable: An object of type Wire. Enables the converter.
+
clear_n: An object of type Wire. Clears all 4 internal registers to 0 if its value is 0.
+
load_n: An object of type Wire. The mode select. A value of 0 indicates a parallel load operation, where the values of data_bus are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+
data_bus: An object of type Bus4. The parallel data input.
+
clock: An object of type Wire or Clock. The clock input.
+
output: An object of type Wire. The serial output of the converter. data_bus[3] is outputted first, and data_bus[0] is outputted last.
Construct a new 8-bit-parallel-to-serial converter.
+
+
Args:
+
+
enable: An object of type Wire. Enables the converter.
+
clear_n: An object of type Wire. Clears all 8 internal registers to 0 if its value is 0.
+
load_n: An object of type Wire. The mode select. A value of 0 indicates a parallel load operation, where the values of data_bus are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+
data_bus: An object of type Bus8. The parallel data input.
+
clock: An object of type Wire or Clock. The clock input.
+
output: An object of type Wire. The serial output of the converter. data_bus[7] is outputted first, and data_bus[0] is outputted last.
Construct a new 16-bit-parallel-to-serial converter.
+
+
Args:
+
+
enable: An object of type Wire. Enables the converter.
+
clear_n: An object of type Wire. Clears all 16 internal registers to 0 if its value is 0.
+
load_n: An object of type Wire. The mode select. A value of 0 indicates a parallel load operation, where the values of data_bus are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+
data_bus: An object of type Bus16. The parallel data input.
+
clock: An object of type Wire or Clock. The clock input.
+
output: An object of type Wire. The serial output of the converter. data_bus[15] is outputted first, and data_bus[0] is outputted last.
enable: An object of type Wire. Enables the shift register.
+
clear_n: An object of type Wire. Clears output_bus and output_serial to 0 if its value is 1.
+
shift_load: An object of type Wire. The mode select. A value of 0 indicates a parallel load operation, where output_bus takes on the value of data_bus. A value of 1 indicates a shift-right operation, where output_bus[3] takes on the value of output_bus[2], output_bus[2] takes on the value of output_bus[1], and so on; output_bus[0] takes on the value of data_serial.
+
data_bus: An object of type Bus4. The parallel data input.
+
data_serial. An object of type Wire. The serial data input.
+
clock. An object of type Wire or Clock. The clock input to the shift register.
+
output_bus. An object of type Bus4. The parallel data output.
+
output_serial. An object of type Wire. The serial data output. Identical to output_bus[3].
+
+
+
+
Raises:
+
+
TypeError: If either data_bus or output_bus is not a bus of width 4.
enable: An object of type Wire. Enables the shift register.
+
clear_n: An object of type Wire. Clears output_bus and output_serial to 0 if its value is 1.
+
shift_load: An object of type Wire. The mode select. A value of 0 indicates a parallel load operation, where output_bus takes on the value of data_bus. A value of 1 indicates a shift-right operation, where output_bus[7] takes on the value of output_bus[6], output_bus[6] takes on the value of output_bus[5], and so on; output_bus[0] takes on the value of data_serial.
+
data_bus: An object of type Bus8. The parallel data input.
+
data_serial. An object of type Wire. The serial data input.
+
clock. An object of type Wire or Clock. The clock input to the shift register.
+
output_bus. An object of type Bus8. The parallel data output.
+
output_serial. An object of type Wire. The serial data output. Identical to output_bus[7].
+
+
+
+
Raises:
+
+
TypeError: If either data_bus or output_bus is not a bus of width 8.
enable: An object of type Wire. Enables the shift register.
+
clear_n: An object of type Wire. Clears output_bus and output_serial to 0 if its value is 1.
+
shift_load: An object of type Wire. The mode select. A value of 0 indicates a parallel load operation, where output_bus takes on the value of data_bus. A value of 1 indicates a shift-right operation, where output_bus[15] takes on the value of output_bus[14], output_bus[14] takes on the value of output_bus[13], and so on; output_bus[0] takes on the value of data_serial.
+
data_bus: An object of type Bus16. The parallel data input.
+
data_serial. An object of type Wire. The serial data input.
+
clock. An object of type Wire or Clock. The clock input to the shift register.
+
output_bus. An object of type Bus16. The parallel data output.
+
output_serial. An object of type Wire. The serial data output. Identical to output_bus[15].
+
+
+
+
Raises:
+
+
TypeError: If either data_bus or output_bus is not a bus of width 16.
set_: An object of type Wire. The set input to the latch.
+
reset: An object of type Wire. The reset input to the latch.
+
output: An object of type Wire. The output of the latch. Takes on the value of 1 if the value of set is 1 and the value of 0 if the value of reset is 1.
+
output_not: An object of type Wire. The complemented form of output.
diff --git a/docs/_static/custom.css b/docs/_static/custom.css
index 3a79c64..1a0230e 100644
--- a/docs/_static/custom.css
+++ b/docs/_static/custom.css
@@ -1,10 +1,40 @@
@import url('https://fonts.googleapis.com/css?family=Sorts+Mill+Goudy');
+@import url('https://fonts.googleapis.com/css?family=EB+Garamond');
body {
font-family: 'Sorts Mill Goudy', serif;
}
+/*
+div.sphinxsidebar {
+ width: 240px;
+ font-size: 14px;
+ line-height: 1.5;
+ overflow-y: scroll;
+ top: 40px;
+ bottom: 0;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 18px 10px;
+}
+*/
+div.sphinxsidebar input {
+ font-family: 'Sorts Mill Goudy', serif;
+}
a:hover, a:visited, a:link, a:active {
/* text-decoration: none !important; */
border-bottom: none !important;
}
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: 'Garamond', 'Georgia', serif;
+ font-weight: normal;
+ margin: 30px 0px 10px 0px;
+ padding: 0;
+}
diff --git a/docs/api.rst b/docs/api.rst
index 16bf3bc..024fc36 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -69,6 +69,27 @@ API Documentation
:doc:`storage`
==============
+* :ref:`DFlipFlop`
+* :ref:`DFlipFlopPresetClear`
+* :ref:`GatedDLatch`
+* :ref:`GatedSRLatch`
+* :ref:`JKFlipFlop`
+* :ref:`JKFlipFlopPresetClear`
+* :ref:`ParallelToSerialConverter4To1`
+* :ref:`ParallelToSerialConverter8To1`
+* :ref:`ParallelToSerialConverter16To1`
+* :ref:`SerialToParallelConverter1To4`
+* :ref:`SerialToParallelConverter1To8`
+* :ref:`SerialToParallelConverter1To16`
+* :ref:`Register4`
+* :ref:`Register8`
+* :ref:`Register16`
+* :ref:`ShiftRegister4`
+* :ref:`ShiftRegister8`
+* :ref:`ShiftRegister16`
+* :ref:`SRLatch`
+* :ref:`TFlipFlop`
+* :ref:`TFlipFlopPresetClear`
:doc:`wire`
===========
diff --git a/docs/changelog.rst b/docs/changelog.rst
new file mode 100644
index 0000000..0281a3a
--- /dev/null
+++ b/docs/changelog.rst
@@ -0,0 +1,49 @@
+:tocdepth: 2
+
+=========
+Changelog
+=========
+
+
+Unreleased
+==========
+
+Added
+-----
+* Shift register classes to storage subpackage
+ * ``ShiftRegister4``
+ * ``ShiftRegister8``
+ * ``ShiftRegister16``
+
+* Parallel-to-serial converter classes to signal subpackage
+ * ``ParallelToSerialConverter4To1``
+ * ``ParallelToSerialConverter8To1``
+ * ``ParallelToSerialConverter16To1``
+
+* Serial-to-parallel converter classes to signal subpackage
+ * ``SerialToParallelConverter1To4``
+ * ``SerialToParallelConverter1To8``
+ * ``SerialToParallelConverter1To16``
+
+* Buffer class to gate subpackage
+* ``__getitem__()`` and ``__len__()`` methods to ``Bus4``, ``Bus8``, ``Bus16``, and ``BusSevenSegmentDisplay`` classes
+
+Changed
+-------
+* Rewrote docstrings for all classes
+* Misc improvements
+
+
+v0.1.1 - 2018-10-17
+===================
+
+Added
+-----
+* Storage register classes to storage subpackage
+ * ``Register4``
+ * ``Register8``
+ * ``Register16``
+
+Changed
+-------
+* Misc improvements
diff --git a/docs/conf.py b/docs/conf.py
index 7bd5951..d17a5f4 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -20,6 +20,7 @@
nav_links["Home"] = "index.html"
nav_links["Getting Started"] = "install.html"
nav_links["API Documentation"] = "api.html"
+nav_links["Changelog"] = "changelog.html"
html_theme = "alabaster"
highlight_language="python3"
@@ -30,6 +31,7 @@
"logo": "logo.png",
"logo_name": False,
"page_width": "70%",
+ "sidebar_width": "240px",
"sidebar_collapse": True,
"sidebar_includehidden": False,
"show_powered_by": False,
diff --git a/docs/images/schematics/signal/signal.xml b/docs/images/schematics/signal/signal.xml
index 909f12b..3c212b0 100644
--- a/docs/images/schematics/signal/signal.xml
+++ b/docs/images/schematics/signal/signal.xml
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/docs/images/schematics/storage/DFlipFlop.svg b/docs/images/schematics/storage/DFlipFlop.svg
new file mode 100644
index 0000000..05bd7cc
--- /dev/null
+++ b/docs/images/schematics/storage/DFlipFlop.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/DFlipFlopPresetClear.svg b/docs/images/schematics/storage/DFlipFlopPresetClear.svg
new file mode 100644
index 0000000..ffa23ae
--- /dev/null
+++ b/docs/images/schematics/storage/DFlipFlopPresetClear.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/GatedDLatch.svg b/docs/images/schematics/storage/GatedDLatch.svg
new file mode 100644
index 0000000..db90007
--- /dev/null
+++ b/docs/images/schematics/storage/GatedDLatch.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/GatedSRLatch.svg b/docs/images/schematics/storage/GatedSRLatch.svg
new file mode 100644
index 0000000..41e48e4
--- /dev/null
+++ b/docs/images/schematics/storage/GatedSRLatch.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/JKFlipFlop.svg b/docs/images/schematics/storage/JKFlipFlop.svg
new file mode 100644
index 0000000..37bef4c
--- /dev/null
+++ b/docs/images/schematics/storage/JKFlipFlop.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/JKFlipFlopPresetClear.svg b/docs/images/schematics/storage/JKFlipFlopPresetClear.svg
new file mode 100644
index 0000000..455776a
--- /dev/null
+++ b/docs/images/schematics/storage/JKFlipFlopPresetClear.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/ParallelToSerialConverter16To1.svg b/docs/images/schematics/storage/ParallelToSerialConverter16To1.svg
new file mode 100644
index 0000000..5211248
--- /dev/null
+++ b/docs/images/schematics/storage/ParallelToSerialConverter16To1.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/ParallelToSerialConverter4To1.svg b/docs/images/schematics/storage/ParallelToSerialConverter4To1.svg
new file mode 100644
index 0000000..15639e8
--- /dev/null
+++ b/docs/images/schematics/storage/ParallelToSerialConverter4To1.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/ParallelToSerialConverter8To1.svg b/docs/images/schematics/storage/ParallelToSerialConverter8To1.svg
new file mode 100644
index 0000000..ed18105
--- /dev/null
+++ b/docs/images/schematics/storage/ParallelToSerialConverter8To1.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/Register16.svg b/docs/images/schematics/storage/Register16.svg
new file mode 100644
index 0000000..932632a
--- /dev/null
+++ b/docs/images/schematics/storage/Register16.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/Register4.svg b/docs/images/schematics/storage/Register4.svg
new file mode 100644
index 0000000..4386d80
--- /dev/null
+++ b/docs/images/schematics/storage/Register4.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/Register8.svg b/docs/images/schematics/storage/Register8.svg
new file mode 100644
index 0000000..23757db
--- /dev/null
+++ b/docs/images/schematics/storage/Register8.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/SRLatch.svg b/docs/images/schematics/storage/SRLatch.svg
new file mode 100644
index 0000000..6221399
--- /dev/null
+++ b/docs/images/schematics/storage/SRLatch.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/SerialToParallelConverter1To16.svg b/docs/images/schematics/storage/SerialToParallelConverter1To16.svg
new file mode 100644
index 0000000..0576e1e
--- /dev/null
+++ b/docs/images/schematics/storage/SerialToParallelConverter1To16.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/SerialToParallelConverter1To4.svg b/docs/images/schematics/storage/SerialToParallelConverter1To4.svg
new file mode 100644
index 0000000..542fdc9
--- /dev/null
+++ b/docs/images/schematics/storage/SerialToParallelConverter1To4.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/SerialToParallelConverter1To8.svg b/docs/images/schematics/storage/SerialToParallelConverter1To8.svg
new file mode 100644
index 0000000..ea70b6a
--- /dev/null
+++ b/docs/images/schematics/storage/SerialToParallelConverter1To8.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/ShiftRegister16.svg b/docs/images/schematics/storage/ShiftRegister16.svg
new file mode 100644
index 0000000..fa9f6bb
--- /dev/null
+++ b/docs/images/schematics/storage/ShiftRegister16.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/ShiftRegister4.svg b/docs/images/schematics/storage/ShiftRegister4.svg
new file mode 100644
index 0000000..a22837a
--- /dev/null
+++ b/docs/images/schematics/storage/ShiftRegister4.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/ShiftRegister8.svg b/docs/images/schematics/storage/ShiftRegister8.svg
new file mode 100644
index 0000000..13ae06e
--- /dev/null
+++ b/docs/images/schematics/storage/ShiftRegister8.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/TFlipFlop.svg b/docs/images/schematics/storage/TFlipFlop.svg
new file mode 100644
index 0000000..d499c37
--- /dev/null
+++ b/docs/images/schematics/storage/TFlipFlop.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/TFlipFlopPresetClear.svg b/docs/images/schematics/storage/TFlipFlopPresetClear.svg
new file mode 100644
index 0000000..8b56ef5
--- /dev/null
+++ b/docs/images/schematics/storage/TFlipFlopPresetClear.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/docs/images/schematics/storage/storage.xml b/docs/images/schematics/storage/storage.xml
new file mode 100644
index 0000000..7c28f75
--- /dev/null
+++ b/docs/images/schematics/storage/storage.xml
@@ -0,0 +1 @@
+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
\ No newline at end of file
diff --git a/docs/index.rst b/docs/index.rst
index c377826..4d8ccee 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,3 +1,17 @@
+.. toctree::
+ :hidden:
+
+ api
+ arithmetic
+ changelog
+ gate
+ install
+ logic
+ signal
+ storage
+ wire
+
+
=============
About Bitwise
=============
@@ -40,7 +54,7 @@ Interacting with it in a Python session::
In [2]: b.value = 0
- In [3]: sum.value
+ In [3]: sum_.value
Out[3]: 0
In [4]: carry_out.value
@@ -48,7 +62,7 @@ Interacting with it in a Python session::
In [5]: a.value = 1
- In [6]: sum.value
+ In [6]: sum_.value
Out[6]: 1
In [7]: carry_out.value
@@ -56,7 +70,7 @@ Interacting with it in a Python session::
In [8]: b.value = 1
- In [9]: sum.value
+ In [9]: sum_.value
Out[9]: 0
In [10]: carry_out.value
diff --git a/docs/signal.rst b/docs/signal.rst
index 7664be0..5184dde 100644
--- a/docs/signal.rst
+++ b/docs/signal.rst
@@ -578,7 +578,7 @@ Args:
* ``select``: An object of type ``Wire``. The select input.
* ``input_1``: An object of type ``Wire``. The first data input to the multiplexer.
* ``input_2``: An object of type ``Wire``. The second data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_1`` for a 1 select and ``input_2`` for a 0 select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_1`` for a 1 select and ``input_2`` for a 0 select.
.. _Multiplexer4To1:
@@ -617,7 +617,7 @@ Args:
* ``select_1``: An object of type ``Wire``. The most significant bit of the select input.
* ``select_2``: An object of type ``Wire``. The least significant bit of the select input.
* ``input_bus``: An object of type ``Bus4``. The data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_bus[0]`` for a (1, 1) select and ``input_bus[3]`` for a (0, 0) select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_bus[0]`` for a (1, 1) select and ``input_bus[3]`` for a (0, 0) select.
Raises:
~~~~~~~
@@ -662,7 +662,7 @@ Args:
* ``select_2``: An object of type ``Wire``.
* ``select_3``: An object of type ``Wire``. The least significant bit of the select input.
* ``input_bus``: An object of type ``Bus8``. The data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_bus[0]`` for a (1, 1, 1) select and ``input_bus[7]`` for a (0, 0, 0) select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_bus[0]`` for a (1, 1, 1) select and ``input_bus[7]`` for a (0, 0, 0) select.
Raises:
~~~~~~~
@@ -703,7 +703,7 @@ Args:
* ``enable``: An object of type ``Wire``. Enables the multiplexer.
* ``select_bus``: An object of type ``Bus4``. ``select_bus[0]`` and ``select_bus[3]`` are the most and least significant bit, respectively.
* ``input_bus``: An object of type ``Bus16``. The data input to the multiplexer.
-* ``output``: An object of type ``Wire``. The output of the multiplexer, which takes on the value of ``input_bus[0]`` for a (1, 1, 1, 1) select and ``input_bus[15]`` for a (0, 0, 0, 0) select.
+* ``output``: An object of type ``Wire``. The output of the multiplexer. Takes on the value of ``input_bus[0]`` for a (1, 1, 1, 1) select and ``input_bus[15]`` for a (0, 0, 0, 0) select.
Raises:
~~~~~~~
diff --git a/docs/storage.rst b/docs/storage.rst
index e318e4e..cdcb1ff 100644
--- a/docs/storage.rst
+++ b/docs/storage.rst
@@ -3,3 +3,882 @@
=======
Storage
=======
+
+
+.. _DFlipFlop:
+
+DFlipFlop
+=========
+
+Class ``bw.storage.DFlipFlop``
+------------------------------
+
+.. image:: images/schematics/storage/DFlipFlop.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `D flip-flop `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered D flip-flop.
+
+Args:
+~~~~~
+* ``data``: An object of type ``Wire``. The data input to the flip-flop.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Takes on the value of ``data`` on the positive edges of ``clock``.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _DFlipFlopPresetClear:
+
+DFlipFlopPresetClear
+====================
+
+Class ``bw.storage.DFlipFlopPresetClear``
+-----------------------------------------
+
+.. image:: images/schematics/storage/DFlipFlopPresetClear.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `D flip-flop `_ with asynchronous active low preset and clear.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data,
+ preset_n,
+ clear_n,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered D flip-flop with preset/clear capabilities.
+
+Args:
+~~~~~
+* ``data``: An object of type ``Wire``. The data input to the flip-flop.
+* ``preset_n``: An object of type ``Wire``. Presets ``output`` to 1 and ``output_not`` to 0 if its value is 0.
+* ``clear_n``: An object of type ``Wire``. Clears ``output`` to 0 and ``output_not`` to 1 if its value is 0.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Takes on the value of ``data`` on the positive edges of ``clock``.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _GatedDLatch:
+
+GatedDLatch
+===========
+
+Class ``bw.storage.GatedDLatch``
+--------------------------------
+
+.. image:: images/schematics/storage/GatedDLatch.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+`Gated D latch `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new gated D latch.
+
+Args:
+~~~~~
+* ``data``: An object of type ``Wire``. The data input to the latch.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the latch.
+* ``output``: An object of type ``Wire``. The output of the latch. Takes on the value of ``data`` if the value of ``clock`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _GatedSRLatch:
+
+GatedSRLatch
+============
+
+Class ``bw.storage.GatedSRLatch``
+---------------------------------
+
+.. image:: images/schematics/storage/GatedSRLatch.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+`Gated SR latch `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ set_,
+ reset,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new gated SR latch.
+
+Args:
+~~~~~
+* ``set_``: An object of type ``Wire``. The set input to the latch.
+* ``reset``: An object of type ``Wire``. The reset input to the latch.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the latch.
+* ``output``: An object of type ``Wire``. The output of the latch. When the value of ``clock`` is 1, takes on the value of 1 if the value of ``set`` is 1 and the value of 0 if the value of ``reset`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _JKFlipFlop:
+
+JKFlipFlop
+==========
+
+Class ``bw.storage.JKFlipFlop``
+-------------------------------
+
+.. image:: images/schematics/storage/JKFlipFlop.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `JK flip-flop `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ J,
+ K,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered JK flip-flop.
+
+Args:
+~~~~~
+* ``J``: An object of type ``Wire``. The J input to the flip-flop.
+* ``K``: An object of type ``Wire``. The K input to the flip-flop.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. On the positive edges of ``clock``, takes on the value of 1 if the value of ``J`` is 1, takes on the value of 0 if the value of ``K`` is 1, and toggles its value if both ``J`` and ``K`` have value 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _JKFlipFlopPresetClear:
+
+JKFlipFlopPresetClear
+=====================
+
+Class ``bw.storage.JKFlipFlopPresetClear``
+------------------------------------------
+
+.. image:: images/schematics/storage/JKFlipFlopPresetClear.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `JK flip-flop `_ with asynchronous active low preset and clear.
+
+__init__
+--------
+
+::
+
+ __init__(
+ J,
+ K,
+ preset_n,
+ clear_n,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered JK flip-flop with preset/clear capabilities.
+
+Args:
+~~~~~
+* ``J``: An object of type ``Wire``. The J input to the flip-flop.
+* ``K``: An object of type ``Wire``. The K input to the flip-flop.
+* ``preset_n``: An object of type ``Wire``. Presets ``output`` to 1 and ``output_not`` to 0 if its value is 0.
+* ``clear_n``: An object of type ``Wire``. Clears ``output`` to 0 and ``output_not`` to 1 if its value is 0.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. On the positive edges of ``clock``, takes on the value of 1 if the value of ``J`` is 1, takes on the value of 0 if the value of ``K`` is 1, and toggles its value if both ``J`` and ``K`` have value 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _ParallelToSerialConverter4To1:
+
+ParallelToSerialConverter4To1
+=============================
+
+Class ``bw.signal.ParallelToSerialConverter4To1``
+-------------------------------------------------
+
+.. image:: images/schematics/storage/ParallelToSerialConverter4To1.svg
+ :width: 600px
+
+Defined in `bitwise/storage/PISO.py `_.
+
+`4-bit-parallel-to-serial converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ load_n,
+ data_bus,
+ clock,
+ output
+ )
+
+Construct a new 4-bit-parallel-to-serial converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 4 internal registers to 0 if its value is 0.
+* ``load_n``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where the values of ``data_bus`` are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+* ``data_bus``: An object of type ``Bus4``. The parallel data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output``: An object of type ``Wire``. The serial output of the converter. ``data_bus[3]`` is outputted first, and ``data_bus[0]`` is outputted last.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``data_bus`` is not a bus of width 4.
+
+
+.. _ParallelToSerialConverter8To1:
+
+ParallelToSerialConverter8To1
+=============================
+
+Class ``bw.signal.ParallelToSerialConverter8To1``
+-------------------------------------------------
+
+.. image:: images/schematics/storage/ParallelToSerialConverter8To1.svg
+ :width: 600px
+
+Defined in `bitwise/storage/PISO.py `_.
+
+`8-bit-parallel-to-serial converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ load_n,
+ data_bus,
+ clock,
+ output
+ )
+
+Construct a new 8-bit-parallel-to-serial converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 8 internal registers to 0 if its value is 0.
+* ``load_n``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where the values of ``data_bus`` are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+* ``data_bus``: An object of type ``Bus8``. The parallel data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output``: An object of type ``Wire``. The serial output of the converter. ``data_bus[7]`` is outputted first, and ``data_bus[0]`` is outputted last.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``data_bus`` is not a bus of width 8.
+
+
+.. _ParallelToSerialConverter16To1:
+
+ParallelToSerialConverter16To1
+==============================
+
+Class ``bw.signal.ParallelToSerialConverter16To1``
+--------------------------------------------------
+
+.. image:: images/schematics/storage/ParallelToSerialConverter16To1.svg
+ :width: 600px
+
+Defined in `bitwise/storage/PISO.py `_.
+
+`16-bit-parallel-to-serial converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ load_n,
+ data_bus,
+ clock,
+ output
+ )
+
+Construct a new 16-bit-parallel-to-serial converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 16 internal registers to 0 if its value is 0.
+* ``load_n``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where the values of ``data_bus`` are loaded into the internal registers. A value of 1 indicates a shift-right operation.
+* ``data_bus``: An object of type ``Bus16``. The parallel data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output``: An object of type ``Wire``. The serial output of the converter. ``data_bus[15]`` is outputted first, and ``data_bus[0]`` is outputted last.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``data_bus`` is not a bus of width 16.
+
+
+.. _Register4:
+
+Register4
+=========
+
+Class ``bw.storage.Register4``
+------------------------------
+
+.. image:: images/schematics/storage/Register4.svg
+ :width: 800px
+
+Defined in `bitwise/storage/REG.py `_.
+
+`4-bit storage register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data_bus,
+ clock,
+ output_bus
+ )
+
+Construct a new 4-bit storage register.
+
+Args:
+~~~~~
+* ``data_bus``: An object of type ``Bus4``. The data input to the register.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the register.
+* ``output_bus``: An object of type ``Bus4``. The output of the register. Takes on the value of ``data_bus`` on the positive edges of ``clock``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 4.
+
+
+.. _Register8:
+
+Register8
+=========
+
+Class ``bw.storage.Register8``
+------------------------------
+
+.. image:: images/schematics/storage/Register8.svg
+ :width: 800px
+
+Defined in `bitwise/storage/REG.py `_.
+
+`8-bit storage register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data_bus,
+ clock,
+ output_bus
+ )
+
+Construct a new 8-bit storage register.
+
+Args:
+~~~~~
+* ``data_bus``: An object of type ``Bus8``. The data input to the register.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the register.
+* ``output_bus``: An object of type ``Bus8``. The output of the register. Takes on the value of ``data_bus`` on the positive edges of ``clock``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 8.
+
+
+.. _Register16:
+
+Register16
+==========
+
+Class ``bw.storage.Register16``
+-------------------------------
+
+.. image:: images/schematics/storage/Register16.svg
+ :width: 800px
+
+Defined in `bitwise/storage/REG.py `_.
+
+`16-bit storage register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ data_bus,
+ clock,
+ output_bus
+ )
+
+Construct a new 16-bit storage register.
+
+Args:
+~~~~~
+* ``data_bus``: An object of type ``Bus16``. The data input to the register.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the register.
+* ``output_bus``: An object of type ``Bus16``. The output of the register. Takes on the value of ``data_bus`` on the positive edges of ``clock``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 16.
+
+
+.. _SerialToParallelConverter1To4:
+
+SerialToParallelConverter1To4
+=============================
+
+Class ``bw.storage.SerialToParallelConverter1To4``
+--------------------------------------------------
+
+.. image:: images/schematics/storage/SerialToParallelConverter1To4.svg
+ :width: 600px
+
+Defined in `bitwise/storage/SIPO.py `_.
+
+`Serial-to-4-bit-parallel converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ data,
+ clock,
+ output_bus
+ )
+
+Construct a new serial-to-4-bit-parallel converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 4 internal registers to 0 if its value is 0.
+* ``data``: An object of type ``Wire``. The serial data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output_bus``: An object of type ``Bus4``. The parallel output of the converter. ``output[0]`` corresponds to the most recent serial data input.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``output_bus`` is not a bus of width 4.
+
+
+.. _SerialToParallelConverter1To8:
+
+SerialToParallelConverter1To8
+=============================
+
+Class ``bw.storage.SerialToParallelConverter1To8``
+--------------------------------------------------
+
+.. image:: images/schematics/storage/SerialToParallelConverter1To8.svg
+ :width: 600px
+
+Defined in `bitwise/storage/SIPO.py `_.
+
+`Serial-to-8-bit-parallel converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ data,
+ clock,
+ output_bus
+ )
+
+Construct a new serial-to-8-bit-parallel converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 8 internal registers to 0 if its value is 0.
+* ``data``: An object of type ``Wire``. The serial data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output_bus``: An object of type ``Bus8``. The parallel output of the converter. ``output[0]`` corresponds to the most recent serial data input.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``output_bus`` is not a bus of width 8.
+
+
+.. _SerialToParallelConverter1To16:
+
+SerialToParallelConverter1To16
+==============================
+
+Class ``bw.storage.SerialToParallelConverter1To16``
+---------------------------------------------------
+
+.. image:: images/schematics/storage/SerialToParallelConverter1To16.svg
+ :width: 600px
+
+Defined in `bitwise/storage/SIPO.py `_.
+
+`Serial-to-16-bit-parallel converter `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ data,
+ clock,
+ output_bus
+ )
+
+Construct a new serial-to-16-bit-parallel converter.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the converter.
+* ``clear_n``: An object of type ``Wire``. Clears all 16 internal registers to 0 if its value is 0.
+* ``data``: An object of type ``Wire``. The serial data input.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input.
+* ``output_bus``: An object of type ``Bus16``. The parallel output of the converter. ``output[0]`` corresponds to the most recent serial data input.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If ``output_bus`` is not a bus of width 16.
+
+
+.. _ShiftRegister4:
+
+ShiftRegister4
+==============
+
+Class ``bw.storage.ShiftRegister4``
+-----------------------------------
+
+.. image:: images/schematics/storage/ShiftRegister4.svg
+ :width: 800px
+
+Defined in `bitwise/storage/SHIFT.py `_.
+
+`4-bit shift register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ shift_load,
+ data_bus,
+ data_serial,
+ clock,
+ output_bus,
+ output_serial
+ )
+
+Construct a new 4-bit shift register.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the shift register.
+* ``clear_n``: An object of type ``Wire``. Clears ``output_bus`` and ``output_serial`` to 0 if its value is 1.
+* ``shift_load``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where ``output_bus`` takes on the value of ``data_bus``. A value of 1 indicates a shift-right operation, where ``output_bus[3]`` takes on the value of ``output_bus[2]``, ``output_bus[2]`` takes on the value of ``output_bus[1]``, and so on; ``output_bus[0]`` takes on the value of ``data_serial``.
+* ``data_bus``: An object of type ``Bus4``. The parallel data input.
+* ``data_serial``. An object of type ``Wire``. The serial data input.
+* ``clock``. An object of type ``Wire`` or ``Clock``. The clock input to the shift register.
+* ``output_bus``. An object of type ``Bus4``. The parallel data output.
+* ``output_serial``. An object of type ``Wire``. The serial data output. Identical to ``output_bus[3]``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 4.
+
+
+.. _ShiftRegister8:
+
+ShiftRegister8
+==============
+
+Class ``bw.storage.ShiftRegister8``
+-----------------------------------
+
+.. image:: images/schematics/storage/ShiftRegister8.svg
+ :width: 800px
+
+Defined in `bitwise/storage/SHIFT.py `_.
+
+`8-bit shift register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ shift_load,
+ data_bus,
+ data_serial,
+ clock,
+ output_bus,
+ output_serial
+ )
+
+Construct a new 8-bit shift register.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the shift register.
+* ``clear_n``: An object of type ``Wire``. Clears ``output_bus`` and ``output_serial`` to 0 if its value is 1.
+* ``shift_load``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where ``output_bus`` takes on the value of ``data_bus``. A value of 1 indicates a shift-right operation, where ``output_bus[7]`` takes on the value of ``output_bus[6]``, ``output_bus[6]`` takes on the value of ``output_bus[5]``, and so on; ``output_bus[0]`` takes on the value of ``data_serial``.
+* ``data_bus``: An object of type ``Bus8``. The parallel data input.
+* ``data_serial``. An object of type ``Wire``. The serial data input.
+* ``clock``. An object of type ``Wire`` or ``Clock``. The clock input to the shift register.
+* ``output_bus``. An object of type ``Bus8``. The parallel data output.
+* ``output_serial``. An object of type ``Wire``. The serial data output. Identical to ``output_bus[7]``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 8.
+
+
+.. _ShiftRegister16:
+
+ShiftRegister16
+===============
+
+Class ``bw.storage.ShiftRegister16``
+------------------------------------
+
+.. image:: images/schematics/storage/ShiftRegister16.svg
+ :width: 800px
+
+Defined in `bitwise/storage/SHIFT.py `_.
+
+`16-bit shift register `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ enable,
+ clear_n,
+ shift_load,
+ data_bus,
+ data_serial,
+ clock,
+ output_bus,
+ output_serial
+ )
+
+Construct a new 16-bit shift register.
+
+Args:
+~~~~~
+* ``enable``: An object of type ``Wire``. Enables the shift register.
+* ``clear_n``: An object of type ``Wire``. Clears ``output_bus`` and ``output_serial`` to 0 if its value is 1.
+* ``shift_load``: An object of type ``Wire``. The mode select. A value of 0 indicates a parallel load operation, where ``output_bus`` takes on the value of ``data_bus``. A value of 1 indicates a shift-right operation, where ``output_bus[15]`` takes on the value of ``output_bus[14]``, ``output_bus[14]`` takes on the value of ``output_bus[13]``, and so on; ``output_bus[0]`` takes on the value of ``data_serial``.
+* ``data_bus``: An object of type ``Bus16``. The parallel data input.
+* ``data_serial``. An object of type ``Wire``. The serial data input.
+* ``clock``. An object of type ``Wire`` or ``Clock``. The clock input to the shift register.
+* ``output_bus``. An object of type ``Bus16``. The parallel data output.
+* ``output_serial``. An object of type ``Wire``. The serial data output. Identical to ``output_bus[15]``.
+
+Raises:
+~~~~~~~
+* ``TypeError``: If either ``data_bus`` or ``output_bus`` is not a bus of width 16.
+
+
+.. _SRLatch:
+
+SRLatch
+=======
+
+Class ``bw.storage.SRLatch``
+----------------------------
+
+.. image:: images/schematics/storage/SRLatch.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+`SR latch `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ set_,
+ reset,
+ output,
+ output_not
+ )
+
+Construct a new SR latch.
+
+Args:
+~~~~~
+* ``set_``: An object of type ``Wire``. The set input to the latch.
+* ``reset``: An object of type ``Wire``. The reset input to the latch.
+* ``output``: An object of type ``Wire``. The output of the latch. Takes on the value of 1 if the value of ``set`` is 1 and the value of 0 if the value of ``reset`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _TFlipFlop:
+
+TFlipFlop
+=========
+
+Class ``bw.storage.TFlipFlop``
+------------------------------
+
+.. image:: images/schematics/storage/TFlipFlop.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `T flip-flop `_.
+
+__init__
+--------
+
+::
+
+ __init__(
+ toggle,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered T flip-flop.
+
+Args:
+~~~~~
+* ``toggle``: An object of type ``Wire``. The toggle input to the flip-flop.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Toggles its value on the positive edges of ``clock`` if the value of ``toggle`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
+
+
+.. _TFlipFlopPresetClear:
+
+TFlipFlopPresetClear
+====================
+
+Class ``bw.storage.TFlipFlopPresetClear``
+-----------------------------------------
+
+.. image:: images/schematics/storage/TFlipFlopPresetClear.svg
+ :width: 360px
+
+Defined in `bitwise/storage/FLOP.py `_.
+
+Positive edge-triggered `T flip-flop `_ with asynchronous active low preset and clear.
+
+__init__
+--------
+
+::
+
+ __init__(
+ toggle,
+ preset_n,
+ clear_n,
+ clock,
+ output,
+ output_not
+ )
+
+Construct a new positive edge-triggered T flip-flop with preset/clear capabilities.
+
+Args:
+~~~~~
+* ``toggle``: An object of type ``Wire``. The toggle input to the flip-flop.
+* ``preset_n``: An object of type ``Wire``. Presets ``output`` to 1 and ``output_not`` to 0 if its value is 0.
+* ``clear_n``: An object of type ``Wire``. Clears ``output`` to 0 and ``output_not`` to 1 if its value is 0.
+* ``clock``: An object of type ``Wire`` or ``Clock``. The clock input to the flip-flop.
+* ``output``: An object of type ``Wire``. The output of the flip-flop. Toggles its value on the positive edges of ``clock`` if the value of ``toggle`` is 1.
+* ``output_not``: An object of type ``Wire``. The complemented form of ``output``.
diff --git a/tests/signal/test_ParallelToSerialConverter16To1.py b/tests/storage/test_ParallelToSerialConverter16To1.py
similarity index 98%
rename from tests/signal/test_ParallelToSerialConverter16To1.py
rename to tests/storage/test_ParallelToSerialConverter16To1.py
index eccd3a7..a0d3e0b 100644
--- a/tests/signal/test_ParallelToSerialConverter16To1.py
+++ b/tests/storage/test_ParallelToSerialConverter16To1.py
@@ -43,7 +43,7 @@ def test_ParallelToSerialConverter16To1(self):
data_16
)
- bw.signal.ParallelToSerialConverter16To1(
+ bw.storage.ParallelToSerialConverter16To1(
enable,
reset_n,
parallel_load_n,
diff --git a/tests/signal/test_ParallelToSerialConverter4To1.py b/tests/storage/test_ParallelToSerialConverter4To1.py
similarity index 97%
rename from tests/signal/test_ParallelToSerialConverter4To1.py
rename to tests/storage/test_ParallelToSerialConverter4To1.py
index 96bec4f..c0941cd 100644
--- a/tests/signal/test_ParallelToSerialConverter4To1.py
+++ b/tests/storage/test_ParallelToSerialConverter4To1.py
@@ -14,7 +14,7 @@ def test_ParallelToSerialConverter4To1(self):
output = bw.wire.Wire()
data_bus = bw.wire.Bus4(data_1, data_2, data_3, data_4)
- bw.signal.ParallelToSerialConverter4To1(
+ bw.storage.ParallelToSerialConverter4To1(
enable,
reset_n,
parallel_load_n,
diff --git a/tests/signal/test_ParallelToSerialConverter8To1.py b/tests/storage/test_ParallelToSerialConverter8To1.py
similarity index 98%
rename from tests/signal/test_ParallelToSerialConverter8To1.py
rename to tests/storage/test_ParallelToSerialConverter8To1.py
index b6856e7..2a772f3 100644
--- a/tests/signal/test_ParallelToSerialConverter8To1.py
+++ b/tests/storage/test_ParallelToSerialConverter8To1.py
@@ -27,7 +27,7 @@ def test_ParallelToSerialConverter8To1(self):
data_8
)
- bw.signal.ParallelToSerialConverter8To1(
+ bw.storage.ParallelToSerialConverter8To1(
enable,
reset_n,
parallel_load_n,
diff --git a/tests/signal/test_SerialToParallelConverter1To16.py b/tests/storage/test_SerialToParallelConverter1To16.py
similarity index 99%
rename from tests/signal/test_SerialToParallelConverter1To16.py
rename to tests/storage/test_SerialToParallelConverter1To16.py
index 968e952..0b4a861 100644
--- a/tests/signal/test_SerialToParallelConverter1To16.py
+++ b/tests/storage/test_SerialToParallelConverter1To16.py
@@ -42,7 +42,7 @@ def test_SerialToParallelConverter1To16(self):
output_16
)
- bw.signal.SerialToParallelConverter1To16(
+ bw.storage.SerialToParallelConverter1To16(
enable,
reset_n,
data,
diff --git a/tests/signal/test_SerialToParallelConverter1To4.py b/tests/storage/test_SerialToParallelConverter1To4.py
similarity index 98%
rename from tests/signal/test_SerialToParallelConverter1To4.py
rename to tests/storage/test_SerialToParallelConverter1To4.py
index f80cad1..f1183d7 100644
--- a/tests/signal/test_SerialToParallelConverter1To4.py
+++ b/tests/storage/test_SerialToParallelConverter1To4.py
@@ -13,7 +13,7 @@ def test_SerialToParallelConverter1To4(self):
output_4 = bw.wire.Wire()
output_bus = bw.wire.Bus4(output_1, output_2, output_3, output_4)
- bw.signal.SerialToParallelConverter1To4(
+ bw.storage.SerialToParallelConverter1To4(
enable,
reset_n,
data,
diff --git a/tests/signal/test_SerialToParallelConverter1To8.py b/tests/storage/test_SerialToParallelConverter1To8.py
similarity index 98%
rename from tests/signal/test_SerialToParallelConverter1To8.py
rename to tests/storage/test_SerialToParallelConverter1To8.py
index e8d11ac..2d7c60f 100644
--- a/tests/signal/test_SerialToParallelConverter1To8.py
+++ b/tests/storage/test_SerialToParallelConverter1To8.py
@@ -26,7 +26,7 @@ def test_SerialToParallelConverter1To8(self):
output_8
)
- bw.signal.SerialToParallelConverter1To8(
+ bw.storage.SerialToParallelConverter1To8(
enable,
reset_n,
data,