refactoring

This commit is contained in:
klemek
2020-12-17 13:22:12 +01:00
parent bb6bc82b0b
commit 22ff2ea60b
5 changed files with 68 additions and 52 deletions
+4 -2
View File
@@ -183,8 +183,10 @@ namespace UntitledLogicGame
private void SetCursor() private void SetCursor()
{ {
Texture2D cursor = DefaultCursor; var cursor = DefaultCursor;
Vector2 position = Vector2.zero; var position = Vector2.zero;
//TODO fix warning about invalid Texture2D
if(!Interacting && GameManager.Instance.CurrentAnchor != null || Interacting && _currentCable != null) if(!Interacting && GameManager.Instance.CurrentAnchor != null || Interacting && _currentCable != null)
{ {
+2 -2
View File
@@ -23,7 +23,7 @@ namespace UntitledLogicGame
public static bool[][] AllBoolArrayValues(int length) public static bool[][] AllBoolArrayValues(int length)
{ {
int count = (int)Math.Pow(2, length); var count = (int)Math.Pow(2, length);
return new ArrayList[count].Select((v, i) => i.ToBoolArray(length)).ToArray(); return new ArrayList[count].Select((v, i) => i.ToBoolArray(length)).ToArray();
} }
@@ -43,7 +43,7 @@ namespace UntitledLogicGame
{ {
public static bool[] ToBoolArray(this int value, int length) public static bool[] ToBoolArray(this int value, int length)
{ {
string str = Convert.ToString(value, 2).PadLeft(length, '0'); var str = Convert.ToString(value, 2).PadLeft(length, '0');
return str.Select((x) => x == '1').ToArray(); return str.Select((x) => x == '1').ToArray();
} }
@@ -12,7 +12,7 @@ namespace UntitledLogicGame.Workspace.Gates
public abstract string[] Outputs { get; } public abstract string[] Outputs { get; }
internal abstract Dictionary<InputState, OutputState> TruthTable { get; } internal abstract Dictionary<InputState, OutputState> TruthTable { get; }
public string Name { get; internal set; } public string Name { get; internal set; }
public bool HasState { get; } = false; public bool HasState => false;
public GateDefinition New => (GateDefinition)GetType().GetConstructor(new Type[0]).Invoke(new object[0]); public GateDefinition New => (GateDefinition)GetType().GetConstructor(new Type[0]).Invoke(new object[0]);
private static void LoadAll() private static void LoadAll()
@@ -22,7 +22,7 @@ namespace UntitledLogicGame.Workspace.Gates
{ {
try try
{ {
Type t = Type.GetType($"{typeof(GateDefinition).Namespace}.{gateType}Gate", true); var t = Type.GetType($"{typeof(GateDefinition).Namespace}.{gateType}Gate", true);
Definitions[gateType] = (GateDefinition)t.GetConstructor(new Type[0]).Invoke(new object[0]); Definitions[gateType] = (GateDefinition)t.GetConstructor(new Type[0]).Invoke(new object[0]);
Definitions[gateType].Name = gateType.ToString(); Definitions[gateType].Name = gateType.ToString();
} }
@@ -39,7 +39,7 @@ namespace UntitledLogicGame.Workspace.Gates
if (Definitions == null) if (Definitions == null)
LoadAll(); LoadAll();
GateDefinition definition = Definitions[gateType]; var definition = Definitions[gateType];
foreach (var inputName in definition.Inputs) foreach (var inputName in definition.Inputs)
{ {
@@ -61,22 +61,36 @@ namespace UntitledLogicGame.Workspace.Gates
internal GateDefinition() internal GateDefinition()
{ {
foreach(var key in TruthTable.Keys) if (!HasState)
{ {
if (key.Length != Inputs.Length) if (TruthTable.Count > 0)
throw new InvalidOperationException($"{GetType()} invalid inputs ({key})");
}
if(Inputs.Length != 0)
{
foreach (var key in Utils.AllBoolArrayValues(Inputs.Length).Select(b => new InputState(b)))
{ {
if (!TruthTable.Keys.Contains(key)) foreach (var key in TruthTable.Keys)
throw new InvalidOperationException($"{GetType()} no outputs for ({key})"); {
var values = TruthTable[key]; if (key.Length != Inputs.Length)
if (values.Length != Outputs.Length) throw new InvalidOperationException($"{GetType()} invalid inputs ({key})");
throw new InvalidOperationException($"{GetType()} invalid outputs for ({key})"); }
if (Inputs.Length != 0)
{
foreach (var key in Utils.AllBoolArrayValues(Inputs.Length).Select(b => new InputState(b)))
{
if (!TruthTable.Keys.Contains(key))
throw new InvalidOperationException($"{GetType()} no outputs for ({key})");
var values = TruthTable[key];
if (values.Length != Outputs.Length)
throw new InvalidOperationException($"{GetType()} invalid outputs for ({key})");
}
}
} }
} }
else
{
// Only test basic value
var sample = new InputState(Inputs.Length);
var output = Compute(sample);
if(output.Length != Outputs.Length)
throw new InvalidOperationException($"{GetType()} invalid outputs for sample ({sample})");
}
} }
public bool[] GetState(Gate gate) public bool[] GetState(Gate gate)
@@ -86,8 +100,8 @@ namespace UntitledLogicGame.Workspace.Gates
public void Compute(Gate gate) public void Compute(Gate gate)
{ {
InputState input = new InputState(GetState(gate)); var input = new InputState(GetState(gate));
State output = Compute(input); var output = Compute(input);
foreach (var outputAnchor in Outputs.Select((name, i) => new { i, name })) foreach (var outputAnchor in Outputs.Select((name, i) => new { i, name }))
gate.OutputAnchors.First(a => a.Name.Equals(outputAnchor.name)).Activated = output[outputAnchor.i]; gate.OutputAnchors.First(a => a.Name.Equals(outputAnchor.name)).Activated = output[outputAnchor.i];
} }
@@ -130,7 +130,7 @@ namespace UntitledLogicGame.Workspace.Gates
internal class SRLatchGate : GateDefinition internal class SRLatchGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "S", "R" }; public override string[] Inputs { get; } = new string[] { "S", "R" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "SR Latch"; public new string Name => "SR Latch";
public new bool HasState => true; public new bool HasState => true;
@@ -139,20 +139,20 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool s = input[0]; var s = input[0];
bool r = input[1]; var r = input[1];
if (r) if (r)
_q = false; _q = false;
else if (s) else if (s)
_q = true; _q = true;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
internal class JKLatchGate : GateDefinition internal class JKLatchGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "J", "K" }; public override string[] Inputs { get; } = new string[] { "J", "K" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "JK Latch"; public new string Name => "JK Latch";
public new bool HasState => true; public new bool HasState => true;
@@ -161,22 +161,22 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool j = input[0]; var j = input[0];
bool k = input[1]; var k = input[1];
if (k && j) if (k && j)
_q = !_q; _q = !_q;
else if (k) else if (k)
_q = false; _q = false;
else if (j) else if (j)
_q = true; _q = true;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
internal class DLatchGate : GateDefinition internal class DLatchGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "D", "E" }; public override string[] Inputs { get; } = new string[] { "D", "E" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "D Latch"; public new string Name => "D Latch";
public new bool HasState => true; public new bool HasState => true;
@@ -185,11 +185,11 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool d = input[0]; var d = input[0];
bool e = input[1]; var e = input[1];
if (e) if (e)
_q = d; _q = d;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
@@ -200,7 +200,7 @@ namespace UntitledLogicGame.Workspace.Gates
internal class SRFlipFlopGate : GateDefinition internal class SRFlipFlopGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "S", "R", "CLK" }; public override string[] Inputs { get; } = new string[] { "S", "R", "CLK" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "SR Flip-Flop"; public new string Name => "SR Flip-Flop";
public new bool HasState => true; public new bool HasState => true;
@@ -210,23 +210,23 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool s = input[0]; var s = input[0];
bool r = input[1]; var r = input[1];
bool clk = input[2]; var clk = input[2];
if (clk && !_lastClk) // rising edge if (clk && !_lastClk) // rising edge
if (r) if (r)
_q = false; _q = false;
else if (s) else if (s)
_q = true; _q = true;
_lastClk = clk; _lastClk = clk;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
internal class JKFlipFlopGate : GateDefinition internal class JKFlipFlopGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "J", "K", "CLK" }; public override string[] Inputs { get; } = new string[] { "J", "K", "CLK" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "JK Flip-Flop"; public new string Name => "JK Flip-Flop";
public new bool HasState => true; public new bool HasState => true;
@@ -236,9 +236,9 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool j = input[0]; var j = input[0];
bool k = input[1]; var k = input[1];
bool clk = input[2]; var clk = input[2];
if (clk && !_lastClk) // rising edge if (clk && !_lastClk) // rising edge
if (k && j) if (k && j)
_q = !_q; _q = !_q;
@@ -247,14 +247,14 @@ namespace UntitledLogicGame.Workspace.Gates
else if (j) else if (j)
_q = true; _q = true;
_lastClk = clk; _lastClk = clk;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
internal class DFlipFlopGate : GateDefinition internal class DFlipFlopGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "D", "CLK" }; public override string[] Inputs { get; } = new string[] { "D", "CLK" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "D Flip-Flop"; public new string Name => "D Flip-Flop";
public new bool HasState => true; public new bool HasState => true;
@@ -264,19 +264,19 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool d = input[0]; var d = input[0];
bool clk = input[1]; var clk = input[1];
if (clk && !_lastClk) // rising edge if (clk && !_lastClk) // rising edge
_q = d; _q = d;
_lastClk = clk; _lastClk = clk;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
internal class TFlipFlopGate : GateDefinition internal class TFlipFlopGate : GateDefinition
{ {
public override string[] Inputs { get; } = new string[] { "T", "CLK" }; public override string[] Inputs { get; } = new string[] { "T", "CLK" };
public override string[] Outputs { get; } = new string[] { "Q" }; public override string[] Outputs { get; } = new string[] { "Q", "Q̅" };
internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable; internal override Dictionary<InputState, OutputState> TruthTable => EmptyTruthTable;
public new string Name => "T Flip-Flop"; public new string Name => "T Flip-Flop";
public new bool HasState => true; public new bool HasState => true;
@@ -286,13 +286,13 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input) internal new OutputState Compute(InputState input)
{ {
bool t = input[0]; var t = input[0];
bool clk = input[1]; var clk = input[1];
if (clk && !_lastClk) // rising edge if (clk && !_lastClk) // rising edge
if (t) if (t)
_q = !_q; _q = !_q;
_lastClk = clk; _lastClk = clk;
return new OutputState(_q); return new OutputState(_q, !_q);
} }
} }
+1 -1
View File
@@ -1,7 +1,7 @@
TODO TODO
-(0) mux/demux -(0) mux/demux
-(2) gate bar sub categories -(2) gate bar sub categories
-(2) named anchors -(2) named anchors (dezoom hide ?)
-(3) clocks (1Hz, 5Hz, 10Hz, etc.) -(3) clocks (1Hz, 5Hz, 10Hz, etc.)
-(3) generic rect gates -(3) generic rect gates
-(3) state gates -(3) state gates