|
| 1 | +struct LogicTable{N} <: AbstractArray{Logic, N} |
| 2 | + logic::Array{Logic, N} |
| 3 | + function LogicTable(l::Array{Logic}) |
| 4 | + any(i -> i != 9, size(l)) && |
| 5 | + throw(ArgumentError("Incorrect number of logic values are passed. A variable of type |
| 6 | +`LogicTable` must have nine entries corresponding to 9 logic levels")) |
| 7 | + new{ndims(l)}(l) |
| 8 | + end |
| 9 | +end |
| 10 | + |
| 11 | +Base.size(l::LogicTable) = size(l.logic) |
| 12 | + |
| 13 | +Base.axes(l::LogicTable) = axes(l.logic) |
| 14 | + |
| 15 | +getindex(s::LogicTable, l::Logic) = getindex(s.logic, get_logic_level(l)) |
| 16 | +function Base.getindex(s::LogicTable, i1::Logic, i2::Logic) |
| 17 | + getindex(s.logic, get_logic_level(i1), get_logic_level(i2)) |
| 18 | +end |
| 19 | +function Base.getindex(s::LogicTable, i1::Logic, i2::Logic, |
| 20 | + I::Logic...) |
| 21 | + getindex(s.logic, get_logic_level(i1), get_logic_level(i2), get_logic_level(I...)...) |
| 22 | +end |
| 23 | + |
| 24 | +getindex(s::LogicTable, l::Int) = getindex(s.logic, l) |
| 25 | +function getindex(s::LogicTable, i1::Int, i2::Int, I::Int...) |
| 26 | + getindex(s.logic, i1, i2, I...) |
| 27 | +end |
| 28 | + |
| 29 | +function Base.setindex!(A::LogicTable, x::Logic, i1::Int) |
| 30 | + setindex!(A.logic, x, i1) |
| 31 | +end |
| 32 | +function Base.setindex!(A::LogicTable, x::Logic, i1::Int, i2::Int, I::Int...) |
| 33 | + setindex!(A.logic, x, i1, i2, I...) |
| 34 | +end |
| 35 | + |
| 36 | +get_logic_level(l::LogicTable) = Int.(l.logic) |
| 37 | + |
1 | 38 | # AND gate
|
2 |
| -const AndTable = [ |
3 |
| - # U X F0 F1 Z W L H DC |
4 |
| - U U F0 U U U F0 U U # U |
5 |
| - U X F0 X X X F0 X X # X |
6 |
| - F0 F0 F0 F0 F0 F0 F0 F0 F0 # F0 |
7 |
| - U X F0 F1 X X F0 F1 X # F1 |
8 |
| - U X F0 X X X F0 X X # Z |
9 |
| - U X F0 X X X F0 X X # W |
10 |
| - F0 F0 F0 F0 F0 F0 F0 F0 F0 # L |
11 |
| - U X F0 F1 X X F0 F1 X # H |
12 |
| - U X F0 X X X F0 X X] # DC |
| 39 | +const AndTable = LogicTable([ |
| 40 | + # U X F0 F1 Z W L H DC |
| 41 | + U U F0 U U U F0 U U # U |
| 42 | + U X F0 X X X F0 X X # X |
| 43 | + F0 F0 F0 F0 F0 F0 F0 F0 F0 # F0 |
| 44 | + U X F0 F1 X X F0 F1 X # F1 |
| 45 | + U X F0 X X X F0 X X # Z |
| 46 | + U X F0 X X X F0 X X # W |
| 47 | + F0 F0 F0 F0 F0 F0 F0 F0 F0 # L |
| 48 | + U X F0 F1 X X F0 F1 X # H |
| 49 | + U X F0 X X X F0 X X]) # DC |
13 | 50 |
|
14 | 51 | function _and2(a::Logic, b::Logic)
|
15 |
| - AndTable[get_logic_level(a), get_logic_level(b)] |
| 52 | + AndTable[a, b] |
16 | 53 | end
|
17 | 54 | _and2(a::Number, b::Logic) = _and2(convert(Logic, a), b)
|
18 | 55 | _and2(a::Logic, b::Number) = _and2(a, convert(Logic, b))
|
|
29 | 66 | @register_symbolic _and(a, b)
|
30 | 67 |
|
31 | 68 | # NOT gate
|
32 |
| -const NotTable = [U, X, F1, F0, X, X, F1, F0, X] |
| 69 | +const NotTable = LogicTable([U, X, F1, F0, X, X, F1, F0, X]) |
33 | 70 |
|
34 |
| -_not(x::Logic) = NotTable[get_logic_level(x)] |
| 71 | +_not(x::Logic) = NotTable[x] |
35 | 72 | _not(x::Number) = _not(convert(Logic, x))
|
36 | 73 |
|
37 | 74 | @register_symbolic _not(x)
|
38 | 75 |
|
39 | 76 | # OR gate
|
40 |
| -const OrTable = [ |
41 |
| - # U X F0 F1 Z W L H DC |
42 |
| - U U U F1 U U U F1 U # U |
43 |
| - U X X F1 X X X F1 X # X |
44 |
| - U X F0 F1 X X F0 F1 X # F0 |
45 |
| - F1 F1 F1 F1 F1 F1 F1 F1 F1 # F1 |
46 |
| - U X X F1 X X X F1 X # Z |
47 |
| - U X X F1 X X X F1 X # W |
48 |
| - U X F0 F1 X X F0 F1 X # L |
49 |
| - F1 F1 F1 F1 F1 F1 F1 F1 F1 # H |
50 |
| - U X X F1 X X X F1 X] # DC |
| 77 | +const OrTable = LogicTable([ |
| 78 | + # U X F0 F1 Z W L H DC |
| 79 | + U U U F1 U U U F1 U # U |
| 80 | + U X X F1 X X X F1 X # X |
| 81 | + U X F0 F1 X X F0 F1 X # F0 |
| 82 | + F1 F1 F1 F1 F1 F1 F1 F1 F1 # F1 |
| 83 | + U X X F1 X X X F1 X # Z |
| 84 | + U X X F1 X X X F1 X # W |
| 85 | + U X F0 F1 X X F0 F1 X # L |
| 86 | + F1 F1 F1 F1 F1 F1 F1 F1 F1 # H |
| 87 | + U X X F1 X X X F1 X]) # DC |
51 | 88 |
|
52 | 89 | function _or2(a::Logic, b::Logic)
|
53 |
| - OrTable[get_logic_level(a), get_logic_level(b)] |
| 90 | + OrTable[a, b] |
54 | 91 | end
|
55 | 92 | _or2(a::Number, b::Logic) = _or2(convert(Logic, a), b)
|
56 | 93 | _or2(a::Logic, b::Number) = _or2(a, convert(Logic, b))
|
|
67 | 104 | @register_symbolic _or(a, b)
|
68 | 105 |
|
69 | 106 | # XOR gate
|
70 |
| -const XorTable = [ |
71 |
| - # U X F0 F1 Z W L H DC |
72 |
| - U U U U U U U U U # U |
73 |
| - U X X X X X X X X # X |
74 |
| - U X F0 F1 X X F0 F1 X # F0 |
75 |
| - U X F1 F0 X X F1 F0 X # F1 |
76 |
| - U X X X X X X X X # Z |
77 |
| - U X X X X X X X X # W |
78 |
| - U X F0 F1 X X F0 F1 X # L |
79 |
| - U X F1 F0 X X F1 F0 X # H |
80 |
| - U X X X X X X X X] # DC |
| 107 | +const XorTable = LogicTable([ |
| 108 | + # U X F0 F1 Z W L H DC |
| 109 | + U U U U U U U U U # U |
| 110 | + U X X X X X X X X # X |
| 111 | + U X F0 F1 X X F0 F1 X # F0 |
| 112 | + U X F1 F0 X X F1 F0 X # F1 |
| 113 | + U X X X X X X X X # Z |
| 114 | + U X X X X X X X X # W |
| 115 | + U X F0 F1 X X F0 F1 X # L |
| 116 | + U X F1 F0 X X F1 F0 X # H |
| 117 | + U X X X X X X X X]) # DC |
81 | 118 |
|
82 | 119 | function _xor2(a::Logic, b::Logic)
|
83 |
| - XorTable[get_logic_level(a), get_logic_level(b)] |
| 120 | + XorTable[a, b] |
84 | 121 | end
|
85 | 122 | _xor2(a::Number, b::Logic) = _xor2(convert(Logic, a), b)
|
86 | 123 | _xor2(a::Logic, b::Number) = _xor2(a, convert(Logic, b))
|
|
0 commit comments