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