| summaryrefslogtreecommitdiff | 
path: root/instance-calculator
diff options
Diffstat (limited to 'instance-calculator')
| -rw-r--r-- | instance-calculator/Makefile | 2 | ||||
| -rw-r--r-- | instance-calculator/src/Instances.java | 22 | ||||
| -rw-r--r-- | instance-calculator/src/Main.java | 3 | ||||
| -rw-r--r-- | instance-calculator/src/ModelFile.java | 16 | ||||
| -rw-r--r-- | instance-calculator/src/OutputFile.java | 135 | ||||
| -rw-r--r-- | instance-calculator/src/Parameters.java | 17 | ||||
| -rw-r--r-- | instance-calculator/src/VHDLArchitecture.java | 31 | ||||
| -rw-r--r-- | instance-calculator/src/VHDLComponent.java | 31 | ||||
| -rw-r--r-- | instance-calculator/src/VHDLEntity.java | 17 | ||||
| -rw-r--r-- | instance-calculator/src/VHDLProcess.java | 63 | ||||
| -rw-r--r-- | instance-calculator/src/VHDLWaveform.java | 51 | 
11 files changed, 350 insertions, 38 deletions
diff --git a/instance-calculator/Makefile b/instance-calculator/Makefile index 356b681..25d31cc 100644 --- a/instance-calculator/Makefile +++ b/instance-calculator/Makefile @@ -67,7 +67,7 @@ clean_solutions:  	$(JAVAC) -cp $(CLASSPATH) $<  $(OUTPUT_FILE): $(MODEL_FILE) $(CLASSES) -	$(JAVA) -cp $(CLASSPATH) Main $(MODEL_FILE) "inst_" $@ +	$(JAVA) -cp $(CLASSPATH) Main $(MODEL_FILE) "inst_" $(INSTANCE_MODEL_DIR)  $(INSTANCE_MODEL_DIR):  	mkdir -p $(INSTANCE_MODEL_DIR) diff --git a/instance-calculator/src/Instances.java b/instance-calculator/src/Instances.java index 5d6ec8b..d4954d9 100644 --- a/instance-calculator/src/Instances.java +++ b/instance-calculator/src/Instances.java @@ -2,11 +2,13 @@ import java.util.*;  public class Instances  { -   private static final Map<Integer, String> instances; +   private static final Map<Integer, String> INSTANCES; +   private static final OutputFile OUTPUT_FILE;     static     { -      instances = new HashMap<Integer, String>(); +      INSTANCES = new HashMap<Integer, String>(); +      OUTPUT_FILE = OutputFile.new_output_file("instances.mod");     }     public static String get_id_for (final int i) @@ -16,15 +18,27 @@ public class Instances        j = new Integer(i); -      result = instances.get(j); +      result = INSTANCES.get(j);        if (result == null)        {           result = (Main.get_parameters().get_id_prefix() + i); -         instances.put(j, result); +         INSTANCES.put(j, result);        }        return result;     } + +   public static void write_predicates () +   { +      for (final String id: INSTANCES.values()) +      { +         OUTPUT_FILE.write("(add_element instance "); +         OUTPUT_FILE.write(id); +         OUTPUT_FILE.write(")"); + +         OUTPUT_FILE.insert_newline(); +      } +   }  } diff --git a/instance-calculator/src/Main.java b/instance-calculator/src/Main.java index b521324..a23da06 100644 --- a/instance-calculator/src/Main.java +++ b/instance-calculator/src/Main.java @@ -37,6 +37,8 @@ public class Main        }        create_instances(); +      Instances.write_predicates(); +      OutputFile.close_all();     }     private static void create_instances () @@ -84,6 +86,7 @@ public class Main                 e.generate_instance(); +               e.write_predicates();                 processed_candidates.add(e);              }              else diff --git a/instance-calculator/src/ModelFile.java b/instance-calculator/src/ModelFile.java index 8589116..1f9297e 100644 --- a/instance-calculator/src/ModelFile.java +++ b/instance-calculator/src/ModelFile.java @@ -107,6 +107,8 @@ public class ModelFile           }        } +      VHDLArchitecture.resolve_all_waveforms(); +        return true;     } @@ -233,8 +235,6 @@ public class ModelFile        final VHDLArchitecture arch;        final VHDLProcess ps;        final VHDLComponent cmp; -      final String wfm_id; -      final VHDLWaveform wfm;        if (input.length != 3)        { @@ -263,17 +263,7 @@ public class ModelFile           return true;        } -      wfm_id = Waveforms.find_waveform_id_from_id(input[1]); - -      if (wfm_id != null) -      { -         wfm = VHDLWaveform.get_from_id(wfm_id); - -         arch.add_waveform(wfm); -         wfm.set_architecture(arch); - -         return true; -      } +      arch.add_futur_waveform(input[1]);        return true;     } diff --git a/instance-calculator/src/OutputFile.java b/instance-calculator/src/OutputFile.java new file mode 100644 index 0000000..201ca2b --- /dev/null +++ b/instance-calculator/src/OutputFile.java @@ -0,0 +1,135 @@ +import java.util.ArrayList; +import java.util.Collection; + +import java.io.File; +import java.io.FileWriter; +import java.io.BufferedWriter; + +public class OutputFile +{ +   private static Collection<OutputFile> ALL_OUTPUT_FILES; + +   static +   { +      ALL_OUTPUT_FILES = new ArrayList<OutputFile>(); +   } + +   public static void close_all () +   { +      for (final OutputFile f: ALL_OUTPUT_FILES) +      { +         f.close(); +      } +   } + +   public static OutputFile new_output_file (final String filename) +   { +      final OutputFile result; + +      result = +         new OutputFile +         ( +            Main.get_parameters().get_output_directory() +            + "/" +            + filename +         ); + +      ALL_OUTPUT_FILES.add(result); + +      return result; +   } + +   /** Non-Static *************************************************************/ +   private final String filename; +   private final BufferedWriter buffered_writer; + +   private OutputFile (final String filename) +   { +      BufferedWriter bf; + +      this.filename = filename; + +      try +      { +         bf = new BufferedWriter(new FileWriter(new File(filename))); +      } +      catch (final Exception e) +      { +         bf = null; + +         System.err.println +         ( +            "[F] Could not create new output file \"" +            + filename +            + "\":" +         ); + +         e.printStackTrace(); + +         System.exit(-1); +      } + +      buffered_writer = bf; +   } + +   public void write (final String data) +   { +      try +      { +         buffered_writer.write(data); +      } +      catch (final Exception e) +      { +         System.err.println +         ( +            "[F] Could not write to output file \"" +            + filename +            + "\":" +         ); + +         e.printStackTrace(); + +         System.exit(-1); +      } +   } + +   public void insert_newline () +   { +      try +      { +         buffered_writer.newLine(); +      } +      catch (final Exception e) +      { +         System.err.println +         ( +            "[F] Could not write to output file \"" +            + filename +            + "\":" +         ); + +         e.printStackTrace(); + +         System.exit(-1); +      } +   } + +   private void close () +   { +      try +      { +         buffered_writer.close(); +      } +      catch (final Exception e) +      { +         System.err.println +         ( +            "[E] Could not properly close output file \"" +            + filename +            + "\":" +         ); + +         e.printStackTrace(); +      } +   } +} diff --git a/instance-calculator/src/Parameters.java b/instance-calculator/src/Parameters.java index e01f912..b8bba30 100644 --- a/instance-calculator/src/Parameters.java +++ b/instance-calculator/src/Parameters.java @@ -2,7 +2,7 @@ public class Parameters  {     private final String model_file;     private final String id_prefix; -   private final String output_file; +   private final String output_dir;     private final boolean are_valid;     public static void print_usage () @@ -11,12 +11,12 @@ public class Parameters        (           "Instance-Calculator\n"           + "USAGE:\n" -         + "\tjava Main <INSTRUCTIONS> <ID_PREFIX> <OUTPUT_FILE>\n" +         + "\tjava Main <INSTRUCTIONS> <ID_PREFIX> <OUTPUT_DIR>\n"           + "PARAMETERS:\n"           + "\t<INSTRUCTIONS>\tInstruction file describing the model.\n"           + "\t<ID_PREFIX>\tPrefix for the IDs of generated paths.\n" -         + "\t<OUTPUT_FILE>\tFile in which to output the generated" -         + " instructions." +         + "\t<OUTPUT_DIR>\tDirectory in which to output the generated" +         + " instruction files."        );     } @@ -28,7 +28,7 @@ public class Parameters           model_file = new String();           id_prefix = new String(); -         output_file = new String(); +         output_dir = new String();           are_valid = false;        } @@ -36,7 +36,8 @@ public class Parameters        {           model_file = args[0];           id_prefix = args[1]; -         output_file = args[2]; +         output_dir = args[2]; +           are_valid = true;        }     } @@ -51,9 +52,9 @@ public class Parameters        return id_prefix;     } -   public String get_output_file () +   public String get_output_directory ()     { -      return output_file; +      return output_dir;     }     public boolean are_valid () diff --git a/instance-calculator/src/VHDLArchitecture.java b/instance-calculator/src/VHDLArchitecture.java index 5597529..407a09f 100644 --- a/instance-calculator/src/VHDLArchitecture.java +++ b/instance-calculator/src/VHDLArchitecture.java @@ -9,6 +9,14 @@ public class VHDLArchitecture        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)) @@ -48,6 +56,7 @@ public class VHDLArchitecture     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; @@ -59,6 +68,7 @@ public class VHDLArchitecture        processes = new ArrayList<VHDLProcess>();        components = new ArrayList<VHDLComponent>();        waveforms = new ArrayList<VHDLWaveform>(); +      futur_waveforms = new ArrayDeque<String>();     }     public VHDLEntity get_entity () @@ -100,6 +110,27 @@ public class VHDLArchitecture        }     } +   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, diff --git a/instance-calculator/src/VHDLComponent.java b/instance-calculator/src/VHDLComponent.java index fb05c6e..958a2e4 100644 --- a/instance-calculator/src/VHDLComponent.java +++ b/instance-calculator/src/VHDLComponent.java @@ -45,7 +45,7 @@ public class VHDLComponent     }  /******************************************************************************/ -   private final Map<String, String> port_map; +   private final Map<String, String> reverse_port_map;     private final String id;     private VHDLEntity destination; @@ -68,7 +68,7 @@ public class VHDLComponent     public void add_port_map (final String src, final String dest)     { -      port_map.put(src, dest); +      reverse_port_map.put(dest, src);     }     public void add_instance_content_to @@ -89,28 +89,35 @@ public class VHDLComponent        for (final VHDLWaveform.Instance i_wfm: dest_waveform_instances)        { -         final String dest; +         final String src_wfm, dest_port;           final VHDLWaveform.Instance replacement; -         dest = -            port_map.get +         dest_port = +            Waveforms.get_id_from_waveform_id              ( -               Waveforms.get_id_from_waveform_id -               ( -                  i_wfm.get_parent().get_id() -               ) +               i_wfm.get_parent().get_id()              ); -         if (dest == null) +         src_wfm = reverse_port_map.get(dest_port); + +         if (src_wfm == null)           { +            /* i_wfm is not linked to a port, so it needs a new instance. */              replacement = i_wfm.get_parent().add_instance(parent.get_entity());           }           else           { +            /* +             * i_wfm is linked to a port. Replace it by what's connected to the +             * port. +             */              replacement =                 local_conversion.get                 ( -                  Waveforms.get_waveform_id_from_id(dest) +                  VHDLWaveform.get_from_id +                  ( +                     src_wfm +                  )                 );           } @@ -131,6 +138,6 @@ public class VHDLComponent     {        this.id = id; -      port_map = new HashMap<String, String>(); +      reverse_port_map = new HashMap<String, String>();     }  } diff --git a/instance-calculator/src/VHDLEntity.java b/instance-calculator/src/VHDLEntity.java index 91de6f6..2765229 100644 --- a/instance-calculator/src/VHDLEntity.java +++ b/instance-calculator/src/VHDLEntity.java @@ -1,4 +1,5 @@  import java.util.*; +import java.io.BufferedWriter;  public class VHDLEntity  { @@ -53,6 +54,7 @@ public class VHDLEntity     private final Collection<VHDLProcess.Instance> process_instances;     private final Collection<VHDLWaveform.Instance> waveform_instances; +   private final OutputFile output_file;     private final Collection<String> ports;     private final String id; @@ -67,6 +69,8 @@ public class VHDLEntity        this.process_instances = new ArrayList<VHDLProcess.Instance>();        this.waveform_instances = new ArrayList<VHDLWaveform.Instance>(); + +      output_file = OutputFile.new_output_file("instances_in_" + id + ".mod");     }     public String get_id () @@ -128,4 +132,17 @@ public class VHDLEntity           local_conversion        );     } + +   public void write_predicates () +   { +      for (final VHDLWaveform.Instance iwfm: waveform_instances) +      { +         iwfm.write_predicates_to(output_file); +      } + +      for (final VHDLProcess.Instance ips: process_instances) +      { +         ips.write_predicates_to(output_file); +      } +   }  } diff --git a/instance-calculator/src/VHDLProcess.java b/instance-calculator/src/VHDLProcess.java index d54e0cc..eba5e46 100644 --- a/instance-calculator/src/VHDLProcess.java +++ b/instance-calculator/src/VHDLProcess.java @@ -1,4 +1,5 @@  import java.util.*; +import java.io.BufferedWriter;  public class VHDLProcess  { @@ -61,6 +62,11 @@ public class VHDLProcess        architecture = null;     } +   public String get_id () +   { +      return id; +   } +     public void add_accessed_wfm (final VHDLWaveform wfm)     {        if (!accessed_wfm.contains(wfm)) @@ -172,5 +178,62 @@ public class VHDLProcess           return result;        } + +      public void write_predicates_to (final OutputFile of) +      { +         final Set<Map.Entry<VHDLWaveform.Instance, VHDLWaveform>> iwfm_set; + +         iwfm_set = iwfm_map.entrySet(); + +         try +         { +            of.write("(is_process_instance "); +            of.write(id); +            of.write(" "); +            of.write(parent.get_id()); +            of.write(")"); +            of.insert_newline(); + +            of.write("(is_visible_in "); +            of.write(id); +            of.write(" "); +            of.write(parent.get_id()); +            of.write(" "); +            of.write(visibility.get_id()); +            of.write(")"); +            of.insert_newline(); + +            for +            ( +               final Map.Entry<VHDLWaveform.Instance, VHDLWaveform> iwfm: +               iwfm_set +            ) +            { +               of.write("(process_instance_maps "); +               of.write(id); +               of.write(" "); +               of.write(parent.get_id()); +               of.write(" "); +               of.write(iwfm.getKey().get_id()); +               of.write(" "); +               of.write(iwfm.getKey().get_parent().get_id()); +               of.write(" "); +               of.write(iwfm.getValue().get_id()); +               of.write(")"); +               of.insert_newline(); +            } +         } +         catch (final Exception e) +         { +            System.err.println +            ( +               "[F] Could not write to output file:" +            ); + +            e.printStackTrace(); + +            System.exit(-1); +         } +      }     }  } diff --git a/instance-calculator/src/VHDLWaveform.java b/instance-calculator/src/VHDLWaveform.java index eb5c38e..74edc88 100644 --- a/instance-calculator/src/VHDLWaveform.java +++ b/instance-calculator/src/VHDLWaveform.java @@ -1,4 +1,5 @@  import java.util.*; +import java.io.BufferedWriter;  public class VHDLWaveform  { @@ -95,6 +96,12 @@ public class VHDLWaveform        architecture = arch;     } +   @Override +   public String toString () +   { +      return id; +   } +     public static class Instance     {        private final String id; @@ -113,9 +120,53 @@ public class VHDLWaveform           this.visibility = visibility;        } +      public String get_id () +      { +         return id; +      } +        public VHDLWaveform get_parent ()        {           return parent;        } + +      public void write_predicates_to (final OutputFile of) +      { +         try +         { +            of.write("(is_waveform_instance "); +            of.write(id); +            of.write(" "); +            of.write(parent.get_id()); +            of.write(")"); +            of.insert_newline(); + +            of.write("(is_visible_in "); +            of.write(id); +            of.write(" "); +            of.write(parent.get_id()); +            of.write(" "); +            of.write(visibility.get_id()); +            of.write(")"); +            of.insert_newline(); +         } +         catch (final Exception e) +         { +            System.err.println +            ( +               "[F] Could not write to output file:" +            ); + +            e.printStackTrace(); + +            System.exit(-1); +         } +      } + +      @Override +      public String toString () +      { +         return "<" + parent.get_id() + ", " + id + ">"; +      }     }  }  | 


