Skip to content

Commit

Permalink
[logisim-debugger] Add CdM-8 and CdM-8e adapters
Browse files Browse the repository at this point in the history
  • Loading branch information
Intelix8996 committed Feb 10, 2024
1 parent 2d4ae0e commit 15d4f24
Show file tree
Hide file tree
Showing 3 changed files with 269 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package org.cdm.logisim.debugger.adapters;

import com.cburch.logisim.circuit.Circuit;
import com.cburch.logisim.circuit.CircuitState;
import com.cburch.logisim.circuit.SubcircuitFactory;
import com.cburch.logisim.comp.Component;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstanceState;
import org.cdm.logisim.debugger.DebuggerComponent;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static org.cdm.logisim.debugger.logisim.TunnelAdapter.getTunnelValue;

public class Cdm8CircuitAdapter implements ProcessorAdapter {
private Component processorComponent = null;

@Override
public String getDisplayName() {
return "CdM-8 (Circuit)";
}

@Override
public int getMemorySize() {
return 256;
}

@Override
public List<String> getRegisterNames() {
return Arrays.asList("r0", "r1", "r2", "r3", "pc", "sp", "ps");
}

@Override
public List<Integer> getRegisterSizes() {
return Arrays.asList(8, 8, 8, 8, 8, 8, 8);
}

@Override
public boolean supportsExceptions() {
return false;
}

@Override
public Component locateComponent(Circuit circuit) {
return circuit
.getNonWires()
.stream()
.filter(x -> x.getFactory() instanceof SubcircuitFactory && x.getFactory().getName().equals("CdM_8_mark5"))
.findAny()
.orElse(null);
}

@Override
public ProcessorState getState(CircuitState circuitState) {
Circuit currentCircuit = DebuggerComponent.getDebuggerCircuit();

if (processorComponent == null) {
processorComponent = locateComponent(currentCircuit);
}

if (processorComponent == null) {
return null;
}

InstanceState processorState = circuitState.getInstanceState(processorComponent);

List<Integer> registerPinNumbers = Arrays.asList(
PinNumbers.R0, PinNumbers.R1, PinNumbers.R2, PinNumbers.R3,
PinNumbers.PC, PinNumbers.SP, PinNumbers.PS
);

List<Integer> registerValues = registerPinNumbers.stream()
.map(processorState::getPort)
.map(Value::toIntValue)
.collect(Collectors.toList());

Circuit processorSubcircuit =
((SubcircuitFactory) processorComponent.getFactory()).getSubcircuit();

CircuitState processorSubcircuitState =
processorSubcircuit.getSubcircuitFactory().getSubstate(circuitState, processorComponent);

Integer fetchTunnel =
getTunnelValue("fetch", processorSubcircuit, processorSubcircuitState);

Integer stopTunnel =
getTunnelValue("stop", processorSubcircuit, processorSubcircuitState);

if (fetchTunnel == null || stopTunnel == null) {
return null;
}

return new ProcessorState() {
@Override
public boolean isFetching() {
return fetchTunnel == 1;
}

@Override
public boolean isHalted() {
return stopTunnel == 1;
}

@Override
public int getProgramCounter() {
return registerValues.get(4);
}

@Override
public List<Integer> getRegisters() {
return registerValues;
}
};
}

private static class PinNumbers {
private static final int R0 = 3;
private static final int R1 = 4;
private static final int R2 = 6;
private static final int R3 = 7;
private static final int PC = 8;
private static final int SP = 9;
private static final int PS = 10;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package org.cdm.logisim.debugger.adapters;

import com.cburch.logisim.circuit.Circuit;
import com.cburch.logisim.circuit.CircuitState;
import com.cburch.logisim.circuit.SubcircuitFactory;
import com.cburch.logisim.comp.Component;
import com.cburch.logisim.data.Value;
import com.cburch.logisim.instance.InstanceState;
import org.cdm.logisim.debugger.DebuggerComponent;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import static org.cdm.logisim.debugger.logisim.TunnelAdapter.getTunnelValue;

public class Cdm8eCircuitAdapter implements ProcessorAdapter {
private Component processorComponent = null;

@Override
public String getDisplayName() {
return "CdM-8e (Circuit)";
}

@Override
public int getMemorySize() {
return 256;
}

@Override
public List<String> getRegisterNames() {
return Arrays.asList("r0", "r1", "r2", "r3", "pc", "sp", "ps");
}

@Override
public List<Integer> getRegisterSizes() {
return Arrays.asList(8, 8, 8, 8, 16, 8, 8);
}

@Override
public boolean supportsExceptions() {
return false;
}

@Override
public Component locateComponent(Circuit circuit) {
return circuit
.getNonWires()
.stream()
.filter(x -> x.getFactory() instanceof SubcircuitFactory && x.getFactory().getName().equals("CdM_8_mark5"))
.findAny()
.orElse(null);
}

@Override
public ProcessorState getState(CircuitState circuitState) {
Circuit currentCircuit = DebuggerComponent.getDebuggerCircuit();

if (processorComponent == null) {
processorComponent = locateComponent(currentCircuit);
}

if (processorComponent == null) {
return null;
}

InstanceState processorState = circuitState.getInstanceState(processorComponent);

List<Integer> registerPinNumbers = Arrays.asList(
PinNumbers.R0, PinNumbers.R1, PinNumbers.R2, PinNumbers.R3,
PinNumbers.PC, PinNumbers.SP, PinNumbers.PS
);

List<Integer> registerValues = registerPinNumbers.stream()
.map(processorState::getPort)
.map(Value::toIntValue)
.collect(Collectors.toList());

Circuit processorSubcircuit =
((SubcircuitFactory) processorComponent.getFactory()).getSubcircuit();

CircuitState processorSubcircuitState =
processorSubcircuit.getSubcircuitFactory().getSubstate(circuitState, processorComponent);

Integer fetchTunnel =
getTunnelValue("fetch", processorSubcircuit, processorSubcircuitState);

Integer stopTunnel =
getTunnelValue("stop", processorSubcircuit, processorSubcircuitState);

if (fetchTunnel == null || stopTunnel == null) {
return null;
}

return new ProcessorState() {
@Override
public boolean isFetching() {
return fetchTunnel == 1;
}

@Override
public boolean isHalted() {
return stopTunnel == 1;
}

@Override
public int getProgramCounter() {
return registerValues.get(4);
}

@Override
public List<Integer> getRegisters() {
return registerValues;
}
};
}

private static class PinNumbers {
private static final int R0 = 3;
private static final int R1 = 4;
private static final int R2 = 6;
private static final int R3 = 7;
private static final int PC = 9;
private static final int SP = 10;
private static final int PS = 11;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.cdm.logisim.debugger.DebuggerComponent;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -13,6 +14,16 @@ public class ProcessorAdapterFactory {
private static final Map<String, List<ProcessorType>> supportedTargets = new HashMap<>();

static {
supportedTargets.put(
"cdm8",
Collections.singletonList(ProcessorType.CDM8)
);

supportedTargets.put(
"cdm8e",
Collections.singletonList(ProcessorType.CDM8E)
);

supportedTargets.put(
"cdm16",
Arrays.asList(ProcessorType.CDM16_CIRCUIT, ProcessorType.CDM16_EMU)
Expand All @@ -22,9 +33,9 @@ public class ProcessorAdapterFactory {
public static ProcessorAdapter getProcessorAdapter(ProcessorType processorType) {
switch (processorType) {
case CDM8:
throw new UnsupportedOperationException();
return new Cdm8CircuitAdapter();
case CDM8E:
throw new UnsupportedOperationException();
return new Cdm8eCircuitAdapter();
case CDM16_CIRCUIT:
return new Cdm16CircuitAdapter();
case CDM16_EMU:
Expand Down

0 comments on commit 15d4f24

Please sign in to comment.