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 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(path); res.Init(); res.ParentModule = this; res.Board = Board; return res; } public override void Init() { base.Init(); Input1 = GetPort("Input1"); Input1.SetDataType(EnigmosConstant.DataPortTypes.Bit); Input2 = GetPort("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(); } }