Add experimental new logic simulator based on compiled expression trees

This commit is contained in:
Stone_Red
2026-03-25 04:42:24 +01:00
parent c704c50258
commit 3928524c32
4 changed files with 854 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
namespace StoneRed.LogicSimulator.Test;
internal static class Program
{
public static void Main()
{
var sim = new ExprCircuitSimulator();
var inverter = new CircuitDefinition();
int invIn = inverter.AddInputPin(); // Source inside definition
int invNot = inverter.AddGate(GateKind.Not);
int invOut = inverter.AddOutputPin(); // Sink inside definition
inverter.Connect(invIn, invNot, toInputBit: 0);
inverter.Connect(invNot, invOut, toInputBit: 0);
sim.RegisterMacroGate("INV", inverter);
sim.ComputeLut("INV");
var doubleInverter = new CircuitDefinition();
int inv2In = doubleInverter.AddInputPin();
CircuitDefinition.MacroInstanceDef invA = doubleInverter.AddMacroInstance("INV", inputCount: 1, outputCount: 1);
CircuitDefinition.MacroInstanceDef invB = doubleInverter.AddMacroInstance("INV", inputCount: 1, outputCount: 1);
int inv2Out = doubleInverter.AddOutputPin();
doubleInverter.Connect(inv2In, invA.Inputs[0], toInputBit: 0);
doubleInverter.Connect(invA.Outputs[0], invB.Inputs[0], toInputBit: 0);
doubleInverter.Connect(invB.Outputs[0], inv2Out, toInputBit: 0);
sim.RegisterMacroGate("INV2", doubleInverter);
sim.ComputeLut("INV2");
int a = sim.AddGate(GateKind.Source);
ExprCircuitSimulator.MacroInstance inv2 = sim.AddMacroGate("INV2");
int lamp = sim.AddGate(GateKind.Sink);
sim.ConnectGates(a, inv2.Inputs[0], toInputBit: 0);
sim.ConnectGates(inv2.Outputs[0], lamp, toInputBit: 0);
sim.SetSource(a, value: false);
sim.RunUntilStable();
Console.WriteLine($"A=0 => Lamp={sim.GetOutput(lamp)} (expected False)");
sim.SetSource(a, value: true);
sim.RunUntilStable();
Console.WriteLine($"A=1 => Lamp={sim.GetOutput(lamp)} (expected True)");
}
}