From e7a2656d32ef8c704a1ed8fed1febb84585ec859 Mon Sep 17 00:00:00 2001
From: Jeeves <guydoodlesdev@gmail.com>
Date: Mon, 3 Mar 2025 18:38:36 -0700
Subject: [PATCH] idk

---
 src/main.zig | 170 ++++++++++++++++++++++++---------------------------
 1 file changed, 79 insertions(+), 91 deletions(-)

diff --git a/src/main.zig b/src/main.zig
index c5fa292..bb8b380 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -5,80 +5,72 @@ pub fn main() !void {
     defer _ = gpa.deinit();
     const allocator = gpa.allocator();
 
-    // var input = Signal{ .digital = 1, .analog = 0.5 };
+    var input = Signal{ .digital = 1, .analog = 0.5 };
 
     var circuit = Circuit.init(allocator);
     defer circuit.deinit();
 
-    // var not1 = try circuit.addComponent(Not);
-    // not1.invert_output = false;
-    // not1.component.inputs.items[0] = .{ .signal = &input }; // manually set the input here
+    var not1 = try circuit.addComponent(Not);
+    not1.invert_output = false;
+    not1.component.inputs.items[0] = .{ .signal = &input }; // manually set the input here
 
-    // var battery1 = try circuit.addComponent(Battery);
-    var battery1 = try Battery.init(allocator);
-    defer battery1.deinit(allocator);
-    try circuit.components.append(circuit.allocator, battery1.component);
-    battery1.component = circuit.components.items[0];
-    try circuit.source_components.append(circuit.allocator, &battery1.component);
-    // std.debug.print("{any}\n\n", .{circuit.components.items});
-    // std.debug.print("{any}\n\n", .{circuit.source_components.items});
-    std.debug.print("{*} == {*}\n\n", .{ &circuit.components.items[0], circuit.source_components.items[0] });
-    // var battery2 = try circuit.addComponent(Battery);
-    // var battery3 = try circuit.addComponent(Battery);
-    // battery1.value = -0.5;
-    // battery2.value = 0.5;
-    // battery3.value = -1.0;
+    var battery1 = try circuit.addComponent(Battery);
+    var battery2 = try circuit.addComponent(Battery);
+    var battery3 = try circuit.addComponent(Battery);
+    battery1.value = -0.5;
+    battery2.value = 0.5;
+    battery3.value = -1.0;
 
-    // var or1 = try circuit.addComponent(Or);
-    // var or2 = try circuit.addComponent(Or);
-    // or1.arithmetic_mode = true;
-    // or2.arithmetic_mode = true;
-    // try or1.component.setNumInputs(allocator, 3);
-    // try or2.component.setNumInputs(allocator, 3);
+    var or1 = try circuit.addComponent(Or);
+    var or2 = try circuit.addComponent(Or);
+    or1.arithmetic_mode = true;
+    or2.arithmetic_mode = true;
+    try or1.component.resizeInputs(allocator, 3);
+    try or2.component.resizeInputs(allocator, 3);
 
-    // var or3 = try circuit.addComponent(Or);
-    // var or4 = try circuit.addComponent(Or);
-    // var or5 = try circuit.addComponent(Or);
+    var or3 = try circuit.addComponent(Or);
+    var or4 = try circuit.addComponent(Or);
+    var or5 = try circuit.addComponent(Or);
 
-    // var or6 = try circuit.addComponent(Or);
-    // var or7 = try circuit.addComponent(Or);
-    // var or8 = try circuit.addComponent(Or);
-    // var and1 = try circuit.addComponent(And);
-    // var and2 = try circuit.addComponent(And);
-    // or6.arithmetic_mode = true;
-    // or7.arithmetic_mode = true;
-    // or8.arithmetic_mode = true;
-    // and1.arithmetic_mode = true;
-    // and2.arithmetic_mode = true;
+    var or6 = try circuit.addComponent(Or);
+    var or7 = try circuit.addComponent(Or);
+    var or8 = try circuit.addComponent(Or);
+    var and1 = try circuit.addComponent(And);
+    var and2 = try circuit.addComponent(And);
+    or6.arithmetic_mode = true;
+    or7.arithmetic_mode = true;
+    or8.arithmetic_mode = true;
+    and1.arithmetic_mode = true;
+    and2.arithmetic_mode = true;
 
-    // battery1.component.connect(0, &or3.component, 1);
-    // battery1.component.connect(0, &or4.component, 1);
-    // battery1.component.connect(0, &or5.component, 1);
+    battery1.component.connect(0, &or3.component, 1);
+    battery1.component.connect(0, &or4.component, 1);
+    battery1.component.connect(0, &or5.component, 1);
 
-    // battery2.component.connect(0, &or6.component, 0);
-    // battery2.component.connect(0, &or7.component, 0);
-    // battery2.component.connect(0, &or8.component, 0);
+    battery2.component.connect(0, &or6.component, 0);
+    battery2.component.connect(0, &or7.component, 0);
+    battery2.component.connect(0, &or8.component, 0);
 
-    // battery3.component.connect(0, &and1.component, 0);
-    // battery3.component.connect(0, &and2.component, 0);
+    battery3.component.connect(0, &and1.component, 0);
+    battery3.component.connect(0, &and2.component, 0);
 
-    // not1.component.connect(0, &or3.component, 0);
-    // not1.component.connect(0, &or1.component, 0);
-    // not1.component.connect(0, &or1.component, 1);
+    not1.component.connect(0, &or3.component, 0);
+    not1.component.connect(0, &or1.component, 0);
+    not1.component.connect(0, &or1.component, 1);
 
-    // or1.component.connect(0, &or4.component, 0);
-    // or1.component.connect(0, &or2.component, 0);
-    // or1.component.connect(0, &or2.component, 1);
-    // or2.component.connect(0, &or5.component, 0);
+    or1.component.connect(0, &or4.component, 0);
+    or1.component.connect(0, &or2.component, 0);
+    or1.component.connect(0, &or2.component, 1);
+    or2.component.connect(0, &or5.component, 0);
 
-    // or3.component.connect(0, &or6.component, 1);
-    // or4.component.connect(0, &or7.component, 1);
-    // or5.component.connect(0, &or8.component, 1);
+    or3.component.connect(0, &or6.component, 1);
+    or4.component.connect(0, &or7.component, 1);
+    or5.component.connect(0, &or8.component, 1);
 
-    // or6.component.connect(0, &and1.component, 1);
-    // and1.component.connect(0, &or1.component, 2);
-    // or7.component.connect(0, &and2.component, 1);
-    // and2.component.connect(0, &or2.component, 2);
+    or6.component.connect(0, &and1.component, 1);
+    and1.component.connect(0, &or1.component, 2);
+    or7.component.connect(0, &and2.component, 1);
+    and2.component.connect(0, &or2.component, 2);
 
     try circuit.tick();
 
@@ -119,13 +111,13 @@ pub fn main() !void {
 pub const Circuit = struct {
     allocator: std.mem.Allocator,
     components: Components,
-    source_components: SourceComponents,
+    source_components: Components,
 
     pub fn init(allocator: std.mem.Allocator) Circuit {
         return .{
             .allocator = allocator,
             .components = Components.empty,
-            .source_components = SourceComponents.empty,
+            .source_components = Components.empty,
         };
     }
 
@@ -135,13 +127,13 @@ pub const Circuit = struct {
         self.components.deinit(self.allocator);
     }
 
-    // pub fn addComponent(self: *Circuit, comptime T: type) !T {
-    //     var c = try T.init(self.allocator);
-    //     errdefer c.deinit(self.allocator);
-    //     try self.components.append(self.allocator, c.component);
-    //     // if (T == Battery) try self.source_components.append(self.allocator, &c.component);
-    //     return c;
-    // }
+    pub fn addComponent(self: *Circuit, comptime T: type) !T {
+        var c = try T.init(self.allocator);
+        errdefer c.deinit(self.allocator);
+        try self.components.append(self.allocator, &c.component);
+        if (T == Battery) try self.source_components.append(self.allocator, &c.component);
+        return c;
+    }
 
     pub fn tick(self: *Circuit) !void {
         var process_order_solver = try ProcessOrderSolver.init(self);
@@ -150,8 +142,7 @@ pub const Circuit = struct {
         _ = process_order;
     }
 
-    const Components = std.ArrayListUnmanaged(Component);
-    const SourceComponents = std.ArrayListUnmanaged(*Component);
+    const Components = std.ArrayListUnmanaged(*Component);
 
     const ProcessOrder = []*Component;
     const ProcessOrderSolver = struct {
@@ -170,7 +161,6 @@ pub const Circuit = struct {
         }
 
         pub fn solve(self: *ProcessOrderSolver) ProcessOrder {
-            // std.debug.print("{any}\n\n", .{self.circuit.source_components.items});
             for (self.circuit.source_components.items) |source_component| {
                 var component = source_component;
                 // while (true) blk: {
@@ -178,30 +168,29 @@ pub const Circuit = struct {
                 // std.debug.print("source component {any}\n\n", .{source_component});
                 const idx = self.componentIndex(component);
                 self.solved[idx.?] = true;
-                component = component.outputs.items[0].connection.?;
                 std.debug.print("{any}\n", .{component});
+                component = component.outputs.items[0].connection.?;
                 // }
             }
             return &[_]*Component{};
         }
 
         fn componentIndex(self: ProcessOrderSolver, component: *Component) ?usize {
-            for (self.circuit.components.items, 0..) |c, i| {
-                // std.debug.print("{any} == {any}\n", .{ component, &c });
-                std.debug.print("{*} == {*}\n", .{ component, &c });
-                // std.debug.print("{s}\n{s}\n{any}\n\n", .{
-                //     std.fmt.fmtSliceHexLower(std.mem.asBytes(component)),
-                //     std.fmt.fmtSliceHexLower(std.mem.asBytes(&c)),
-                //     std.mem.eql(u8, std.mem.asBytes(component), std.mem.asBytes(&c)),
-                // });
-                // if (std.mem.eql(u8, std.mem.asBytes(component), std.mem.asBytes(&c))) {
-                if (component == &c) {
-                    // std.debug.print("component index {d}\n", .{i});
-                    return i;
-                }
-            }
-            return null;
-            // return std.mem.indexOfScalar(Component, self.circuit.components.items, component.*);
+            // for (self.circuit.components.items, 0..) |c, i| {
+            //     // std.debug.print("{any} == {any}\n", .{ component, &c });
+            //     std.debug.print("{*} == {*}\n", .{ component, &c });
+            //     // std.debug.print("{s}\n{s}\n{any}\n\n", .{
+            //     //     std.fmt.fmtSliceHexLower(std.mem.asBytes(component)),
+            //     //     std.fmt.fmtSliceHexLower(std.mem.asBytes(&c)),
+            //     //     std.mem.eql(u8, std.mem.asBytes(component), std.mem.asBytes(&c)),
+            //     // });
+            //     // if (std.mem.eql(u8, std.mem.asBytes(component), std.mem.asBytes(&c))) {
+            //     if (component == c) {
+            //         return i;
+            //     }
+            // }
+            // return null;
+            return std.mem.indexOfScalar(*Component, self.circuit.components.items, component);
         }
     };
 };
@@ -243,7 +232,7 @@ pub const Component = struct {
 
     // TODO allow inserting the new elements at an arbitrary index
     // TODO ensure this won't break the opposide side's connections
-    pub fn setNumInputs(self: *Component, allocator: std.mem.Allocator, new_len: usize) !void {
+    pub fn resizeInputs(self: *Component, allocator: std.mem.Allocator, new_len: usize) !void {
         const old_len = self.inputs.items.len;
         try self.inputs.resize(allocator, new_len);
         if (new_len > old_len) for (old_len..new_len) |i| {
@@ -252,9 +241,8 @@ pub const Component = struct {
     }
 
     // TODO allow inserting the new elements at an arbitrary index
-    // TODO is this allocating the new output Signals on the stack or dumbthing?
     // TODO ensure this won't break the opposide side's connections
-    pub fn setNumOutputs(self: *Component, allocator: std.mem.Allocator, new_len: usize) !void {
+    pub fn resizeOutputs(self: *Component, allocator: std.mem.Allocator, new_len: usize) !void {
         const old_len = self.outputs.items.len;
         try self.outputs.resize(allocator, new_len);
         if (new_len > old_len) for (old_len..new_len) |i| {