From 0e05fa0241d7be8ce5b6d5719f11f1c745b32359 Mon Sep 17 00:00:00 2001 From: Jeeves Date: Wed, 12 Feb 2025 01:04:53 -0700 Subject: [PATCH] first successful simulation! --- src/main.zig | 61 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/src/main.zig b/src/main.zig index 03b3885..e18c70f 100644 --- a/src/main.zig +++ b/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); +}