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()
{
Texture2D cursor = DefaultCursor;
Vector2 position = Vector2.zero;
var cursor = DefaultCursor;
var position = Vector2.zero;
//TODO fix warning about invalid Texture2D
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)
{
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();
}
@@ -43,7 +43,7 @@ namespace UntitledLogicGame
{
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();
}
@@ -12,7 +12,7 @@ namespace UntitledLogicGame.Workspace.Gates
public abstract string[] Outputs { get; }
internal abstract Dictionary<InputState, OutputState> TruthTable { get; }
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]);
private static void LoadAll()
@@ -22,7 +22,7 @@ namespace UntitledLogicGame.Workspace.Gates
{
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].Name = gateType.ToString();
}
@@ -39,7 +39,7 @@ namespace UntitledLogicGame.Workspace.Gates
if (Definitions == null)
LoadAll();
GateDefinition definition = Definitions[gateType];
var definition = Definitions[gateType];
foreach (var inputName in definition.Inputs)
{
@@ -61,12 +61,16 @@ namespace UntitledLogicGame.Workspace.Gates
internal GateDefinition()
{
foreach(var key in TruthTable.Keys)
if (!HasState)
{
if (TruthTable.Count > 0)
{
foreach (var key in TruthTable.Keys)
{
if (key.Length != Inputs.Length)
throw new InvalidOperationException($"{GetType()} invalid inputs ({key})");
}
if(Inputs.Length != 0)
if (Inputs.Length != 0)
{
foreach (var key in Utils.AllBoolArrayValues(Inputs.Length).Select(b => new InputState(b)))
{
@@ -78,6 +82,16 @@ namespace UntitledLogicGame.Workspace.Gates
}
}
}
}
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)
{
@@ -86,8 +100,8 @@ namespace UntitledLogicGame.Workspace.Gates
public void Compute(Gate gate)
{
InputState input = new InputState(GetState(gate));
State output = Compute(input);
var input = new InputState(GetState(gate));
var output = Compute(input);
foreach (var outputAnchor in Outputs.Select((name, i) => new { i, name }))
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
{
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;
public new string Name => "SR Latch";
public new bool HasState => true;
@@ -139,20 +139,20 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool s = input[0];
bool r = input[1];
var s = input[0];
var r = input[1];
if (r)
_q = false;
else if (s)
_q = true;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
internal class JKLatchGate : GateDefinition
{
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;
public new string Name => "JK Latch";
public new bool HasState => true;
@@ -161,22 +161,22 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool j = input[0];
bool k = input[1];
var j = input[0];
var k = input[1];
if (k && j)
_q = !_q;
else if (k)
_q = false;
else if (j)
_q = true;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
internal class DLatchGate : GateDefinition
{
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;
public new string Name => "D Latch";
public new bool HasState => true;
@@ -185,11 +185,11 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool d = input[0];
bool e = input[1];
var d = input[0];
var e = input[1];
if (e)
_q = d;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
@@ -200,7 +200,7 @@ namespace UntitledLogicGame.Workspace.Gates
internal class SRFlipFlopGate : GateDefinition
{
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;
public new string Name => "SR Flip-Flop";
public new bool HasState => true;
@@ -210,23 +210,23 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool s = input[0];
bool r = input[1];
bool clk = input[2];
var s = input[0];
var r = input[1];
var clk = input[2];
if (clk && !_lastClk) // rising edge
if (r)
_q = false;
else if (s)
_q = true;
_lastClk = clk;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
internal class JKFlipFlopGate : GateDefinition
{
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;
public new string Name => "JK Flip-Flop";
public new bool HasState => true;
@@ -236,9 +236,9 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool j = input[0];
bool k = input[1];
bool clk = input[2];
var j = input[0];
var k = input[1];
var clk = input[2];
if (clk && !_lastClk) // rising edge
if (k && j)
_q = !_q;
@@ -247,14 +247,14 @@ namespace UntitledLogicGame.Workspace.Gates
else if (j)
_q = true;
_lastClk = clk;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
internal class DFlipFlopGate : GateDefinition
{
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;
public new string Name => "D Flip-Flop";
public new bool HasState => true;
@@ -264,19 +264,19 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool d = input[0];
bool clk = input[1];
var d = input[0];
var clk = input[1];
if (clk && !_lastClk) // rising edge
_q = d;
_lastClk = clk;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
internal class TFlipFlopGate : GateDefinition
{
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;
public new string Name => "T Flip-Flop";
public new bool HasState => true;
@@ -286,13 +286,13 @@ namespace UntitledLogicGame.Workspace.Gates
internal new OutputState Compute(InputState input)
{
bool t = input[0];
bool clk = input[1];
var t = input[0];
var clk = input[1];
if (clk && !_lastClk) // rising edge
if (t)
_q = !_q;
_lastClk = clk;
return new OutputState(_q);
return new OutputState(_q, !_q);
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
TODO
-(0) mux/demux
-(2) gate bar sub categories
-(2) named anchors
-(2) named anchors (dezoom hide ?)
-(3) clocks (1Hz, 5Hz, 10Hz, etc.)
-(3) generic rect gates
-(3) state gates