using Nocturnis.DataStructures.Data; using Nocturnis.DataStructures.DataPortGroups; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.ComputationalModules; using Nocturnis.Enigmos.Ports.DataPorts; using Nocturnis.Enigmos.Ports.DataPorts.Directions; using Nocturnis.GlobalManagement.Constants; using Nocturnis.GlobalManagement.Providers; namespace Enigmos.Modules.TerminalModules; public abstract partial class MemoryModule : BaseModule, ITerminalModule, ISourceModule, IDuplicateOutputModule { private DataVariable? 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 void Init() { base.Init(); Memory = new DataVariable(); this.DataInInit("Input", 3); this.DataOutInit("Output", 4); DataInPorts[1].SetDataType(DataTypeConstant.BaseDataTypes.Bit); DataInPorts[2].SetDataType(DataTypeConstant.BaseDataTypes.Bit); MemoryPortGroup =GlobalProvider.DataStructureProvider!.NewDataPortGroup( this, new IDataPort[] { DataInPorts[0] }.Union(DataOutPorts).ToArray(), "Memory Data Type:", DataTypeConstant.BaseDataTypes.Real, DataTypeConstant.DataTypeOptions.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(); } } public bool Finished { get; set; } }