X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Ftables%2Fmi%2FInstructionView.java;h=58676562f185f9bcffd327c45c6569b1cc4e0f56;hb=7e700a185d137a754e47609e69cc044d0f65e9b3;hp=3af070f301cbd8b6a28f4b362ba41b788a3b04aa;hpb=58babf45ae7d259a296656451d796dbe601377a4;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java index 3af070f3..58676562 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java @@ -2,6 +2,7 @@ package net.mograsim.plugin.tables.mi; import java.io.File; import java.io.IOException; +import java.util.Arrays; import java.util.Optional; import org.eclipse.jface.viewers.ColumnLabelProvider; @@ -21,6 +22,7 @@ import net.mograsim.machine.mi.MicroInstructionDefinition; import net.mograsim.machine.mi.MicroInstructionMemory; import net.mograsim.machine.mi.MicroInstructionMemoryParseException; import net.mograsim.machine.mi.MicroInstructionMemoryParser; +import net.mograsim.machine.mi.parameters.MnemonicFamily; import net.mograsim.machine.mi.parameters.ParameterClassification; import net.mograsim.plugin.MachineContext; import net.mograsim.plugin.MachineContext.ContextObserver; @@ -134,26 +136,47 @@ public class InstructionView extends ViewPart implements ContextObserver int size = miDef.size(); columns = new TableViewerColumn[size + 1]; - TableViewerColumn col = createTableViewerColumn("Address", 200); + TableViewerColumn col = createTableViewerColumn("Address", generateLongestHexStrings(12)); columns[0] = col; col.setLabelProvider(new AddressLabelProvider()); - int bit = 0; + int bit = miDef.sizeInBits(); ParameterClassification[] classes = miDef.getParameterClassifications(); for (int i = 0; i < size; i++) { - int startBit = bit; - int endBit = (bit = bit + classes[i].getExpectedBits()) - 1; + int startBit = bit - 1; + int endBit = bit = bit - classes[i].getExpectedBits(); String name = startBit == endBit ? Integer.toString(startBit) : startBit + "..." + endBit; - int bounds = 20 + 20 * classes[i].getExpectedBits(); - col = createTableViewerColumn(name, bounds); + String[] longestPossibleContents; + switch (classes[i].getExpectedType()) + { + case INTEGER_IMMEDIATE: + longestPossibleContents = generateLongestHexStrings(classes[i].getExpectedBits()); + break; + case BOOLEAN_IMMEDIATE: + case MNEMONIC: + longestPossibleContents = ((MnemonicFamily) classes[i]).getStringValues(); + break; + default: + longestPossibleContents = new String[0]; + break; + } + + col = createTableViewerColumn(name, longestPossibleContents); columns[i + 1] = col; createEditingAndLabel(col, miDef, i); } } + private static final String[] HEX_DIGITS = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" }; + + private static String[] generateLongestHexStrings(int bitWidth) + { + return Arrays.stream(HEX_DIGITS).map(s -> "0x" + s.repeat((bitWidth + 3) / 4)).toArray(String[]::new); + } + private void createEditingAndLabel(TableViewerColumn col, MicroInstructionDefinition miDef, int index) { ParameterClassification parameterClassification = miDef.getParameterClassifications()[index]; @@ -182,12 +205,22 @@ public class InstructionView extends ViewPart implements ContextObserver col.getColumn().setToolTipText(miDef.getParameterDescription(index).orElse("")); } - private TableViewerColumn createTableViewerColumn(String title, int bound) + private TableViewerColumn createTableViewerColumn(String title, String... longestPossibleContents) { TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); TableColumn column = viewerColumn.getColumn(); + int maxWidth = 0; + for (String s : longestPossibleContents) + { + column.setText(s); + column.pack(); + if (column.getWidth() > maxWidth) + maxWidth = column.getWidth(); + } column.setText(title); - column.setWidth(bound); + column.pack(); + if (column.getWidth() < maxWidth) + column.setWidth(maxWidth); column.setResizable(true); column.setMoveable(false); return viewerColumn;