| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'instance-calculator/src/VHDLArchitecture.java')
| -rw-r--r-- | instance-calculator/src/VHDLArchitecture.java | 179 | 
1 files changed, 179 insertions, 0 deletions
| diff --git a/instance-calculator/src/VHDLArchitecture.java b/instance-calculator/src/VHDLArchitecture.java new file mode 100644 index 0000000..a3aa7ac --- /dev/null +++ b/instance-calculator/src/VHDLArchitecture.java @@ -0,0 +1,179 @@ +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Deque; +import java.util.Map; +import java.util.HashMap; + +public class VHDLArchitecture +{ +   private static final Map<String, VHDLArchitecture> FROM_ID; + +   static +   { +      FROM_ID = new HashMap<String, VHDLArchitecture>(); +   } + +   public static void resolve_all_waveforms () +   { +      for (final VHDLArchitecture arch: FROM_ID.values()) +      { +         arch.resolve_waveforms(); +      } +   } + +   public static void add_element (final String id) +   { +      if (!FROM_ID.containsKey(id)) +      { +         FROM_ID.put(id, new VHDLArchitecture(id)); +      } +   } + +   public static VHDLArchitecture get_from_id (final String id) +   { +      final VHDLArchitecture result; + +      result = FROM_ID.get(id); + +      if (result == null) +      { +         System.err.println +         ( +            "[E] Element " +            + id +            + " is used like an architecture, but is not declared as such" +            + " before that use." +         ); + +         System.exit(-1); +      } + +      return result; +   } + +   public static VHDLArchitecture find (final String id) +   { +      return FROM_ID.get(id); +   } + +/******************************************************************************/ +   private final Collection<VHDLProcess> processes; +   private final Collection<VHDLComponent> components; +   private final Collection<VHDLWaveform> waveforms; +   private final Deque<String> futur_waveforms; +   private final String id; + +   private VHDLEntity entity; + +   private VHDLArchitecture (final String id) +   { +      this.id = id; + +      processes = new ArrayList<VHDLProcess>(); +      components = new ArrayList<VHDLComponent>(); +      waveforms = new ArrayList<VHDLWaveform>(); +      futur_waveforms = new ArrayDeque<String>(); +   } + +   public VHDLEntity get_entity () +   { +      return entity; +   } + +   public void set_entity (final VHDLEntity e) +   { +      entity = e; +   } + +   public void add_process (final VHDLProcess ps) +   { +      if (!processes.contains(ps)) +      { +         processes.add(ps); +      } +   } + +   public void add_component (final VHDLComponent cmp) +   { +      if (!components.contains(cmp)) +      { +         components.add(cmp); +      } +   } + +   public Collection<VHDLComponent> get_components () +   { +      return components; +   } + +   public void add_waveform (final VHDLWaveform wfm) +   { +      if (!waveforms.contains(wfm)) +      { +         waveforms.add(wfm); +      } +   } + +   public void add_futur_waveform (final String fwfm) +   { +      if (!futur_waveforms.contains(fwfm)) +      { +         futur_waveforms.add(fwfm); +      } +   } + +   public void resolve_waveforms () +   { +      while (!futur_waveforms.isEmpty()) +      { +         final String src_id, wfm_id; + +         src_id = futur_waveforms.pop(); + +         wfm_id = Waveforms.get_waveform_id_from_id(src_id); +         add_waveform(VHDLWaveform.get_from_id(wfm_id)); +      } +   } + +   public void add_instance_to +   ( +      final Collection<VHDLProcess.Instance> process_instances, +      final Collection<VHDLWaveform.Instance> waveform_instances, +      final Map<VHDLWaveform, VHDLWaveform.Instance> local_conversion +   ) +   { +      for (final VHDLWaveform wfm: waveforms) +      { +         final VHDLWaveform.Instance i_wfm; + +         i_wfm = wfm.add_instance(entity); + +         waveform_instances.add(i_wfm); + +         local_conversion.put(wfm, i_wfm); +      } + +      for (final VHDLProcess ps: processes) +      { +         process_instances.add +         ( +            ps.generate_base_instance +            ( +               entity, +               waveform_instances +            ) +         ); +      } + +      for (final VHDLComponent cmp: components) +      { +         cmp.add_instance_content_to +         ( +            process_instances, +            waveform_instances, +            local_conversion +         ); +      } +   } +} | 


