Files
Enigmos/Modules/TerminalModules/MemoryModule.cs
2024-07-03 12:20:08 +08:00

70 lines
2.3 KiB
C#

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<IDataPortGroup> ConfigurablePortGroups { get; set; } = new();
public IDataInPort[] DataInPorts { get; set; } = Array.Empty<IDataInPort>();
public IDataOutPort[] DataOutPorts { get; set; } = Array.Empty<IDataOutPort>();
public override IEnumerable<IBasePort> Ports => DataInPorts.Union<IBasePort>(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<IDataPortGroup> { 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();
}
}
}