From 705c6e7c1ace1849e2504e2d79095a68b8433abc Mon Sep 17 00:00:00 2001 From: James Jiang Date: Tue, 23 Oct 2018 22:00:13 -0400 Subject: [PATCH] Documentation for storage subpackage (#20) * Finished schematics for storage classes * Finished documentation for flip-flops and registers * Finished docs for SIPO and PISO --- LICENSE | 2 +- README.rst | 6 +- bitwise/signal/__init__.py | 2 - bitwise/storage/FLOP.py | 231 ++--- bitwise/{signal => storage}/PISO.py | 69 +- bitwise/storage/REG.py | 177 ++-- bitwise/storage/SHIFT.py | 90 +- bitwise/{signal => storage}/SIPO.py | 60 +- bitwise/storage/__init__.py | 2 + docs/_build/doctrees/api.doctree | Bin 29117 -> 38154 bytes docs/_build/doctrees/changelog.doctree | Bin 0 -> 12983 bytes docs/_build/doctrees/environment.pickle | Bin 108335 -> 184014 bytes docs/_build/doctrees/index.doctree | Bin 5617 -> 6067 bytes docs/_build/doctrees/signal.doctree | Bin 205741 -> 205645 bytes docs/_build/doctrees/storage.doctree | Bin 2233 -> 213155 bytes docs/_build/html/.buildinfo | 2 +- docs/_build/html/_images/DFlipFlop.svg | 2 + .../html/_images/DFlipFlopPresetClear.svg | 2 + docs/_build/html/_images/GatedDLatch.svg | 2 + docs/_build/html/_images/GatedSRLatch.svg | 2 + docs/_build/html/_images/JKFlipFlop.svg | 2 + .../html/_images/JKFlipFlopPresetClear.svg | 2 + .../ParallelToSerialConverter16To1.svg | 2 + .../_images/ParallelToSerialConverter4To1.svg | 2 + .../_images/ParallelToSerialConverter8To1.svg | 2 + docs/_build/html/_images/Register16.svg | 2 + docs/_build/html/_images/Register4.svg | 2 + docs/_build/html/_images/Register8.svg | 2 + docs/_build/html/_images/SRLatch.svg | 2 + .../SerialToParallelConverter1To16.svg | 2 + .../_images/SerialToParallelConverter1To4.svg | 2 + .../_images/SerialToParallelConverter1To8.svg | 2 + docs/_build/html/_images/ShiftRegister16.svg | 2 + docs/_build/html/_images/ShiftRegister4.svg | 2 + docs/_build/html/_images/ShiftRegister8.svg | 2 + docs/_build/html/_images/TFlipFlop.svg | 2 + .../html/_images/TFlipFlopPresetClear.svg | 2 + docs/_build/html/_sources/api.rst.txt | 21 + docs/_build/html/_sources/changelog.rst.txt | 49 + docs/_build/html/_sources/index.rst.txt | 20 +- docs/_build/html/_sources/signal.rst.txt | 8 +- docs/_build/html/_sources/storage.rst.txt | 879 ++++++++++++++++++ docs/_build/html/_static/alabaster.css | 4 +- docs/_build/html/_static/custom.css | 30 + docs/_build/html/api.html | 27 + docs/_build/html/arithmetic.html | 4 + docs/_build/html/changelog.html | 191 ++++ docs/_build/html/gate.html | 4 + docs/_build/html/genindex.html | 2 + docs/_build/html/index.html | 13 +- docs/_build/html/install.html | 4 + docs/_build/html/logic.html | 4 + docs/_build/html/objects.inv | Bin 853 -> 1088 bytes docs/_build/html/search.html | 2 + docs/_build/html/searchindex.js | 2 +- docs/_build/html/signal.html | 12 +- docs/_build/html/storage.html | 767 +++++++++++++++ docs/_build/html/wire.html | 3 + docs/_static/custom.css | 30 + docs/api.rst | 21 + docs/changelog.rst | 49 + docs/conf.py | 2 + docs/images/schematics/signal/signal.xml | 2 +- docs/images/schematics/storage/DFlipFlop.svg | 2 + .../storage/DFlipFlopPresetClear.svg | 2 + .../images/schematics/storage/GatedDLatch.svg | 2 + .../schematics/storage/GatedSRLatch.svg | 2 + docs/images/schematics/storage/JKFlipFlop.svg | 2 + .../storage/JKFlipFlopPresetClear.svg | 2 + .../ParallelToSerialConverter16To1.svg | 2 + .../storage/ParallelToSerialConverter4To1.svg | 2 + .../storage/ParallelToSerialConverter8To1.svg | 2 + docs/images/schematics/storage/Register16.svg | 2 + docs/images/schematics/storage/Register4.svg | 2 + docs/images/schematics/storage/Register8.svg | 2 + docs/images/schematics/storage/SRLatch.svg | 2 + .../SerialToParallelConverter1To16.svg | 2 + .../storage/SerialToParallelConverter1To4.svg | 2 + .../storage/SerialToParallelConverter1To8.svg | 2 + .../schematics/storage/ShiftRegister16.svg | 2 + .../schematics/storage/ShiftRegister4.svg | 2 + .../schematics/storage/ShiftRegister8.svg | 2 + docs/images/schematics/storage/TFlipFlop.svg | 2 + .../storage/TFlipFlopPresetClear.svg | 2 + docs/images/schematics/storage/storage.xml | 1 + docs/index.rst | 20 +- docs/signal.rst | 8 +- docs/storage.rst | 879 ++++++++++++++++++ .../test_ParallelToSerialConverter16To1.py | 2 +- .../test_ParallelToSerialConverter4To1.py | 2 +- .../test_ParallelToSerialConverter8To1.py | 2 +- .../test_SerialToParallelConverter1To16.py | 2 +- .../test_SerialToParallelConverter1To4.py | 2 +- .../test_SerialToParallelConverter1To8.py | 2 +- 94 files changed, 3480 insertions(+), 315 deletions(-) rename bitwise/{signal => storage}/PISO.py (52%) rename bitwise/{signal => storage}/SIPO.py (57%) create mode 100644 docs/_build/doctrees/changelog.doctree create mode 100644 docs/_build/html/_images/DFlipFlop.svg create mode 100644 docs/_build/html/_images/DFlipFlopPresetClear.svg create mode 100644 docs/_build/html/_images/GatedDLatch.svg create mode 100644 docs/_build/html/_images/GatedSRLatch.svg create mode 100644 docs/_build/html/_images/JKFlipFlop.svg create mode 100644 docs/_build/html/_images/JKFlipFlopPresetClear.svg create mode 100644 docs/_build/html/_images/ParallelToSerialConverter16To1.svg create mode 100644 docs/_build/html/_images/ParallelToSerialConverter4To1.svg create mode 100644 docs/_build/html/_images/ParallelToSerialConverter8To1.svg create mode 100644 docs/_build/html/_images/Register16.svg create mode 100644 docs/_build/html/_images/Register4.svg create mode 100644 docs/_build/html/_images/Register8.svg create mode 100644 docs/_build/html/_images/SRLatch.svg create mode 100644 docs/_build/html/_images/SerialToParallelConverter1To16.svg create mode 100644 docs/_build/html/_images/SerialToParallelConverter1To4.svg create mode 100644 docs/_build/html/_images/SerialToParallelConverter1To8.svg create mode 100644 docs/_build/html/_images/ShiftRegister16.svg create mode 100644 docs/_build/html/_images/ShiftRegister4.svg create mode 100644 docs/_build/html/_images/ShiftRegister8.svg create mode 100644 docs/_build/html/_images/TFlipFlop.svg create mode 100644 docs/_build/html/_images/TFlipFlopPresetClear.svg create mode 100644 docs/_build/html/_sources/changelog.rst.txt create mode 100644 docs/_build/html/changelog.html create mode 100644 docs/changelog.rst create mode 100644 docs/images/schematics/storage/DFlipFlop.svg create mode 100644 docs/images/schematics/storage/DFlipFlopPresetClear.svg create mode 100644 docs/images/schematics/storage/GatedDLatch.svg create mode 100644 docs/images/schematics/storage/GatedSRLatch.svg create mode 100644 docs/images/schematics/storage/JKFlipFlop.svg create mode 100644 docs/images/schematics/storage/JKFlipFlopPresetClear.svg create mode 100644 docs/images/schematics/storage/ParallelToSerialConverter16To1.svg create mode 100644 docs/images/schematics/storage/ParallelToSerialConverter4To1.svg create mode 100644 docs/images/schematics/storage/ParallelToSerialConverter8To1.svg create mode 100644 docs/images/schematics/storage/Register16.svg create mode 100644 docs/images/schematics/storage/Register4.svg create mode 100644 docs/images/schematics/storage/Register8.svg create mode 100644 docs/images/schematics/storage/SRLatch.svg create mode 100644 docs/images/schematics/storage/SerialToParallelConverter1To16.svg create mode 100644 docs/images/schematics/storage/SerialToParallelConverter1To4.svg create mode 100644 docs/images/schematics/storage/SerialToParallelConverter1To8.svg create mode 100644 docs/images/schematics/storage/ShiftRegister16.svg create mode 100644 docs/images/schematics/storage/ShiftRegister4.svg create mode 100644 docs/images/schematics/storage/ShiftRegister8.svg create mode 100644 docs/images/schematics/storage/TFlipFlop.svg create mode 100644 docs/images/schematics/storage/TFlipFlopPresetClear.svg create mode 100644 docs/images/schematics/storage/storage.xml rename tests/{signal => storage}/test_ParallelToSerialConverter16To1.py (98%) rename tests/{signal => storage}/test_ParallelToSerialConverter4To1.py (97%) rename tests/{signal => storage}/test_ParallelToSerialConverter8To1.py (98%) rename tests/{signal => storage}/test_SerialToParallelConverter1To16.py (99%) rename tests/{signal => storage}/test_SerialToParallelConverter1To4.py (98%) rename tests/{signal => storage}/test_SerialToParallelConverter1To8.py (98%) 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 b8330a22304dd69f138de7177993536ac5a3ccbb..2f76a4e02d565a028b82f8e29283a1885895630f 100644 GIT binary patch delta 4881 zcmaKwZERCj7{_VZZnv&$i|O5K+hqiB4u{Mvb8fuK++dq^Tk9LJt#{kq+ELf8?T8TA zSfXD@1Hze!F$N_uMi-or@rfwGX#8N5NMZ~jNF?GHVn7o=8G}COJncDm_pJLuPXD|2 zd49ippL=@Cm%mv~E?5gs6uk4_{H4O#LGrNPv2=QHyM>Hs-k7^JsgJdW+dE>>L`N*1 z2+v1s1M`tXPt469pRbD)PV|(lS;L|xIeJ!()J!q2HUHLpwn{{aR854)U9HX1M{4zL z*1-~TM)lZ>N5`P=81yBz9#7$3I4S^tuOV+YIM}By_UT$fk)@NIAFn36cG+fm{obUW z($jllx|Wo%kIC3P64*RaGoF>onhf5AqSNGe?HS7)vpB^pJRWY5U_>K8MCMA>!hPT~ z!+q$dqb8q+0b8_FOY5WUJz9DsB57QZHFzX6c%)`Z4Ao5Zm)Z5d#K^Cfkg0aHWSq7h zjnUTZ26O@9A_u0Q7EHjt=WT~ri(voC#J6Q)9tmO|sTqf{oC*0JL%z$99{_Tn>R`yJ zq+sp_$~&Bye!8`sIlc~OysJC!kUJdGkn>1D^GMCuMKKey$3f1QwOZFX$c+tcR=fm`d@(hdi2-Gn1P>owD^Hs;%8a2^S89;q2sfE(%>9q6OljuN|3 zBETe6RY)wKbL9m%We4ieWvfBQzX5f6wWJn{>9J5es3)UZY)^dhu%1klAA{xLm@L5~ zA;BXxkiZM`t#fr*MaiMsQ zCO3PDz2)J5WhWj9Cmz9_%2N%1Lh&Zk>=l%<&A?L1HUnoV-3+RIIC1HCPAxloP=TE8 zD_8nJ;}IIsx&WumqFB`%l!r|vg>i%Sie3VO{HOzlI~DOHsX;m;t{-L@mePMd4xZM z@aGtOad9%+nVjiUl@PF=mMjC6U$z?l0w&s~AWX6bVNA#?IbaPkPg&P6fP_52$_|3c752x@27lZ1CyDlY@w z0|ceZ`v%Zi6}Q!3Bs!MPHIVPU*C{=nJQA=xQZvrw1x>&kpxpGZ7V#Y?pO!sst#z`k zXN!|=Jx*tevM_p>LpBYs0JY!Ao<+K>g5z_~;)(+DRP@LKJQ4ytG7FeTBeYzg4+RF9 zK#4(s&B?2P96)-y>@v`kYeC!WvP-qXq#Tpkc_i3*q-I>Eil(doCWnU~Pc;K%v8=&5 zhX$w6z$I=08=%(!dj<{Y@~FWe>dX#Mo>%P)GCYq2Jdf0jE&I}Lg1!vx;g$6ga$aSe zMK;4bwz40{77>yz7YvYWXA9+hv%W1e@<=f92(}Df%S3q(DeofX14d~tPA_|}J^*lc zkdrQN88~zA)x5mn^*3xc{p!tB zV=nfv*0|`y>hW+l)9dy@P;8s!AqQ9Yi^f#C#vUYk{CqE3$ zr~#QU;3DC$&l;qSYsrV-2Uv6B&?=QdDAhyztoJx!xsO(Xs*&nQeZ<>6 zL^Q3n^Nn0-aXok>t_P3QOu=*0Df4U63DiH1`X`a#&yfO>8djAsv_6Wqba@zUQ!X-9 zQ+0O4+xdx1z#~DxBP1|yIv0`PGbFf@BdAm~Xt{vh>GES^cQQBXtGg+;=aFcC(?z}= z^;>_%Host-``9L>S1H3#`xdsL%b%CEDID8USLBwyC3qy-6uHTPv8SwVH<_z#v$)wb zRk`Ujk;?JS$_SLUyV>B-r2+@Q;N&i)jeI?>*0soucqAINxX(s>)?H8wHjeGss0$m> z$r**}t=Nbzn|ULcP#dTK( delta 819 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 Jc>1H~{{uZLa*hB1 literal 108335 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 JeQrK1{RW~724VmJ delta 885 zcmdn2|52N@fo1A5(TS{XliQiHRE2uj3KEM_^Gc><2xKs3F!!((=a&{Gr%v(fVadtN z1Jb2Qi4&)Kh?n-Tmn5d=CFZ71$>7V7%HRg6&XAt`m(hYHL&lqVvmx_!Mn=)i-po4~ z<6EaRPN|)uk-?gw4^*lPQRgFP0gmw&PXyDX#VWIJ{#7YCq1JL1g;x!f9}9BdB{(0rZAbJ!h$ z#@%Btu#(E~A>J^UW5I@Q?%;R{^8YH1LyVdT|FZ!tjK%Hi$+0}r;+h%JKrag*I}Plt zejZDpv;OjEPyWJV>LZnrOS;okVTJ+?jDdw?gvjI>d=`^0@`X-T=MSA+%WpP$0v{{0 zD2BL`lT=0xZpQb*GR~aNxRcS9Sx+Hka^Nl5=^N)Vx-d>h5!;?PkI|Nq z(R^~Du*md=xs2Q(#nUG$Fv>IaAOt7d?UmWCxqwkbf^iLs_UXLe8G-tCG8#>Pzk^Yb zaW$swcAzYgHhAo2oFO~ib_b&y+{r-m#V6bU<(RJjol$Ul%}qw#X*=;r%S<=;!Duyo z_ASPXM0x7_ZN^nnj5{%$ox->SMQr=s?~HN8h10R0j0J3yi@I#4Rx_D%PGw|ZWB`Hb p2h|uAwq9b&{XhA@RL-e^%-Nh%KPrKx7^W{=$&|NUi;=lm2>>JUmofkV delta 489 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 +
DFlipFlop
[Not supported by viewer]
data
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
\ 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 @@ + +
DFlipFlop
Preset
Clear

[Not supported by viewer]
data
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
preset_n
[Not supported by viewer]
clear_n
[Not supported by viewer]
\ 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 @@ + +
Gated
DLatch
[Not supported by viewer]
data
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
\ 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 @@ + +
Gated
SRLatch
[Not supported by viewer]
set
[Not supported by viewer]
reset
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
clock
[Not supported by viewer]
\ 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 @@ + +
JKFlipFlop
[Not supported by viewer]
J
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
K
[Not supported by viewer]
\ 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 @@ + +
JKFlipFlop
Preset
Clear

[Not supported by viewer]
J
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
preset_n
[Not supported by viewer]
clear_n
[Not supported by viewer]
K
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Parallel
ToSerial
Converter
16To1

[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
load_n
[Not supported by viewer]
output
[Not supported by viewer]
data_bus[6]
[Not supported by viewer]
data_bus[5]
[Not supported by viewer]
data_bus[4]
[Not supported by viewer]
data_bus[7]
[Not supported by viewer]
data_bus[10]
[Not supported by viewer]
data_bus[9]
[Not supported by viewer]
data_bus[8]
[Not supported by viewer]
data_bus[11]
[Not supported by viewer]
data_bus[14]
[Not supported by viewer]
data_bus[13]
[Not supported by viewer]
data_bus[12]
[Not supported by viewer]
data_bus[15]
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Parallel
ToSerial
Converter
4To1

[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
load_n
[Not supported by viewer]
output
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Parallel
ToSerial
Converter
8To1

[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
load_n
[Not supported by viewer]
output
[Not supported by viewer]
data_bus[6]
[Not supported by viewer]
data_bus[5]
[Not supported by viewer]
data_bus[4]
[Not supported by viewer]
data_bus[7]
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Register16
[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
data_bus[6]
[Not supported by viewer]
data_bus[5]
[Not supported by viewer]
data_bus[4]
[Not supported by viewer]
data_bus[7]
[Not supported by viewer]
output_bus[4]
[Not supported by viewer]
output_bus[5]
[Not supported by viewer]
output_bus[6]
[Not supported by viewer]
output_bus[7]
[Not supported by viewer]
data_bus[10]
[Not supported by viewer]
data_bus[9]
[Not supported by viewer]
data_bus[8]
[Not supported by viewer]
data_bus[11]
[Not supported by viewer]
data_bus[14]
[Not supported by viewer]
data_bus[13]
[Not supported by viewer]
data_bus[12]
[Not supported by viewer]
data_bus[15]
[Not supported by viewer]
output_bus[8]
[Not supported by viewer]
output_bus[9]
[Not supported by viewer]
output_bus[10]
[Not supported by viewer]
output_bus[11]
[Not supported by viewer]
output_bus[12]
[Not supported by viewer]
output_bus[13]
[Not supported by viewer]
output_bus[14]
[Not supported by viewer]
output_bus[15]
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Register4
[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Register8
[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
data_bus[6]
[Not supported by viewer]
data_bus[5]
[Not supported by viewer]
data_bus[4]
[Not supported by viewer]
data_bus[7]
[Not supported by viewer]
output_bus[4]
[Not supported by viewer]
output_bus[5]
[Not supported by viewer]
output_bus[6]
[Not supported by viewer]
output_bus[7]
[Not supported by viewer]
\ 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 @@ + +
SRLatch
[Not supported by viewer]
set
[Not supported by viewer]
reset
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
\ 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 @@ + +
Serial
ToParallel
Converter
1To16
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[15]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
data
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus[4]
[Not supported by viewer]
output_bus[5]
[Not supported by viewer]
output_bus[6]
[Not supported by viewer]
output_bus[7]
[Not supported by viewer]
output_bus[8]
[Not supported by viewer]
output_bus[9]
[Not supported by viewer]
output_bus[10]
[Not supported by viewer]
output_bus[11]
[Not supported by viewer]
output_bus[12]
[Not supported by viewer]
output_bus[13]
[Not supported by viewer]
output_bus[14]
[Not supported by viewer]
\ 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 @@ + +
Serial
ToParallel
Converter
1To4

[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
data
[Not supported by viewer]
\ 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 @@ + +
Serial
ToParallel
Converter
1To8

[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[7]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
data
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus[4]
[Not supported by viewer]
output_bus[5]
[Not supported by viewer]
output_bus[6]
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Shift
Register16

[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[15]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
shift_load
[Not supported by viewer]
data_serial
[Not supported by viewer]
output_serial
[Not supported by viewer]
data_bus[6]
[Not supported by viewer]
data_bus[5]
[Not supported by viewer]
data_bus[4]
[Not supported by viewer]
data_bus[7]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus[4]
[Not supported by viewer]
output_bus[5]
[Not supported by viewer]
output_bus[6]
[Not supported by viewer]
data_bus[10]
[Not supported by viewer]
data_bus[9]
[Not supported by viewer]
data_bus[8]
[Not supported by viewer]
data_bus[11]
[Not supported by viewer]
data_bus[14]
[Not supported by viewer]
data_bus[13]
[Not supported by viewer]
data_bus[12]
[Not supported by viewer]
data_bus[15]
[Not supported by viewer]
output_bus[7]
[Not supported by viewer]
output_bus[8]
[Not supported by viewer]
output_bus[9]
[Not supported by viewer]
output_bus[10]
[Not supported by viewer]
output_bus[11]
[Not supported by viewer]
output_bus[12]
[Not supported by viewer]
output_bus[13]
[Not supported by viewer]
output_bus[14]
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Shift
Register4

[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
shift_load
[Not supported by viewer]
data_serial
[Not supported by viewer]
output_serial
[Not supported by viewer]
\ 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 @@ + +
data_bus[2]
[Not supported by viewer]
data_bus[1]
[Not supported by viewer]
Shift
Register8

[Not supported by viewer]
data_bus[0]
[Not supported by viewer]
output_bus[0]
[Not supported by viewer]
data_bus[3]
[Not supported by viewer]
data_bus
[Not supported by viewer]
output_bus[1]
[Not supported by viewer]
output_bus[2]
[Not supported by viewer]
output_bus[7]
[Not supported by viewer]
output_bus
[Not supported by viewer]
clock
[Not supported by viewer]
enable
[Not supported by viewer]
clear_n
[Not supported by viewer]
shift_load
[Not supported by viewer]
data_serial
[Not supported by viewer]
output_serial
[Not supported by viewer]
data_bus[6]
[Not supported by viewer]
data_bus[5]
[Not supported by viewer]
data_bus[4]
[Not supported by viewer]
data_bus[7]
[Not supported by viewer]
output_bus[3]
[Not supported by viewer]
output_bus[4]
[Not supported by viewer]
output_bus[5]
[Not supported by viewer]
output_bus[6]
[Not supported by viewer]
\ 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 @@ + +
TFlipFlop
[Not supported by viewer]
toggle
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
\ 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 @@ + +
TFlipFlop
Preset
Clear

[Not supported by viewer]
toggle
[Not supported by viewer]
clock
[Not supported by viewer]
output
[Not supported by viewer]
output_not
[Not supported by viewer]
preset_n
[Not supported by viewer]
clear_n
[Not supported by viewer]
\ 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 @@

Navigation

  • API Documentation
  • +
  • Changelog
  • +

    Table Of Contents

    @@ -172,6 +176,29 @@

    Signal

    Wire

    diff --git a/docs/_build/html/arithmetic.html b/docs/_build/html/arithmetic.html index bc7dba6..dff31b5 100644 --- a/docs/_build/html/arithmetic.html +++ b/docs/_build/html/arithmetic.html @@ -24,6 +24,8 @@ + + @@ -64,6 +66,8 @@

    Navigation

  • API Documentation
  • +
  • Changelog
  • +

    Table Of Contents

    diff --git a/docs/_build/html/changelog.html b/docs/_build/html/changelog.html new file mode 100644 index 0000000..b66d091 --- /dev/null +++ b/docs/_build/html/changelog.html @@ -0,0 +1,191 @@ + + + + + + + Changelog — Bitwise 0.1.1 documentation + + + + + + + + + + + + + + + + + + + +
    + + +
    +
    +
    + +
    +

    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
    • +
    +
    +
    +
    + + +
    +
    +
    +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/gate.html b/docs/_build/html/gate.html index 9640a56..8a96f4e 100644 --- a/docs/_build/html/gate.html +++ b/docs/_build/html/gate.html @@ -24,6 +24,8 @@ + + @@ -64,6 +66,8 @@

    Navigation

  • API Documentation
  • +
  • Changelog
  • +

    Table Of Contents

    diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 3902390..b655296 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -65,6 +65,8 @@

    Navigation

  • API Documentation
  • +
  • Changelog
  • +