using Nocturnis.DataStructures; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.Enigmos.Ports; using Nocturnis.Enigmos.Ports.DataPorts; using Nocturnis.Enigmos.Ports.DataPorts.Directions; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Modules.TerminalModules; public partial class MemoryModule : BaseModule, ITerminalModule, ISourceModule, IDuplicateOutputModule { private IData? Memory { get; set; } private IDataPortGroup? MemoryPortGroup { get; set; } public HashSet ConfigurablePortGroups { get; set; } = new(); public IDataInPort[] DataInPorts { get; set; } = Array.Empty(); public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty(); public override IEnumerable Ports => DataInPorts.Union(DataOutPorts); public override void Init() { base.Init(); Memory = GlobalProvider.DataStructureProvider!.NewData(0, EnigmosConstant.DataPortTypes.Null); this.DataInInit("Input", 3); this.DataOutInit("Output", 4); DataInPorts[1].SetDataType(EnigmosConstant.DataPortTypes.Bit); DataInPorts[2].SetDataType(EnigmosConstant.DataPortTypes.Bit); MemoryPortGroup =GlobalProvider.DataStructureProvider!.NewDataPortGroup( this, new IDataPort[] { DataInPorts[0] }.Union(DataOutPorts).ToArray(), "Memory Data Type:", EnigmosConstant.DataPortTypes.Real, EnigmosConstant.DataPortTypes.AnyType ); ConfigurablePortGroups = new HashSet { MemoryPortGroup }; PostInit(); } public void Inference() { } public void Define() { this.Define(cache => (Memory!.Data, Memory.Type)!); } public void Drain() { bool setValue = DataInPorts[1].GetData.Get!.Bit; bool resetValue = DataInPorts[2].GetData.Get!.Bit; if(resetValue) { Memory!.Assign(0, MemoryPortGroup!.SelectedType); Define(); } else if (setValue) { Memory!.Assign(DataInPorts[1].GetData.Get!, MemoryPortGroup!.SelectedType); Define(); } } }