LIBRARY
Logical.Tests.LogicGates ​
Validation test for logic gate blocks: And, Or, Xor, Nand, Nor.
Uses a Ramp source with height=4, duration=4: ramp(t) = offset + t. Two GreaterThreshold blocks convert ramp to Boolean by comparing against thresholds at -100 (always true) or 100 (always false).
Four test cases cover the full truth table by overriding thresholds:
TT (both true): bool1.threshold=-100, bool2.threshold=-100
TF (true,false): bool1.threshold=-100, bool2.threshold=100
FT (false,true): bool1.threshold=100, bool2.threshold=-100
FF (both false): bool1.threshold=100, bool2.threshold=100
Usage ​
BlockComponents.Logical.Tests.LogicGates()
Behavior ​
Source ​
dyad
"""
Validation test for logic gate blocks: And, Or, Xor, Nand, Nor.
Uses a Ramp source with height=4, duration=4: ramp(t) = offset + t.
Two GreaterThreshold blocks convert ramp to Boolean by comparing against
thresholds at -100 (always true) or 100 (always false).
Four test cases cover the full truth table by overriding thresholds:
- TT (both true): bool1.threshold=-100, bool2.threshold=-100
- TF (true,false): bool1.threshold=-100, bool2.threshold=100
- FT (false,true): bool1.threshold=100, bool2.threshold=-100
- FF (both false): bool1.threshold=100, bool2.threshold=100
"""
test component LogicGates
"Ramp: ramp(t) = offset + t for t in [0, 4]"
ramp = BlockComponents.Sources.Ramp(height = 4, duration = 4, offset = 0) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 230, "x2": 120, "y2": 330, "rot": 0}
},
"tags": []
}
}
"Boolean input 1: threshold=-100 means always true by default"
bool1 = BlockComponents.Logical.GreaterThreshold(threshold = -100.0) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 161, "y1": 230, "x2": 261, "y2": 330, "rot": 0}
},
"tags": []
}
}
"Boolean input 2: threshold=-100 means always true by default"
bool2 = BlockComponents.Logical.GreaterThreshold(threshold = -100.0) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 161, "y1": 406, "x2": 261, "y2": 506, "rot": 0}
},
"tags": []
}
}
"Logic gates under test"
and1 = BlockComponents.Logical.And() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 380, "x2": 411, "y2": 480, "rot": 0}
},
"tags": []
}
}
or1 = BlockComponents.Logical.Or() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 500, "x2": 411, "y2": 600, "rot": 0}
},
"tags": []
}
}
xor1 = BlockComponents.Logical.Xor() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 320, "y1": 20, "x2": 420, "y2": 120, "rot": 0}
},
"tags": []
}
}
nand1 = BlockComponents.Logical.Nand() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 140, "x2": 411, "y2": 240, "rot": 0}
},
"tags": []
}
}
nor1 = BlockComponents.Logical.Nor() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 260, "x2": 411, "y2": 360, "rot": 0}
},
"tags": []
}
}
relations
# Boolean signal generation from ramp
connect(ramp.y, bool1.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(ramp.y, bool2.u) {
"Dyad": {
"edges": [{"S": 1, "M": [], "E": -1}, {"S": -1, "M": [{"x": 140, "y": 456}], "E": 2}],
"junctions": [{"x": 140, "y": 280}],
"renderStyle": "standard"
}
}
# All gates: bool1 → u1, bool2 → u2
connect(bool1.y, and1.u1) {
"Dyad": {
"edges": [
{"S": 1, "M": [], "E": -1},
{"S": -1, "M": [], "E": -2},
{"S": -2, "M": [], "E": 2}
],
"junctions": [{"x": 291, "y": 280}, {"x": 291, "y": 400}],
"renderStyle": "standard"
}
}
connect(bool2.y, and1.u2) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(bool1.y, or1.u1) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 291, "y": 280}, {"x": 291, "y": 520}], "E": 2}],
"renderStyle": "standard"
}
}
connect(bool2.y, or1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [], "E": -1}, {"S": -1, "M": [{"x": 281, "y": 576}], "E": 2}],
"junctions": [{"x": 281, "y": 456}],
"renderStyle": "standard"
}
}
connect(bool1.y, xor1.u1) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 291, "y": 280}, {"x": 291, "y": 40}], "E": 2}],
"renderStyle": "standard"
}
}
connect(bool2.y, xor1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 281, "y": 456}, {"x": 281, "y": 96}], "E": 2}],
"renderStyle": "standard"
}
}
connect(bool1.y, nand1.u1) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 291, "y": 280}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 291, "y": 160}],
"renderStyle": "standard"
}
}
connect(bool2.y, nand1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 281, "y": 456}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 281, "y": 216}],
"renderStyle": "standard"
}
}
connect(bool1.y, nor1.u1) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(bool2.y, nor1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 281, "y": 456}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 281, "y": 336}],
"renderStyle": "standard"
}
}
metadata {
"Dyad": {
"icons": {"default": "dyad://BlockComponents/Example.svg"},
"tests": {
"TT": {
"stop": 1,
"params": {"bool1.threshold": -100, "bool2.threshold": -100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
},
"TF": {
"stop": 1,
"params": {"bool1.threshold": -100, "bool2.threshold": 100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
},
"FT": {
"stop": 1,
"params": {"bool1.threshold": 100, "bool2.threshold": -100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
},
"FF": {
"stop": 1,
"params": {"bool1.threshold": 100, "bool2.threshold": 100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
}
}
}
}
endFlattened Source
dyad
"""
Validation test for logic gate blocks: And, Or, Xor, Nand, Nor.
Uses a Ramp source with height=4, duration=4: ramp(t) = offset + t.
Two GreaterThreshold blocks convert ramp to Boolean by comparing against
thresholds at -100 (always true) or 100 (always false).
Four test cases cover the full truth table by overriding thresholds:
- TT (both true): bool1.threshold=-100, bool2.threshold=-100
- TF (true,false): bool1.threshold=-100, bool2.threshold=100
- FT (false,true): bool1.threshold=100, bool2.threshold=-100
- FF (both false): bool1.threshold=100, bool2.threshold=100
"""
test component LogicGates
"Ramp: ramp(t) = offset + t for t in [0, 4]"
ramp = BlockComponents.Sources.Ramp(height = 4, duration = 4, offset = 0) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 230, "x2": 120, "y2": 330, "rot": 0}
},
"tags": []
}
}
"Boolean input 1: threshold=-100 means always true by default"
bool1 = BlockComponents.Logical.GreaterThreshold(threshold = -100.0) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 161, "y1": 230, "x2": 261, "y2": 330, "rot": 0}
},
"tags": []
}
}
"Boolean input 2: threshold=-100 means always true by default"
bool2 = BlockComponents.Logical.GreaterThreshold(threshold = -100.0) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 161, "y1": 406, "x2": 261, "y2": 506, "rot": 0}
},
"tags": []
}
}
"Logic gates under test"
and1 = BlockComponents.Logical.And() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 380, "x2": 411, "y2": 480, "rot": 0}
},
"tags": []
}
}
or1 = BlockComponents.Logical.Or() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 500, "x2": 411, "y2": 600, "rot": 0}
},
"tags": []
}
}
xor1 = BlockComponents.Logical.Xor() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 320, "y1": 20, "x2": 420, "y2": 120, "rot": 0}
},
"tags": []
}
}
nand1 = BlockComponents.Logical.Nand() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 140, "x2": 411, "y2": 240, "rot": 0}
},
"tags": []
}
}
nor1 = BlockComponents.Logical.Nor() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 311, "y1": 260, "x2": 411, "y2": 360, "rot": 0}
},
"tags": []
}
}
relations
# Boolean signal generation from ramp
connect(ramp.y, bool1.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(ramp.y, bool2.u) {
"Dyad": {
"edges": [{"S": 1, "M": [], "E": -1}, {"S": -1, "M": [{"x": 140, "y": 456}], "E": 2}],
"junctions": [{"x": 140, "y": 280}],
"renderStyle": "standard"
}
}
# All gates: bool1 → u1, bool2 → u2
connect(bool1.y, and1.u1) {
"Dyad": {
"edges": [
{"S": 1, "M": [], "E": -1},
{"S": -1, "M": [], "E": -2},
{"S": -2, "M": [], "E": 2}
],
"junctions": [{"x": 291, "y": 280}, {"x": 291, "y": 400}],
"renderStyle": "standard"
}
}
connect(bool2.y, and1.u2) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(bool1.y, or1.u1) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 291, "y": 280}, {"x": 291, "y": 520}], "E": 2}],
"renderStyle": "standard"
}
}
connect(bool2.y, or1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [], "E": -1}, {"S": -1, "M": [{"x": 281, "y": 576}], "E": 2}],
"junctions": [{"x": 281, "y": 456}],
"renderStyle": "standard"
}
}
connect(bool1.y, xor1.u1) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 291, "y": 280}, {"x": 291, "y": 40}], "E": 2}],
"renderStyle": "standard"
}
}
connect(bool2.y, xor1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 281, "y": 456}, {"x": 281, "y": 96}], "E": 2}],
"renderStyle": "standard"
}
}
connect(bool1.y, nand1.u1) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 291, "y": 280}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 291, "y": 160}],
"renderStyle": "standard"
}
}
connect(bool2.y, nand1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 281, "y": 456}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 281, "y": 216}],
"renderStyle": "standard"
}
}
connect(bool1.y, nor1.u1) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(bool2.y, nor1.u2) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 281, "y": 456}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 281, "y": 336}],
"renderStyle": "standard"
}
}
metadata {
"Dyad": {
"icons": {"default": "dyad://BlockComponents/Example.svg"},
"tests": {
"TT": {
"stop": 1,
"params": {"bool1.threshold": -100, "bool2.threshold": -100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
},
"TF": {
"stop": 1,
"params": {"bool1.threshold": -100, "bool2.threshold": 100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
},
"FT": {
"stop": 1,
"params": {"bool1.threshold": 100, "bool2.threshold": -100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
},
"FF": {
"stop": 1,
"params": {"bool1.threshold": 100, "bool2.threshold": 100},
"expect": {
"signals": ["bool1.y", "bool2.y", "and1.y", "or1.y", "xor1.y", "nand1.y", "nor1.y"]
}
}
}
}
}
endTest Cases ​
Test Case TT ​
julia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltTest Case TF ​
julia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltTest Case FT ​
julia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltTest Case FF ​
julia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
pltjulia
plt