1 package net.mograsim.logic.model.verilog.examples;
3 import java.io.IOException;
4 import java.nio.file.Files;
5 import java.nio.file.Path;
6 import java.nio.file.Paths;
7 import java.util.Scanner;
9 import java.util.stream.Collectors;
10 import java.util.stream.Stream;
12 import com.google.gson.JsonElement;
14 import net.mograsim.logic.core.types.BitVector;
15 import net.mograsim.logic.model.am2900.Am2900Loader;
16 import net.mograsim.logic.model.am2900.components.ModelAm2900MPROM;
17 import net.mograsim.logic.model.am2900.components.ModelAm2900MainMemory;
18 import net.mograsim.logic.model.am2900.components.ModelAm2900MicroInstructionMemory;
19 import net.mograsim.logic.model.model.LogicModelModifiable;
20 import net.mograsim.logic.model.model.components.ModelComponent;
21 import net.mograsim.logic.model.model.components.Orientation;
22 import net.mograsim.logic.model.model.components.atomic.ModelBitDisplay;
23 import net.mograsim.logic.model.model.components.atomic.ModelClock;
24 import net.mograsim.logic.model.model.components.atomic.ModelClock.ModelClockParams;
25 import net.mograsim.logic.model.model.components.atomic.ModelFixedOutput;
26 import net.mograsim.logic.model.model.components.atomic.ModelNandGate;
27 import net.mograsim.logic.model.model.components.atomic.ModelSplitter;
28 import net.mograsim.logic.model.model.components.atomic.ModelSplitter.SplitterParams;
29 import net.mograsim.logic.model.model.components.atomic.ModelTextComponent;
30 import net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer;
31 import net.mograsim.logic.model.model.components.atomic.ModelTriStateBuffer.ModelTriStateBufferParams;
32 import net.mograsim.logic.model.model.wires.ModelWireCrossPoint;
33 import net.mograsim.logic.model.serializing.IdentifyParams;
34 import net.mograsim.logic.model.serializing.IndirectModelComponentCreator;
35 import net.mograsim.logic.model.verilog.converter.ModelComponentToVerilogComponentDeclarationMapping;
36 import net.mograsim.logic.model.verilog.converter.ModelComponentToVerilogConverter;
37 import net.mograsim.logic.model.verilog.model.VerilogComponentImplementation;
39 public class ExportAm2900
41 public static void main(String[] args) throws IOException
44 try (Scanner sysin = new Scanner(System.in))
46 System.out.print("Directory to export Verilog into >");
47 Path target = Paths.get(sysin.nextLine());
48 if (!Files.exists(target))
49 Files.createDirectories(target);
50 else if (!Files.isDirectory(target))
51 throw new IllegalArgumentException("Target exists and is not a directory");
53 System.out.print("Component ID to serialize recursively >");
54 String rootComponentID = sysin.nextLine();
56 if (!Files.exists(target))
57 Files.createDirectories(target);
58 else if (!Files.isDirectory(target))
59 throw new IllegalArgumentException("Target exists and is not a directory");
61 LogicModelModifiable model = new LogicModelModifiable();
63 Set<ModelComponentToVerilogComponentDeclarationMapping> atomicComponentMappings = Stream.of(//
64 new ModelNandGate(model, 1), //
65 new ModelFixedOutput(model, BitVector.SINGLE_0, null), //
66 new ModelFixedOutput(model, BitVector.SINGLE_1, null), //
67 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(1, Orientation.RIGHT)), //
68 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(1, Orientation.RIGHT_ALT)), //
69 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(1, Orientation.DOWN)), //
70 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(4, Orientation.RIGHT)), //
71 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(12, Orientation.RIGHT_ALT)), //
72 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(12, Orientation.DOWN)), //
73 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(16, Orientation.LEFT)), //
74 new ModelTriStateBuffer(model, new ModelTriStateBufferParams(16, Orientation.RIGHT_ALT)), //
75 new ModelWireCrossPoint(model, 1), //
76 new ModelWireCrossPoint(model, 2), //
77 new ModelWireCrossPoint(model, 4), //
78 new ModelWireCrossPoint(model, 9), //
79 new ModelWireCrossPoint(model, 12), //
80 new ModelWireCrossPoint(model, 16), //
81 new ModelSplitter(model, new SplitterParams(2, Orientation.LEFT)), //
82 new ModelSplitter(model, new SplitterParams(2, Orientation.RIGHT)), //
83 new ModelSplitter(model, new SplitterParams(2, Orientation.UP)), //
84 new ModelSplitter(model, new SplitterParams(2, Orientation.DOWN_ALT)), //
85 new ModelSplitter(model, new SplitterParams(3, Orientation.LEFT)), //
86 new ModelSplitter(model, new SplitterParams(3, Orientation.RIGHT)), //
87 new ModelSplitter(model, new SplitterParams(3, Orientation.UP)), //
88 new ModelSplitter(model, new SplitterParams(3, Orientation.DOWN)), //
89 new ModelSplitter(model, new SplitterParams(3, Orientation.DOWN_ALT)), //
90 new ModelSplitter(model, new SplitterParams(4, Orientation.LEFT)), //
91 new ModelSplitter(model, new SplitterParams(4, Orientation.RIGHT)), //
92 new ModelSplitter(model, new SplitterParams(4, Orientation.UP)), //
93 new ModelSplitter(model, new SplitterParams(4, Orientation.DOWN)), //
94 new ModelSplitter(model, new SplitterParams(4, Orientation.DOWN_ALT)), //
95 new ModelSplitter(model, new SplitterParams(5, Orientation.LEFT)), //
96 new ModelSplitter(model, new SplitterParams(5, Orientation.RIGHT)), //
97 new ModelSplitter(model, new SplitterParams(6, Orientation.LEFT)), //
98 new ModelSplitter(model, new SplitterParams(6, Orientation.RIGHT)), //
99 new ModelSplitter(model, new SplitterParams(6, Orientation.DOWN)), //
100 new ModelSplitter(model, new SplitterParams(6, Orientation.UP)), //
101 new ModelSplitter(model, new SplitterParams(6, Orientation.DOWN_ALT)), //
102 new ModelSplitter(model, new SplitterParams(8, Orientation.LEFT)), //
103 new ModelSplitter(model, new SplitterParams(8, Orientation.RIGHT)), //
104 new ModelSplitter(model, new SplitterParams(9, Orientation.LEFT)), //
105 new ModelSplitter(model, new SplitterParams(9, Orientation.DOWN)), //
106 new ModelSplitter(model, new SplitterParams(12, Orientation.LEFT)), //
107 new ModelSplitter(model, new SplitterParams(12, Orientation.RIGHT)), //
108 new ModelSplitter(model, new SplitterParams(12, Orientation.DOWN)), //
109 new ModelSplitter(model, new SplitterParams(12, Orientation.DOWN_ALT)), //
110 new ModelSplitter(model, new SplitterParams(13, Orientation.RIGHT)), //
111 new ModelSplitter(model, new SplitterParams(13, Orientation.DOWN)), //
112 new ModelSplitter(model, new SplitterParams(16, Orientation.LEFT)), //
113 new ModelSplitter(model, new SplitterParams(16, Orientation.RIGHT)), //
114 new ModelSplitter(model, new SplitterParams(16, Orientation.UP)), //
115 new ModelSplitter(model, new SplitterParams(16, Orientation.DOWN)), //
116 new ModelSplitter(model, new SplitterParams(16, Orientation.DOWN_ALT)), //
117 new ModelSplitter(model, new SplitterParams(80, Orientation.LEFT)), //
118 new ModelSplitter(model, new SplitterParams(80, Orientation.RIGHT)), //
119 new ModelSplitter(model, new SplitterParams(80, Orientation.UP_ALT)), //
120 new ModelClock(model, new ModelClockParams(7000, Orientation.RIGHT)), //
121 new ModelTextComponent(model, "A bus"), //
122 new ModelTextComponent(model, "MPM addr"), //
123 new ModelTextComponent(model, "D bus"), //
124 new ModelAm2900MainMemory(model, null), //
125 new ModelAm2900MPROM(model, null), //
126 new ModelAm2900MicroInstructionMemory(model, null), //
127 new ModelBitDisplay(model, 12), //
128 new ModelBitDisplay(model, 16)//
131 String id = c.getIDForSerializing(new IdentifyParams());
132 JsonElement params = c.getParamsForSerializingJSON(new IdentifyParams());
133 ModelComponentToVerilogComponentDeclarationMapping generateCanonicalDeclarationMapping = ModelComponentToVerilogConverter
134 .generateCanonicalDeclarationMapping(c, id, params, ModelComponentToVerilogConverter
135 .sanitizeVerilogID("mgs_" + id + (params.isJsonNull() ? "" : "_" + params)));
136 return generateCanonicalDeclarationMapping;
137 }).collect(Collectors.toSet());
139 ModelComponent root = IndirectModelComponentCreator.createComponent(model, rootComponentID);
140 Set<VerilogComponentImplementation> convertResult = ModelComponentToVerilogConverter.convert(atomicComponentMappings,
141 Set.of(root), "mgs_conv_");
142 for (VerilogComponentImplementation convertedComponent : convertResult)
143 Files.writeString(target.resolve(convertedComponent.getDeclaration().getID() + ".v"),
144 convertedComponent.toVerilogCode());