dcce7606e0f33d102eb54dc152d9f74fd3608507
[Mograsim.git] / plugins / net.mograsim.logic.model.verilog / src / net / mograsim / logic / model / verilog / model / statements / ComponentReference.java
1 package net.mograsim.logic.model.verilog.model.statements;
2
3 import java.util.List;
4 import java.util.Objects;
5 import java.util.Set;
6 import java.util.stream.Collectors;
7
8 import net.mograsim.logic.model.verilog.model.VerilogComponentDeclaration;
9 import net.mograsim.logic.model.verilog.model.expressions.Expression;
10 import net.mograsim.logic.model.verilog.model.signals.IOPort;
11 import net.mograsim.logic.model.verilog.model.signals.Signal;
12
13 public class ComponentReference extends Statement
14 {
15         private final String name;
16         private final VerilogComponentDeclaration referencedComponent;
17         private final List<Expression> arguments;
18
19         public ComponentReference(String name, VerilogComponentDeclaration referencedComponent, List<Expression> arguments)
20         {
21                 this.name = Objects.requireNonNull(name);
22                 this.referencedComponent = Objects.requireNonNull(referencedComponent);
23                 this.arguments = List.copyOf(arguments);
24
25                 check();
26         }
27
28         private void check()
29         {
30                 List<IOPort> ioPorts = referencedComponent.getIOPorts();
31                 if (ioPorts.size() != arguments.size())
32                         throw new IllegalArgumentException(
33                                         "Incorrect nubmer of arguments given: " + arguments.size() + ", but should be " + ioPorts.size());
34
35                 for (int i = 0; i < ioPorts.size(); i++)
36                         if (ioPorts.get(i).getWidth() != arguments.get(i).getWidth())
37                                 throw new IllegalArgumentException("Argument #" + i + "(" + ioPorts.get(i) + "): Incorrect width: "
38                                                 + arguments.get(i).getWidth() + ", but shoud be " + ioPorts.get(i).getWidth());
39         }
40
41         public String getName()
42         {
43                 return name;
44         }
45
46         public VerilogComponentDeclaration getReferencedComponent()
47         {
48                 return referencedComponent;
49         }
50
51         public List<Expression> getArguments()
52         {
53                 return arguments;
54         }
55
56         @Override
57         public String toVerilogCode()
58         {
59                 StringBuilder sb = new StringBuilder();
60
61                 sb.append(referencedComponent.getID() + " " + name);
62                 sb.append(arguments.stream().map(Expression::toVerilogCode).collect(Collectors.joining(", ", "(", ")")));
63                 sb.append(";");
64
65                 return sb.toString();
66         }
67
68         @Override
69         public Set<String> getDefinedNames()
70         {
71                 return Set.of(name);
72         }
73
74         @Override
75         public Set<Signal> getDefinedSignals()
76         {
77                 return Set.of();
78         }
79
80         @Override
81         public Set<Signal> getReferencedSignals()
82         {
83                 return arguments.stream().map(Expression::getReferencedSignals).flatMap(Set::stream).collect(Collectors.toUnmodifiableSet());
84         }
85
86         @Override
87         public String toString()
88         {
89                 return name + "[" + referencedComponent.getID() + "]";
90         }
91
92         @Override
93         public int hashCode()
94         {
95                 final int prime = 31;
96                 int result = 1;
97                 result = prime * result + ((arguments == null) ? 0 : arguments.hashCode());
98                 result = prime * result + ((name == null) ? 0 : name.hashCode());
99                 result = prime * result + ((referencedComponent == null) ? 0 : referencedComponent.hashCode());
100                 return result;
101         }
102
103         @Override
104         public boolean equals(Object obj)
105         {
106                 if (this == obj)
107                         return true;
108                 if (obj == null)
109                         return false;
110                 if (getClass() != obj.getClass())
111                         return false;
112                 ComponentReference other = (ComponentReference) obj;
113                 if (arguments == null)
114                 {
115                         if (other.arguments != null)
116                                 return false;
117                 } else if (!arguments.equals(other.arguments))
118                         return false;
119                 if (name == null)
120                 {
121                         if (other.name != null)
122                                 return false;
123                 } else if (!name.equals(other.name))
124                         return false;
125                 if (referencedComponent == null)
126                 {
127                         if (other.referencedComponent != null)
128                                 return false;
129                 } else if (!referencedComponent.equals(other.referencedComponent))
130                         return false;
131                 return true;
132         }
133 }