misc
This commit is contained in:
parent
fd2b4026e9
commit
01107aece5
1 changed files with 128 additions and 118 deletions
246
src/main.zig
246
src/main.zig
|
@ -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 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;
|
// pub const Battery = struct {
|
||||||
// for (self.inputs[1..]) |input| best = @min(best, input.analog);
|
// // component: Component = .{},
|
||||||
// self.output.analog = best;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
pub const Or = struct {
|
// output: *Wire,
|
||||||
component: Component,
|
|
||||||
|
|
||||||
inputs: []*Wire,
|
// value: f32,
|
||||||
output: *Wire,
|
// invert_output: bool = false,
|
||||||
|
|
||||||
// if false, is in Maximum Input mode
|
// pub fn process(self: *Battery) void {
|
||||||
// if true, is in Add Inputs mode
|
// if (self.invert_output) {
|
||||||
arithmetic_mode: bool = false,
|
// self.output.digital = self.value != 0.0;
|
||||||
|
// self.output.analogSet(self.value);
|
||||||
// TODO check implementation
|
// } else {
|
||||||
pub fn process(self: *Or) void {
|
// self.output.digital = self.value == 0.0;
|
||||||
if (self.arithmetic_mode) {
|
// self.output.analogSet(1.0 - @abs(self.value));
|
||||||
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;
|
// pub const Not = struct {
|
||||||
}
|
// // component: Component = .{},
|
||||||
} else {
|
|
||||||
self.output.digital = self.inputs[0].digital;
|
// input: *Wire,
|
||||||
self.output.analog = self.inputs[0].analog;
|
// output: *Wire,
|
||||||
for (self.inputs[1..]) |input| {
|
|
||||||
self.output.digital = self.output.digital and input.digital;
|
// invert_output: bool = true,
|
||||||
self.output.analog = @max(self.output.analog, input.analog);
|
|
||||||
}
|
// pub fn process(self: *Not) void {
|
||||||
}
|
// if (self.invert_output) {
|
||||||
self.output.analog = std.math.clamp(self.output.analog, 0.0, 1.0);
|
// self.output.digital = !self.input.digital;
|
||||||
// self.output.digital = 1;
|
// self.output.analogSet(1.0 - @abs(self.input.analog));
|
||||||
// for (self.inputs) |input| if (input.digital) {
|
// } else {
|
||||||
// self.output.digital = true;
|
// self.output.digital = self.input.digital;
|
||||||
// break;
|
// self.output.analogSet(self.input.analog); // TODO does the output get clamped here?
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
|
||||||
|
// pub const And = struct {
|
||||||
|
// // component: Component,
|
||||||
|
|
||||||
|
// inputs: []*Wire,
|
||||||
|
// output: *Wire,
|
||||||
|
|
||||||
|
// // 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;
|
||||||
|
// // };
|
||||||
|
// }
|
||||||
// };
|
// };
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue