first successful simulation!
This commit is contained in:
parent
00a41cd614
commit
0e05fa0241
1 changed files with 53 additions and 8 deletions
61
src/main.zig
61
src/main.zig
|
@ -26,11 +26,11 @@ pub fn main() !void {
|
|||
var or6_inputs = [_]*Signal{ &battery2.output, &or3.output };
|
||||
var or6 = Or{ .inputs = &or6_inputs, .arithmetic_mode = true };
|
||||
var and1_inputs = [_]*Signal{ &battery3.output, &or6.output };
|
||||
var and1 = And{ .inputs = &and1_inputs };
|
||||
var and1 = And{ .inputs = &and1_inputs, .arithmetic_mode = true };
|
||||
var or7_inputs = [_]*Signal{ &battery2.output, &or4.output };
|
||||
var or7 = Or{ .inputs = &or7_inputs, .arithmetic_mode = true };
|
||||
var and2_inputs = [_]*Signal{ &battery3.output, &or7.output };
|
||||
var and2 = And{ .inputs = &and2_inputs };
|
||||
var and2 = And{ .inputs = &and2_inputs, .arithmetic_mode = true };
|
||||
var or8_inputs = [_]*Signal{ &battery2.output, &or5.output };
|
||||
var or8 = Or{ .inputs = &or8_inputs, .arithmetic_mode = true };
|
||||
|
||||
|
@ -51,7 +51,10 @@ pub fn main() !void {
|
|||
or5.process();
|
||||
or8.process();
|
||||
|
||||
std.debug.print("{}\n{}\n{}\n{}\n", .{ input, or6.output, or7.output, or8.output });
|
||||
std.debug.print("{}\n{}\n\n", .{ or1.output, or2.output });
|
||||
std.debug.print("{}\n{}\n{}\n\n", .{ or3.output, or4.output, or5.output });
|
||||
std.debug.print("{}\n{}\n{}\n{}\n{}\n\n", .{ or6.output, and1.output, or7.output, and2.output, or8.output });
|
||||
// std.debug.print("{}\n{}\n{}\n{}\n", .{ input, or6.output, or7.output, or8.output });
|
||||
}
|
||||
|
||||
pub const Component = struct {
|
||||
|
@ -150,7 +153,7 @@ pub const Not = struct {
|
|||
self.output.digital = self.input.digital;
|
||||
self.output.analog = self.input.analog;
|
||||
}
|
||||
self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
|
||||
self.output.analog = std.math.clamp(self.output.analog, -1.0, 1.0);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -180,13 +183,34 @@ pub const And = struct {
|
|||
for (self.inputs[1..]) |input| {
|
||||
// self.output.digital = self.output.digital and input.digital;
|
||||
self.output.digital = 0;
|
||||
self.output.analog = @min(self.output.analog, input.analog);
|
||||
// self.output.analog = @min(self.output.analog, input.analog);
|
||||
self.output.analog = switch (std.math.order(@abs(self.output.analog), @abs(input.analog))) {
|
||||
.lt => self.output.analog,
|
||||
.eq => @min(self.output.analog, input.analog), // TODO what does this *actually* do?
|
||||
.gt => input.analog,
|
||||
};
|
||||
}
|
||||
}
|
||||
self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
|
||||
self.output.analog = std.math.clamp(self.output.analog, -1.0, 1.0);
|
||||
}
|
||||
};
|
||||
|
||||
test "min" {
|
||||
var a = Signal{ .analog = 0.0 };
|
||||
var b = Signal{ .analog = 1.0 };
|
||||
|
||||
var inputs = [_]*Signal{ &a, &b };
|
||||
var and1 = And{ .inputs = &inputs };
|
||||
|
||||
and1.process();
|
||||
try std.testing.expectEqual(0.0, and1.output.analog);
|
||||
|
||||
a.analog = -0.5;
|
||||
b.analog = -0.2;
|
||||
and1.process();
|
||||
try std.testing.expectEqual(-0.2, and1.output.analog);
|
||||
}
|
||||
|
||||
pub const Or = struct {
|
||||
// component: Component,
|
||||
|
||||
|
@ -213,9 +237,30 @@ pub const Or = struct {
|
|||
for (self.inputs[1..]) |input| {
|
||||
// self.output.digital = self.output.digital and input.digital;
|
||||
self.output.digital = 0;
|
||||
self.output.analog = @max(self.output.analog, input.analog);
|
||||
// std.debug.print("MAX {d} {d}, {any}\n", .{ self.output.analog, input.analog, std.math.order(self.output.analog, input.analog) });
|
||||
self.output.analog = switch (std.math.order(@abs(self.output.analog), @abs(input.analog))) {
|
||||
.lt => input.analog,
|
||||
.eq => @max(self.output.analog, input.analog), // TODO what does this *actually* do?
|
||||
.gt => self.output.analog,
|
||||
};
|
||||
}
|
||||
}
|
||||
self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
|
||||
self.output.analog = std.math.clamp(self.output.analog, -1.0, 1.0);
|
||||
}
|
||||
};
|
||||
|
||||
test "max" {
|
||||
var a = Signal{ .analog = 0.0 };
|
||||
var b = Signal{ .analog = 1.0 };
|
||||
|
||||
var inputs = [_]*Signal{ &a, &b };
|
||||
var or1 = Or{ .inputs = &inputs };
|
||||
|
||||
or1.process();
|
||||
try std.testing.expectEqual(1.0, or1.output.analog);
|
||||
|
||||
a.analog = -0.5;
|
||||
b.analog = -0.2;
|
||||
or1.process();
|
||||
try std.testing.expectEqual(-0.5, or1.output.analog);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue