First version of the new Verilog exporter
[Mograsim.git] / tests / net.mograsim.logic.model.verilog.tests / src / net / mograsim / logic / model / verilog / examples / ExportAm2900.java
1 package net.mograsim.logic.model.verilog.examples;
2
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;
8 import java.util.Set;
9 import java.util.stream.Collectors;
10 import java.util.stream.Stream;
11
12 import com.google.gson.JsonElement;
13
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;
38
39 public class ExportAm2900
40 {
41         public static void main(String[] args) throws IOException
42         {
43                 Am2900Loader.setup();
44                 try (Scanner sysin = new Scanner(System.in))
45                 {
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");
52
53                         System.out.print("Component ID to serialize recursively >");
54                         String rootComponentID = sysin.nextLine();
55                         {
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");
60
61                                 LogicModelModifiable model = new LogicModelModifiable();
62
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)//
129                                 ).map(c ->
130                                 {
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());
138
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());
145                         }
146                 }
147         }
148 }