logicuit 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -2
- data/README.md +161 -14
- data/Rakefile +12 -1
- data/Steepfile +6 -0
- data/lib/logicuit/array_as_signal_group.rb +1 -1
- data/lib/logicuit/circuits/combinational/full_adder.rb +6 -2
- data/lib/logicuit/circuits/combinational/full_adder_4bit.rb +6 -0
- data/lib/logicuit/circuits/combinational/half_adder.rb +4 -0
- data/lib/logicuit/circuits/combinational/multiplexer_2to1.rb +5 -1
- data/lib/logicuit/circuits/combinational/multiplexer_4to1.rb +5 -1
- data/lib/logicuit/circuits/sequential/d_flip_flop.rb +4 -0
- data/lib/logicuit/circuits/sequential/one_bit_cpu.rb +4 -0
- data/lib/logicuit/circuits/sequential/program_counter.rb +10 -4
- data/lib/logicuit/circuits/sequential/register_4bit.rb +6 -0
- data/lib/logicuit/circuits/td4/cpu.rb +11 -2
- data/lib/logicuit/circuits/td4/decoder.rb +9 -5
- data/lib/logicuit/circuits/td4/rom.rb +6 -4
- data/lib/logicuit/dsl.rb +47 -18
- data/lib/logicuit/gates/and.rb +5 -1
- data/lib/logicuit/gates/nand.rb +5 -1
- data/lib/logicuit/gates/not.rb +4 -0
- data/lib/logicuit/gates/or.rb +5 -1
- data/lib/logicuit/gates/xor.rb +5 -1
- data/lib/logicuit/runner.rb +1 -1
- data/lib/logicuit/signals/clock.rb +1 -1
- data/lib/logicuit/signals/signal.rb +12 -0
- data/lib/logicuit/signals/signal_group.rb +7 -1
- data/lib/logicuit/version.rb +1 -1
- data/sig/generated/logicuit/circuits/combinational/full_adder.rbs +20 -0
- data/sig/generated/logicuit/circuits/combinational/full_adder_4bit.rbs +38 -0
- data/sig/generated/logicuit/circuits/combinational/half_adder.rbs +18 -0
- data/sig/generated/logicuit/circuits/combinational/multiplexer_2to1.rbs +18 -0
- data/sig/generated/logicuit/circuits/combinational/multiplexer_4to1.rbs +24 -0
- data/sig/generated/logicuit/circuits/sequential/d_flip_flop.rbs +14 -0
- data/sig/generated/logicuit/circuits/sequential/one_bit_cpu.rbs +16 -0
- data/sig/generated/logicuit/circuits/sequential/program_counter.rbs +28 -0
- data/sig/generated/logicuit/circuits/sequential/register_4bit.rbs +28 -0
- data/sig/generated/logicuit/circuits/td4/cpu.rbs +28 -0
- data/sig/generated/logicuit/circuits/td4/decoder.rbs +32 -0
- data/sig/generated/logicuit/circuits/td4/rom.rbs +36 -0
- data/sig/generated/logicuit/gates/and.rbs +14 -0
- data/sig/generated/logicuit/gates/nand.rbs +14 -0
- data/sig/generated/logicuit/gates/not.rbs +12 -0
- data/sig/generated/logicuit/gates/or.rbs +14 -0
- data/sig/generated/logicuit/gates/xor.rbs +14 -0
- data/sig/logicuit/array_as_signal_group.rbs +11 -0
- data/sig/logicuit/dsl.rbs +35 -0
- data/sig/logicuit/runner.rbs +4 -0
- data/sig/logicuit/signals/clock.rbs +30 -0
- data/sig/logicuit/signals/signal.rbs +32 -0
- data/sig/logicuit/signals/signal_group.rbs +20 -0
- data/sig/logicuit/version.rbs +3 -0
- metadata +28 -4
- data/sig/logicuit.rbs +0 -4
data/lib/logicuit/dsl.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# steep:ignore:start
|
4
|
+
|
3
5
|
# Logicuit module
|
4
6
|
module Logicuit
|
5
7
|
# base class for all gates and circuits
|
@@ -26,7 +28,9 @@ module Logicuit
|
|
26
28
|
|
27
29
|
def self.inputs(*args, **kwargs)
|
28
30
|
# define getter methods for inputs
|
29
|
-
|
31
|
+
args.each do |arg|
|
32
|
+
attr_reader(arg) unless instance_methods.include?(arg)
|
33
|
+
end
|
30
34
|
|
31
35
|
# define initializer for inputs
|
32
36
|
define_method(:inputs) do |*instance_method_args|
|
@@ -54,7 +58,9 @@ module Logicuit
|
|
54
58
|
|
55
59
|
def self.outputs(*args, **kwargs)
|
56
60
|
# define getter methods for outputs
|
57
|
-
|
61
|
+
(args + kwargs.keys).each do |arg|
|
62
|
+
attr_reader(arg) unless instance_methods.include?(arg)
|
63
|
+
end
|
58
64
|
|
59
65
|
# define initializer for outputs
|
60
66
|
define_method(:outputs) do
|
@@ -71,19 +77,13 @@ module Logicuit
|
|
71
77
|
return unless initialized
|
72
78
|
|
73
79
|
kwargs.each do |output, evaluator|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
end
|
82
|
-
if @inputs_as_bool_struct.new(*e_args).instance_exec(&evaluator)
|
83
|
-
signal.on
|
84
|
-
else
|
85
|
-
signal.off
|
86
|
-
end
|
80
|
+
ret = if override_args.empty?
|
81
|
+
instance_exec(&evaluator)
|
82
|
+
else
|
83
|
+
o = @inputs_as_bool_struct.new(*override_args)
|
84
|
+
o.instance_exec(&evaluator)
|
85
|
+
end
|
86
|
+
send(output).send(ret.current ? :on : :off)
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
@@ -91,7 +91,7 @@ module Logicuit
|
|
91
91
|
def self.assembling(&block)
|
92
92
|
define_method(:assembling) do
|
93
93
|
ret = instance_eval(&block)
|
94
|
-
ret.each { @components <<
|
94
|
+
ret.each { @components << _1 } if ret.is_a?(Array)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
@@ -132,8 +132,10 @@ module Logicuit
|
|
132
132
|
headers.size == values.size
|
133
133
|
end.map do |values|
|
134
134
|
array = [values]
|
135
|
-
while array.any? {
|
136
|
-
target_index = array.find_index {
|
135
|
+
while array.any? { _1.any? { |v| v == :any } }
|
136
|
+
target_index = array.find_index { _1.any? { |v| v == :any } }
|
137
|
+
next if target_index.nil? # avoid rbs error...
|
138
|
+
|
137
139
|
target = array[target_index]
|
138
140
|
prop_index = target.find_index { |v| v == :any }
|
139
141
|
array.delete_at(target_index)
|
@@ -151,8 +153,35 @@ module Logicuit
|
|
151
153
|
end
|
152
154
|
end
|
153
155
|
|
156
|
+
def self.verify_against_truth_table
|
157
|
+
new.truth_table.each do |row|
|
158
|
+
args = row.values_at(*new.input_targets).map { _1 ? 1 : 0 }
|
159
|
+
subject = new(*args)
|
160
|
+
|
161
|
+
previous_values = row.reject do |_k, v|
|
162
|
+
v == :clock
|
163
|
+
end.keys.reduce({}) { |acc, key| acc.merge(key => subject.send(key).current) }
|
164
|
+
|
165
|
+
Signals::Clock.tick if row.values.find :clock
|
166
|
+
|
167
|
+
row.each do |key, value|
|
168
|
+
next if value == :clock
|
169
|
+
|
170
|
+
if value.is_a?(Array) && value.first == :ref
|
171
|
+
expected = previous_values[value.last]
|
172
|
+
|
173
|
+
raise "#{self}.new(#{args.join(", ")}).#{key} should be #{expected ? 1 : 0}" unless expected == subject.send(key).current
|
174
|
+
else
|
175
|
+
raise "#{self}.new(#{args.join(", ")}).#{key} should be #{value ? 1 : 0}" unless value == subject.send(key).current
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
154
181
|
def self.run(opts = {})
|
155
182
|
::Logicuit.run(new, **opts)
|
156
183
|
end
|
157
184
|
end
|
158
185
|
end
|
186
|
+
|
187
|
+
# steep:ignore:end
|
data/lib/logicuit/gates/and.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Logicuit
|
4
6
|
module Gates
|
5
7
|
# AND gate
|
@@ -10,9 +12,11 @@ module Logicuit
|
|
10
12
|
(B)-| |
|
11
13
|
DIAGRAM
|
12
14
|
|
15
|
+
attr_reader :a, :b, :y #: Signals::Signal
|
16
|
+
|
13
17
|
inputs :a, :b
|
14
18
|
|
15
|
-
outputs y: -> { a
|
19
|
+
outputs y: -> { a & b }
|
16
20
|
|
17
21
|
truth_table <<~TRUTH_TABLE
|
18
22
|
| A | B | Y |
|
data/lib/logicuit/gates/nand.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Logicuit
|
4
6
|
module Gates
|
5
7
|
# NAND gate
|
@@ -10,9 +12,11 @@ module Logicuit
|
|
10
12
|
(B)-| |
|
11
13
|
DIAGRAM
|
12
14
|
|
15
|
+
attr_reader :a, :b, :y #: Signals::Signal
|
16
|
+
|
13
17
|
inputs :a, :b
|
14
18
|
|
15
|
-
outputs y: -> { !(a
|
19
|
+
outputs y: -> { !(a & b) }
|
16
20
|
|
17
21
|
truth_table <<~TRUTH_TABLE
|
18
22
|
| A | B | Y |
|
data/lib/logicuit/gates/not.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Logicuit
|
4
6
|
module Gates
|
5
7
|
# NOT gate
|
@@ -8,6 +10,8 @@ module Logicuit
|
|
8
10
|
(A)-|NOT|-(Y)
|
9
11
|
DIAGRAM
|
10
12
|
|
13
|
+
attr_reader :a, :y #: Signals::Signal
|
14
|
+
|
11
15
|
inputs :a
|
12
16
|
|
13
17
|
outputs y: -> { !a }
|
data/lib/logicuit/gates/or.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Logicuit
|
4
6
|
module Gates
|
5
7
|
# OR gate
|
@@ -10,9 +12,11 @@ module Logicuit
|
|
10
12
|
(B)-| |
|
11
13
|
DIAGRAM
|
12
14
|
|
15
|
+
attr_reader :a, :b, :y #: Signals::Signal
|
16
|
+
|
13
17
|
inputs :a, :b
|
14
18
|
|
15
|
-
outputs y: -> { a
|
19
|
+
outputs y: -> { a | b }
|
16
20
|
|
17
21
|
truth_table <<~TRUTH_TABLE
|
18
22
|
| A | B | Y |
|
data/lib/logicuit/gates/xor.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rbs_inline: enabled
|
4
|
+
|
3
5
|
module Logicuit
|
4
6
|
module Gates
|
5
7
|
# XOR gate
|
@@ -10,9 +12,11 @@ module Logicuit
|
|
10
12
|
(B)-| |
|
11
13
|
DIAGRAM
|
12
14
|
|
15
|
+
attr_reader :a, :b, :y #: Signals::Signal
|
16
|
+
|
13
17
|
inputs :a, :b
|
14
18
|
|
15
|
-
outputs y: -> { (a
|
19
|
+
outputs y: -> { (a & !b) | (!a & b) }
|
16
20
|
|
17
21
|
truth_table <<~TRUTH_TABLE
|
18
22
|
| A | B | Y |
|
data/lib/logicuit/runner.rb
CHANGED
@@ -16,7 +16,7 @@ module Logicuit
|
|
16
16
|
# Call the `evaluate` method for all components.
|
17
17
|
# However, the input argument values should be bound to the values at the time `tick` is called.
|
18
18
|
@downstreams.map do |component|
|
19
|
-
args = component.input_targets.map { |input| component.
|
19
|
+
args = component.input_targets.map { |input| Signal.new(component.send(input).current) }
|
20
20
|
-> { component.evaluate(*args) }
|
21
21
|
end.each(&:call)
|
22
22
|
end
|
@@ -41,6 +41,18 @@ module Logicuit
|
|
41
41
|
current ? "1" : "0"
|
42
42
|
end
|
43
43
|
|
44
|
+
def &(other)
|
45
|
+
Signal.new(current && other.current)
|
46
|
+
end
|
47
|
+
|
48
|
+
def |(other)
|
49
|
+
Signal.new(current || other.current)
|
50
|
+
end
|
51
|
+
|
52
|
+
def !
|
53
|
+
Signal.new(!current)
|
54
|
+
end
|
55
|
+
|
44
56
|
private
|
45
57
|
|
46
58
|
def propagate_current
|
@@ -19,7 +19,13 @@ module Logicuit
|
|
19
19
|
alias >> connects_to
|
20
20
|
|
21
21
|
def to_s
|
22
|
-
signals.map {
|
22
|
+
signals.map { _1.current ? "1" : "0" }.join
|
23
|
+
end
|
24
|
+
|
25
|
+
def set(vals)
|
26
|
+
vals.split("").zip(signals).each do |v, o|
|
27
|
+
v == "1" ? o&.on : o&.off
|
28
|
+
end
|
23
29
|
end
|
24
30
|
end
|
25
31
|
end
|
data/lib/logicuit/version.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/combinational/full_adder.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Combinational
|
6
|
+
# FullAdder class
|
7
|
+
class FullAdder < DSL
|
8
|
+
attr_reader cin: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader a: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader b: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader s: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader c: Signals::Signal
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/combinational/full_adder_4bit.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Combinational
|
6
|
+
# FullAdder class
|
7
|
+
class FullAdder4bit < DSL
|
8
|
+
attr_reader cin: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader a0: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader b0: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader a1: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader b1: Signals::Signal
|
17
|
+
|
18
|
+
attr_reader a2: Signals::Signal
|
19
|
+
|
20
|
+
attr_reader b2: Signals::Signal
|
21
|
+
|
22
|
+
attr_reader a3: Signals::Signal
|
23
|
+
|
24
|
+
attr_reader b3: Signals::Signal
|
25
|
+
|
26
|
+
attr_reader s0: Signals::Signal
|
27
|
+
|
28
|
+
attr_reader s1: Signals::Signal
|
29
|
+
|
30
|
+
attr_reader s2: Signals::Signal
|
31
|
+
|
32
|
+
attr_reader s3: Signals::Signal
|
33
|
+
|
34
|
+
attr_reader c: Signals::Signal
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/combinational/half_adder.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Combinational
|
6
|
+
# HalfAdder class
|
7
|
+
class HalfAdder < DSL
|
8
|
+
attr_reader a: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader b: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader c: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader s: Signals::Signal
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/combinational/multiplexer_2to1.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Combinational
|
6
|
+
# A Multiplexer with 2 inputs and 1 output
|
7
|
+
class Multiplexer2to1 < DSL
|
8
|
+
attr_reader c0: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader c1: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader a: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader y: Signals::Signal
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/combinational/multiplexer_4to1.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Combinational
|
6
|
+
# A Multiplexer with 4 inputs and 1 output
|
7
|
+
class Multiplexer4to1 < DSL
|
8
|
+
attr_reader c0: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader c1: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader c2: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader c3: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader b: Signals::Signal
|
17
|
+
|
18
|
+
attr_reader a: Signals::Signal
|
19
|
+
|
20
|
+
attr_reader y: Signals::Signal
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/sequential/d_flip_flop.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Sequential
|
6
|
+
# D Flip-Flop
|
7
|
+
class DFlipFlop < DSL
|
8
|
+
attr_reader d: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader q: Signals::Signal
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/sequential/one_bit_cpu.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Sequential
|
6
|
+
# 1 bit CPU with a Multiplexer
|
7
|
+
# Input A is H, MOV A,A
|
8
|
+
# Input A is L, NOT A
|
9
|
+
class OneBitCpu < DSL
|
10
|
+
attr_reader a: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader y: Signals::Signal
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/sequential/program_counter.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Sequential
|
6
|
+
# Program Counter
|
7
|
+
class ProgramCounter < DSL
|
8
|
+
attr_reader a: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader b: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader c: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader d: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader ld: Signals::Signal
|
17
|
+
|
18
|
+
attr_reader qa: Signals::Signal
|
19
|
+
|
20
|
+
attr_reader qb: Signals::Signal
|
21
|
+
|
22
|
+
attr_reader qc: Signals::Signal
|
23
|
+
|
24
|
+
attr_reader qd: Signals::Signal
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/sequential/register_4bit.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Sequential
|
6
|
+
# 4 bit register
|
7
|
+
class Register4bit < DSL
|
8
|
+
attr_reader a: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader b: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader c: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader d: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader ld: Signals::Signal
|
17
|
+
|
18
|
+
attr_reader qa: Signals::Signal
|
19
|
+
|
20
|
+
attr_reader qb: Signals::Signal
|
21
|
+
|
22
|
+
attr_reader qc: Signals::Signal
|
23
|
+
|
24
|
+
attr_reader qd: Signals::Signal
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/td4/cpu.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Td4
|
6
|
+
# TD4 CPU
|
7
|
+
class Cpu < DSL
|
8
|
+
attr_reader in0: untyped
|
9
|
+
|
10
|
+
attr_reader in1: untyped
|
11
|
+
|
12
|
+
attr_reader in2: untyped
|
13
|
+
|
14
|
+
attr_reader in3: untyped
|
15
|
+
|
16
|
+
attr_reader led1: untyped
|
17
|
+
|
18
|
+
attr_reader led2: untyped
|
19
|
+
|
20
|
+
attr_reader led3: untyped
|
21
|
+
|
22
|
+
attr_reader led4: untyped
|
23
|
+
|
24
|
+
def to_s: () -> untyped
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/td4/decoder.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Td4
|
6
|
+
# Decoder class
|
7
|
+
class Decoder < DSL
|
8
|
+
attr_reader op3: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader op2: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader op1: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader op0: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader c_flag: Signals::Signal
|
17
|
+
|
18
|
+
attr_reader sel_b: Signals::Signal
|
19
|
+
|
20
|
+
attr_reader sel_a: Signals::Signal
|
21
|
+
|
22
|
+
attr_reader ld0: Signals::Signal
|
23
|
+
|
24
|
+
attr_reader ld1: Signals::Signal
|
25
|
+
|
26
|
+
attr_reader ld2: Signals::Signal
|
27
|
+
|
28
|
+
attr_reader ld3: Signals::Signal
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Generated from lib/logicuit/circuits/td4/rom.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Circuits
|
5
|
+
module Td4
|
6
|
+
# Timer
|
7
|
+
class Rom < DSL
|
8
|
+
attr_reader a3: Signals::Signal
|
9
|
+
|
10
|
+
attr_reader a2: Signals::Signal
|
11
|
+
|
12
|
+
attr_reader a1: Signals::Signal
|
13
|
+
|
14
|
+
attr_reader a0: Signals::Signal
|
15
|
+
|
16
|
+
attr_reader d7: Signals::Signal
|
17
|
+
|
18
|
+
attr_reader d6: Signals::Signal
|
19
|
+
|
20
|
+
attr_reader d5: Signals::Signal
|
21
|
+
|
22
|
+
attr_reader d4: Signals::Signal
|
23
|
+
|
24
|
+
attr_reader d3: Signals::Signal
|
25
|
+
|
26
|
+
attr_reader d2: Signals::Signal
|
27
|
+
|
28
|
+
attr_reader d1: Signals::Signal
|
29
|
+
|
30
|
+
attr_reader d0: Signals::Signal
|
31
|
+
|
32
|
+
def evaluate: () -> untyped
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Generated from lib/logicuit/gates/nand.rb with RBS::Inline
|
2
|
+
|
3
|
+
module Logicuit
|
4
|
+
module Gates
|
5
|
+
# NAND gate
|
6
|
+
class Nand < DSL
|
7
|
+
attr_reader a: Signals::Signal
|
8
|
+
|
9
|
+
attr_reader b: Signals::Signal
|
10
|
+
|
11
|
+
attr_reader y: Signals::Signal
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Logicuit module
|
2
|
+
module Logicuit
|
3
|
+
# Treats Array#>> as SignalGroup#>> for the purpose of connecting signals
|
4
|
+
module ArrayAsSignalGroup
|
5
|
+
def >>: (untyped other) -> void
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class Array[unchecked out T]
|
10
|
+
def >>: (untyped other) -> void
|
11
|
+
end
|