refactoring
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user