This commit is contained in:
Jeeves 2025-02-11 11:43:39 -07:00
parent fd2b4026e9
commit 01107aece5

View file

@ -88,134 +88,144 @@ pub const Circuit = struct {
components: std.ArrayList(Component), components: std.ArrayList(Component),
}; };
pub const Wire = struct {
digital: bool = false,
analog: f32 = 0.0,
pub fn format(self: Wire, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
_ = .{ fmt, options };
try writer.print("Wire({s} | {d:0>1.4})", .{
if (self.digital) "1" else "0",
self.analog,
});
}
fn analogSet(self: *Wire, value: f32) void {
self.analog = std.math.clamp(value, 0.0, 1.0);
}
};
pub const Battery = struct { pub const Battery = struct {
component: Component = .{}, pub fn process(component: *Component) Signal {}
output: *Wire,
value: f32,
invert_output: bool = false,
pub fn process(self: *Battery) void {
if (self.invert_output) {
self.output.digital = self.value != 0.0;
self.output.analogSet(self.value);
} else {
self.output.digital = self.value == 0.0;
self.output.analogSet(1.0 - @abs(self.value));
}
}
}; };
pub const Not = struct { pub const Signal = struct {
component: Component = .{}, digital: i2,
analog: f32,
input: *Wire, color: u24,
output: *Wire,
invert_output: bool = true,
pub fn process(self: *Not) void {
if (self.invert_output) {
self.output.digital = !self.input.digital;
self.output.analogSet(1.0 - @abs(self.input.analog));
} else {
self.output.digital = self.input.digital;
self.output.analogSet(self.input.analog); // TODO does the output get clamped here?
}
}
}; };
pub const And = struct { // pub const Wire = struct {
component: Component, // digital: bool = false,
// analog: f32 = 0.0,
inputs: []*Wire, // pub fn format(self: Wire, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
output: *Wire, // _ = .{ fmt, options };
// try writer.print("Wire({s} | {d:0>1.4})", .{
// if (self.digital) "1" else "0",
// self.analog,
// });
// }
// if false, is in Minimum Input mode // fn analogSet(self: *Wire, value: f32) void {
// if true, is in Multiply Inputs mode // self.analog = std.math.clamp(value, 0.0, 1.0);
arithmetic_mode: bool = false, // }
// };
// TODO check implementation // pub const Battery = struct {
pub fn process(self: *And) void { // // component: Component = .{},
if (self.arithmetic_mode) {
self.output.digital = self.inputs[0].digital;
self.output.analog = self.inputs[0].analog;
for (self.inputs[1..]) |input| {
self.output.digital = self.output.digital and input.digital;
self.output.analog *= input.analog;
}
} else {
self.output.digital = self.inputs[0].digital;
self.output.analog = self.inputs[0].analog;
for (self.inputs[1..]) |input| {
self.output.digital = self.output.digital and input.digital;
self.output.analog = @min(self.output.analog, input.analog);
}
}
self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
// var digital = self.inputs[0].digital;
// if (digital) for (1..self.inputs.len - 1) |i| if (!self.inputs[i].digital) {
// digital = false;
// break;
// };
// self.output.digital = digital;
// var best = self.inputs[0].analog; // output: *Wire,
// for (self.inputs[1..]) |input| best = @min(best, input.analog);
// self.output.analog = best;
}
};
pub const Or = struct { // value: f32,
component: Component, // invert_output: bool = false,
inputs: []*Wire, // pub fn process(self: *Battery) void {
output: *Wire, // if (self.invert_output) {
// self.output.digital = self.value != 0.0;
// self.output.analogSet(self.value);
// } else {
// self.output.digital = self.value == 0.0;
// self.output.analogSet(1.0 - @abs(self.value));
// }
// }
// };
// if false, is in Maximum Input mode // pub const Not = struct {
// if true, is in Add Inputs mode // // component: Component = .{},
arithmetic_mode: bool = false,
// TODO check implementation // input: *Wire,
pub fn process(self: *Or) void { // output: *Wire,
if (self.arithmetic_mode) {
self.output.digital = self.inputs[0].digital; // invert_output: bool = true,
self.output.analog = self.inputs[0].analog;
for (self.inputs[1..]) |input| { // pub fn process(self: *Not) void {
self.output.digital = self.output.digital and input.digital; // if (self.invert_output) {
self.output.analog += input.analog; // self.output.digital = !self.input.digital;
} // self.output.analogSet(1.0 - @abs(self.input.analog));
} else { // } else {
self.output.digital = self.inputs[0].digital; // self.output.digital = self.input.digital;
self.output.analog = self.inputs[0].analog; // self.output.analogSet(self.input.analog); // TODO does the output get clamped here?
for (self.inputs[1..]) |input| { // }
self.output.digital = self.output.digital and input.digital; // }
self.output.analog = @max(self.output.analog, input.analog); // };
}
} // pub const And = struct {
self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0); // // component: Component,
// self.output.digital = 1;
// for (self.inputs) |input| if (input.digital) { // inputs: []*Wire,
// self.output.digital = true; // output: *Wire,
// break;
// }; // // if false, is in Minimum Input mode
} // // if true, is in Multiply Inputs mode
}; // arithmetic_mode: bool = false,
// // TODO check implementation
// pub fn process(self: *And) void {
// if (self.arithmetic_mode) {
// self.output.digital = self.inputs[0].digital;
// self.output.analog = self.inputs[0].analog;
// for (self.inputs[1..]) |input| {
// self.output.digital = self.output.digital and input.digital;
// self.output.analog *= input.analog;
// }
// } else {
// self.output.digital = self.inputs[0].digital;
// self.output.analog = self.inputs[0].analog;
// for (self.inputs[1..]) |input| {
// self.output.digital = self.output.digital and input.digital;
// self.output.analog = @min(self.output.analog, input.analog);
// }
// }
// self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
// // var digital = self.inputs[0].digital;
// // if (digital) for (1..self.inputs.len - 1) |i| if (!self.inputs[i].digital) {
// // digital = false;
// // break;
// // };
// // self.output.digital = digital;
// // var best = self.inputs[0].analog;
// // for (self.inputs[1..]) |input| best = @min(best, input.analog);
// // self.output.analog = best;
// }
// };
// pub const Or = struct {
// // component: Component,
// inputs: []*Wire,
// output: *Wire,
// // if false, is in Maximum Input mode
// // if true, is in Add Inputs mode
// arithmetic_mode: bool = false,
// // TODO check implementation
// pub fn process(self: *Or) void {
// if (self.arithmetic_mode) {
// self.output.digital = self.inputs[0].digital;
// self.output.analog = self.inputs[0].analog;
// for (self.inputs[1..]) |input| {
// self.output.digital = self.output.digital and input.digital;
// self.output.analog += input.analog;
// }
// } else {
// self.output.digital = self.inputs[0].digital;
// self.output.analog = self.inputs[0].analog;
// for (self.inputs[1..]) |input| {
// self.output.digital = self.output.digital and input.digital;
// self.output.analog = @max(self.output.analog, input.analog);
// }
// }
// self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
// // self.output.digital = 1;
// // for (self.inputs) |input| if (input.digital) {
// // self.output.digital = true;
// // break;
// // };
// }
// };