1 package net.mograsim.logic.model.verilog.converter;
3 import java.util.ArrayList;
6 import java.util.Objects;
8 import java.util.function.Function;
9 import java.util.stream.Collectors;
11 import com.google.gson.JsonElement;
13 import net.mograsim.logic.model.verilog.converter.VerilogEmulatedModelPin.Type;
14 import net.mograsim.logic.model.verilog.model.VerilogComponentDeclaration;
16 public class ModelComponentToVerilogComponentDeclarationMapping
18 private final String modelComponentID;
19 private final JsonElement modelComponentParams;
20 private final VerilogComponentDeclaration verilogComponentDeclaration;
21 private final Set<VerilogEmulatedModelPin> pinMapping;
23 private final Map<PinNameBit, VerilogEmulatedModelPin> prePinMapping;
24 private final Map<PinNameBit, VerilogEmulatedModelPin> outPinMapping;
25 private final Map<PinNameBit, VerilogEmulatedModelPin> resPinMapping;
26 private final List<VerilogEmulatedModelPin> reversePinMapping;
28 public ModelComponentToVerilogComponentDeclarationMapping(String modelComponentID, JsonElement modelComponentParams,
29 VerilogComponentDeclaration verilogComponentDeclaration, Set<VerilogEmulatedModelPin> pinMapping)
31 this.modelComponentID = Objects.requireNonNull(modelComponentID);
32 this.modelComponentParams = Objects.requireNonNull(modelComponentParams);
33 this.verilogComponentDeclaration = Objects.requireNonNull(verilogComponentDeclaration);
34 this.pinMapping = Set.copyOf(pinMapping);
36 this.reversePinMapping = checkAndCalculateReversePinMapping();
38 this.prePinMapping = filterPinMapping(Type.PRE);
39 this.outPinMapping = filterPinMapping(Type.OUT);
40 this.resPinMapping = filterPinMapping(Type.RES);
43 private List<VerilogEmulatedModelPin> checkAndCalculateReversePinMapping()
45 List<VerilogEmulatedModelPin> reverseMapping = new ArrayList<>(pinMapping.size());
46 for (int i = 0; i < pinMapping.size(); i++)
47 reverseMapping.add(null);
48 for (VerilogEmulatedModelPin verilogEmulatedModelPin : pinMapping)
50 int verilogPinIndex = verilogEmulatedModelPin.getPortIndex();
51 if (verilogComponentDeclaration.getIOPorts().get(verilogPinIndex) != verilogEmulatedModelPin.getVerilogPort())
52 throw new IllegalArgumentException("Incorrect IO port index for port: " + verilogEmulatedModelPin);
53 VerilogEmulatedModelPin oldVerilogEmulatedModelPin = reverseMapping.set(verilogPinIndex, verilogEmulatedModelPin);
54 if (oldVerilogEmulatedModelPin != null)
55 throw new IllegalArgumentException("Port is used twice: " + verilogEmulatedModelPin.getVerilogPort());
57 for (int i = 0; i < reverseMapping.size(); i++)
58 if (reverseMapping.get(i) == null)
59 throw new IllegalArgumentException("Unused IO port: " + verilogComponentDeclaration.getIOPorts().get(i));
60 return reverseMapping;
63 private Map<PinNameBit, VerilogEmulatedModelPin> filterPinMapping(Type filteredType)
65 return pinMapping.stream().filter(p -> p.getType() == filteredType)
66 .collect(Collectors.toMap(VerilogEmulatedModelPin::getPinbit, Function.identity()));
69 public String getModelComponentID()
71 return modelComponentID;
74 public JsonElement getModelComponentParams()
76 return modelComponentParams;
79 public VerilogComponentDeclaration getVerilogComponentDeclaration()
81 return verilogComponentDeclaration;
84 public Set<VerilogEmulatedModelPin> getPinMapping()
89 public Map<PinNameBit, VerilogEmulatedModelPin> getPrePinMapping()
94 public Map<PinNameBit, VerilogEmulatedModelPin> getOutPinMapping()
99 public Map<PinNameBit, VerilogEmulatedModelPin> getResPinMapping()
101 return resPinMapping;
104 public List<VerilogEmulatedModelPin> getReversePinMapping()
106 return reversePinMapping;
110 public int hashCode()
112 final int prime = 31;
114 result = prime * result + ((modelComponentID == null) ? 0 : modelComponentID.hashCode());
115 result = prime * result + ((pinMapping == null) ? 0 : pinMapping.hashCode());
116 result = prime * result + ((verilogComponentDeclaration == null) ? 0 : verilogComponentDeclaration.hashCode());
121 public boolean equals(Object obj)
127 if (getClass() != obj.getClass())
129 ModelComponentToVerilogComponentDeclarationMapping other = (ModelComponentToVerilogComponentDeclarationMapping) obj;
130 if (modelComponentID == null)
132 if (other.modelComponentID != null)
134 } else if (!modelComponentID.equals(other.modelComponentID))
136 if (pinMapping == null)
138 if (other.pinMapping != null)
140 } else if (!pinMapping.equals(other.pinMapping))
142 if (verilogComponentDeclaration == null)
144 if (other.verilogComponentDeclaration != null)
146 } else if (!verilogComponentDeclaration.equals(other.verilogComponentDeclaration))