b27b48534deca735f66bac0af7c78c228a785c0e
[Mograsim.git] / plugins / net.mograsim.logic.model.verilog / src / net / mograsim / logic / model / verilog / converter / VerilogEmulatedModelPin.java
1 package net.mograsim.logic.model.verilog.converter;
2
3 import java.util.Objects;
4 import java.util.Set;
5
6 import net.mograsim.logic.model.verilog.model.IOPort;
7 import net.mograsim.logic.model.verilog.model.Signal;
8
9 public class VerilogEmulatedModelPin
10 {
11         private final IOPort verilogPort;
12         private final int portIndex;
13         private final Set<PinNameBit> pinbits;
14         private final Type type;
15
16         public VerilogEmulatedModelPin(IOPort verilogPort, int portIndex, Set<PinNameBit> pinbits, Type type)
17         {
18                 this.verilogPort = Objects.requireNonNull(verilogPort);
19                 this.portIndex = portIndex;
20                 this.pinbits = Set.copyOf(pinbits);
21                 this.type = Objects.requireNonNull(type);
22
23                 check();
24         }
25
26         private void check()
27         {
28                 if (verilogPort.getWidth() != 2)
29                         throw new IllegalArgumentException("Every Verilog port has to have width 2");
30                 if (portIndex < 0)
31                         throw new IllegalArgumentException("Negative port index can't be negative");
32                 switch (type)
33                 {
34                 case PRE:
35                         if (verilogPort.getType() != Signal.Type.IO_INPUT)
36                                 throw new IllegalArgumentException("A PRE pin has to be an input");
37                         break;
38                 case OUT:
39                         if (verilogPort.getType() != Signal.Type.IO_OUTPUT)
40                                 throw new IllegalArgumentException("A OUT pin has to be an output");
41                         break;
42                 case RES:
43                         if (verilogPort.getType() != Signal.Type.IO_INPUT)
44                                 throw new IllegalArgumentException("A RES pin has to be an input");
45                         break;
46                 default:
47                         throw new IllegalStateException("Unknown enum constant: " + type);
48                 }
49         }
50
51         public IOPort getVerilogPort()
52         {
53                 return verilogPort;
54         }
55
56         public int getPortIndex()
57         {
58                 return portIndex;
59         }
60
61         public Set<PinNameBit> getPinbits()
62         {
63                 return pinbits;
64         }
65
66         public Type getType()
67         {
68                 return type;
69         }
70
71         @Override
72         public int hashCode()
73         {
74                 final int prime = 31;
75                 int result = 1;
76                 result = prime * result + ((pinbits == null) ? 0 : pinbits.hashCode());
77                 result = prime * result + portIndex;
78                 result = prime * result + ((type == null) ? 0 : type.hashCode());
79                 result = prime * result + ((verilogPort == null) ? 0 : verilogPort.hashCode());
80                 return result;
81         }
82
83         @Override
84         public boolean equals(Object obj)
85         {
86                 if (this == obj)
87                         return true;
88                 if (obj == null)
89                         return false;
90                 if (getClass() != obj.getClass())
91                         return false;
92                 VerilogEmulatedModelPin other = (VerilogEmulatedModelPin) obj;
93                 if (pinbits == null)
94                 {
95                         if (other.pinbits != null)
96                                 return false;
97                 } else if (!pinbits.equals(other.pinbits))
98                         return false;
99                 if (portIndex != other.portIndex)
100                         return false;
101                 if (type != other.type)
102                         return false;
103                 if (verilogPort == null)
104                 {
105                         if (other.verilogPort != null)
106                                 return false;
107                 } else if (!verilogPort.equals(other.verilogPort))
108                         return false;
109                 return true;
110         }
111
112         public static enum Type
113         {
114                 PRE, OUT, RES;
115         }
116 }