From be5f5604ec48b0df74b11b704b1279a387bb7a37 Mon Sep 17 00:00:00 2001 From: Christian Femers Date: Sun, 6 Oct 2019 22:13:37 +0200 Subject: [PATCH] Added RegisterGroups for MachineDefinition --- .../AbstractAm2900MachineDefinition.java | 7 ++++ .../net/mograsim/machine/Identifiable.java | 9 ++++ .../mograsim/machine/MachineDefinition.java | 8 ++++ .../src/net/mograsim/machine/Register.java | 3 +- .../net/mograsim/machine/RegisterGroup.java | 16 ++++++++ .../mograsim/machine/SimpleRegisterGroup.java | 38 +++++++++++++++++ .../mograsim/machine/UnionRegisterGroup.java | 41 +++++++++++++++++++ 7 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 plugins/net.mograsim.machine/src/net/mograsim/machine/Identifiable.java create mode 100644 plugins/net.mograsim.machine/src/net/mograsim/machine/RegisterGroup.java create mode 100644 plugins/net.mograsim.machine/src/net/mograsim/machine/SimpleRegisterGroup.java create mode 100644 plugins/net.mograsim.machine/src/net/mograsim/machine/UnionRegisterGroup.java diff --git a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/AbstractAm2900MachineDefinition.java b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/AbstractAm2900MachineDefinition.java index fa40eb82..20f7c58f 100644 --- a/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/AbstractAm2900MachineDefinition.java +++ b/plugins/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/AbstractAm2900MachineDefinition.java @@ -10,6 +10,7 @@ import net.mograsim.logic.model.model.LogicModelModifiable; import net.mograsim.machine.ISASchema; import net.mograsim.machine.MachineDefinition; import net.mograsim.machine.Register; +import net.mograsim.machine.RegisterGroup; //we can't use the Singleton pattern here because a MachineDefinition needs a public parameterless constructor //(used for detecting installed machines in plugin.core) @@ -97,4 +98,10 @@ public class AbstractAm2900MachineDefinition implements MachineDefinition return Am2900MicroInstructionMemoryDefinition.instance; } + @Override + public Set getRegisterGroups() + { + return null; // TODO create groups for am2904, am2901-asmUsable, am2901-internal, ... + } + } diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Identifiable.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Identifiable.java new file mode 100644 index 00000000..2b05913c --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Identifiable.java @@ -0,0 +1,9 @@ +package net.mograsim.machine; + +public interface Identifiable +{ + /** + * Returns a human readable unique, consistent id of the object. + */ + String id(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java index 8f1ee265..1c4aa868 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/MachineDefinition.java @@ -39,6 +39,14 @@ public interface MachineDefinition */ Set getRegisters(); + /** + * Returns a set of all RegisterGroups that the machine contains + * + * @return all register groups present in the machine. + * @author Christian Femers + */ + Set getRegisterGroups(); + /** * The number of bits used by the machine to address main memory. Note that this should be the number of bits used in the CPU, not a * possibly different one used by the bus system. diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java index 4bcb7f25..979f1be3 100644 --- a/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/Register.java @@ -9,7 +9,7 @@ import java.util.Set; * @author Christian Femers * */ -public interface Register +public interface Register extends Identifiable { /** * The unique identifier of the register. This does not have to be the display name or name in the assembly language. @@ -17,6 +17,7 @@ public interface Register * @return the registers id as case sensitive String * @author Christian Femers */ + @Override String id(); /** diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/RegisterGroup.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/RegisterGroup.java new file mode 100644 index 00000000..4838590f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/RegisterGroup.java @@ -0,0 +1,16 @@ +package net.mograsim.machine; + +import java.util.Set; + +public interface RegisterGroup extends Identifiable +{ + /** + * Returns all Registers contained in this group and subgroups + */ + Set getRegisters(); + + /** + * Returns the sub groups of this group. May very well be an empty set. + */ + Set getSubGroups(); +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/SimpleRegisterGroup.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/SimpleRegisterGroup.java new file mode 100644 index 00000000..0c1d2ae5 --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/SimpleRegisterGroup.java @@ -0,0 +1,38 @@ +package net.mograsim.machine; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class SimpleRegisterGroup implements RegisterGroup +{ + + private final String id; + private final Set registers; + + protected SimpleRegisterGroup(String id, Register... registers) + { + this.id = id; + this.registers = Collections.unmodifiableSet(new HashSet<>(List.of(registers))); + } + + @Override + public String id() + { + return id; + } + + @Override + public Set getRegisters() + { + return registers; + } + + @Override + public Set getSubGroups() + { + return Set.of(); + } + +} diff --git a/plugins/net.mograsim.machine/src/net/mograsim/machine/UnionRegisterGroup.java b/plugins/net.mograsim.machine/src/net/mograsim/machine/UnionRegisterGroup.java new file mode 100644 index 00000000..bfe4248f --- /dev/null +++ b/plugins/net.mograsim.machine/src/net/mograsim/machine/UnionRegisterGroup.java @@ -0,0 +1,41 @@ +package net.mograsim.machine; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class UnionRegisterGroup implements RegisterGroup +{ + private final String id; + private final Set subGroups; + private final Set subGroupRegisters; + + public UnionRegisterGroup(String id, RegisterGroup... subGroups) + { + this.id = id; + this.subGroups = Collections.unmodifiableSet(new HashSet<>(List.of(subGroups))); + this.subGroupRegisters = this.subGroups.stream().flatMap(sg -> sg.getRegisters().stream()).distinct() + .collect(Collectors.toUnmodifiableSet()); + } + + @Override + public String id() + { + return id; + } + + @Override + public Set getRegisters() + { + return subGroupRegisters; + } + + @Override + public Set getSubGroups() + { + return subGroups; + } + +} -- 2.17.1