Files
Enigmos/Modules/TerminalModules/SRLatchModule.cs
2024-06-30 01:52:44 +08:00

67 lines
2.1 KiB
C#

using Enigmos.Modules.ControllingModules;
using Enigmos.Modules.Other;
using Enigmos.Ports;
using Enigmos.Ports.DataPorts;
using Nocturnis.Enigmos.Modules;
using TabulaSmaragdina.Constants;
namespace Enigmos.Modules.TerminalModules;
public partial class SRLatchModule : TerminalModule, IComputationalCompositeModule
{
private DataInPort? Input1 { get; set; }
private DataInPort? Input2 { get; set; }
public OutputSubModule? Output1 { get; set; }
public OutputSubModule? Output2 { get; set; }
public override IEnumerable<BasePort> Ports => new[] { Input1, Input2 }!;
private bool State { get; set; }
public IBaseModule[] SubModules() => new IBaseModule[] { Output1, Output2 };
public void Compute(IRootModule root)
{
Output1!.DataOut.ResultData.Bit = State;
Output2!.DataOut.ResultData.Bit = State;
}
protected override void Consume(RootModule root)
{
bool set = Input1!.GetData(root).Bit;
bool reset = Input2!.GetData(root).Bit;
if (set && reset)
State = false;
else if (set)
State = true;
else if (reset)
State = false;
}
protected OutputSubModule GetOutputModule(string path)
{
OutputSubModule res = GetNode<OutputSubModule>(path);
res.Init();
res.ParentModule = this;
res.Board = Board;
return res;
}
public override void Init()
{
base.Init();
Input1 = GetPort<DataInPort>("Input1");
Input1.SetDataType(EnigmosConstant.DataPortTypes.Bit);
Input2 = GetPort<DataInPort>("Input2");
Input2.SetDataType(EnigmosConstant.DataPortTypes.Bit);
Output1 = GetOutputModule("Output1");
Output1.DataOut.SetDataType(EnigmosConstant.DataPortTypes.Bit);
Output2 = GetOutputModule("Output2");
Output2.DataOut.SetDataType(EnigmosConstant.DataPortTypes.Bit);
PostInit();
}
public override void UpdateCables()
{
base.UpdateCables();
foreach (IBaseModule subModule in SubModules())
subModule.UpdateCables();
}
}