summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'instance-calculator/src/ModelFile.java')
-rw-r--r--instance-calculator/src/ModelFile.java310
1 files changed, 310 insertions, 0 deletions
diff --git a/instance-calculator/src/ModelFile.java b/instance-calculator/src/ModelFile.java
new file mode 100644
index 0000000..be84674
--- /dev/null
+++ b/instance-calculator/src/ModelFile.java
@@ -0,0 +1,310 @@
+import java.io.IOException;
+import java.io.FileNotFoundException;
+
+public class ModelFile
+{
+ public static boolean load_file
+ (
+ final String filename
+ )
+ throws FileNotFoundException
+ {
+ final QuickParser qp;
+ String[] input;
+ boolean success;
+
+ qp = new QuickParser(filename);
+
+ for (;;)
+ {
+ try
+ {
+ input = qp.parse_line();
+
+ if (input == null)
+ {
+ qp.finalize();
+
+ return false;
+ }
+ else if (input.length == 0)
+ {
+ qp.finalize();
+
+ break;
+ }
+ }
+ catch (final IOException e)
+ {
+ System.err.println
+ (
+ "[E] IO error while parsing file \""
+ + filename
+ + "\":"
+ /* FIXME: can be null */
+ + e.getMessage()
+ );
+
+ return false;
+ }
+
+ if (input[0].equals("add_element"))
+ {
+ success = handle_add_element(input);
+ }
+ else if (input[0].equals("is_accessed_by"))
+ {
+ success = handle_is_accessed_by(input);
+ }
+ else if (input[0].equals("is_waveform_of"))
+ {
+ success = handle_is_waveform_of(input);
+ }
+ else if (input[0].equals("is_port_of"))
+ {
+ success = handle_is_port_of(input);
+ }
+ else if (input[0].equals("is_architecture_of"))
+ {
+ success = handle_is_architecture_of(input);
+ }
+ else if (input[0].equals("belongs_to_architecture"))
+ {
+ success = handle_belongs_to_architecture(input);
+ }
+ else if (input[0].equals("is_component_of"))
+ {
+ success = handle_is_component_of(input);
+ }
+ else if (input[0].equals("port_maps"))
+ {
+ success = handle_port_maps(input);
+ }
+ else
+ {
+ continue;
+ }
+
+ if (!success)
+ {
+ System.err.println
+ (
+ "[E] An erroneous instruction was found in file \""
+ + filename
+ + "\"."
+ );
+
+ try
+ {
+ qp.finalize();
+ }
+ catch (final Exception e)
+ {
+ System.err.println("[E] Additionally:");
+ e.printStackTrace();
+ }
+
+ return false;
+ }
+ }
+
+ VHDLArchitecture.resolve_all_waveforms();
+
+ return true;
+ }
+
+ private static boolean handle_add_element
+ (
+ final String[] input
+ )
+ {
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ if (input[1].equals("entity"))
+ {
+ VHDLEntity.add_element(input[2]);
+ }
+ else if (input[1].equals("architecture"))
+ {
+ VHDLArchitecture.add_element(input[2]);
+ }
+ else if (input[1].equals("waveform"))
+ {
+ VHDLWaveform.add_element(input[2]);
+ }
+ else if (input[1].equals("process"))
+ {
+ VHDLProcess.add_element(input[2]);
+ }
+ else if (input[1].equals("component"))
+ {
+ VHDLComponent.add_element(input[2]);
+ }
+
+ return true;
+ }
+
+ private static boolean handle_is_accessed_by
+ (
+ final String[] input
+ )
+ {
+ final VHDLProcess ps;
+ final VHDLWaveform wfm;
+
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ ps = VHDLProcess.get_from_id(input[2]);
+ wfm = VHDLWaveform.find(input[1]);
+
+ if (wfm != null)
+ {
+ /*
+ * Assumes that otherwise it's a string, but that could also be due to
+ * an inconsistent model.
+ */
+
+ ps.add_accessed_wfm(wfm);
+ }
+
+ return true;
+ }
+
+ private static boolean handle_is_waveform_of
+ (
+ final String[] input
+ )
+ {
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ Waveforms.register_map(input[1], input[2]);
+
+ return true;
+ }
+
+ private static boolean handle_is_port_of
+ (
+ final String[] input
+ )
+ {
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ VHDLEntity.get_from_id(input[2]).add_port(input[1]);
+
+ return true;
+ }
+
+ private static boolean handle_is_architecture_of
+ (
+ final String[] input
+ )
+ {
+ final VHDLEntity e;
+ final VHDLArchitecture arch;
+
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ e = VHDLEntity.get_from_id(input[2]);
+ arch = VHDLArchitecture.get_from_id(input[1]);
+
+ e.set_architecture(arch);
+ arch.set_entity(e);
+
+ return true;
+ }
+
+ private static boolean handle_belongs_to_architecture
+ (
+ final String[] input
+ )
+ {
+ final VHDLArchitecture arch;
+ final VHDLProcess ps;
+ final VHDLComponent cmp;
+
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ arch = VHDLArchitecture.get_from_id(input[2]);
+
+ ps = VHDLProcess.find(input[1]);
+
+ if (ps != null)
+ {
+ arch.add_process(ps);
+ ps.set_architecture(arch);
+
+ return true;
+ }
+
+ cmp = VHDLComponent.find(input[1]);
+
+ if (cmp != null)
+ {
+ arch.add_component(cmp);
+ cmp.set_architecture(arch);
+
+ return true;
+ }
+
+ arch.add_futur_waveform(input[1]);
+
+ return true;
+ }
+
+ private static boolean handle_is_component_of
+ (
+ final String[] input
+ )
+ {
+ if (input.length != 3)
+ {
+ return false;
+ }
+
+ VHDLComponent.get_from_id(input[1]).set_destination
+ (
+ VHDLEntity.get_from_id(input[2])
+ );
+
+ return true;
+ }
+
+ private static boolean handle_port_maps
+ (
+ final String[] input
+ )
+ {
+ if (input.length != 4)
+ {
+ return false;
+ }
+
+ VHDLComponent.get_from_id(input[1]).add_port_map
+ (
+ input[2],
+ input[3]
+ );
+
+ return true;
+ }
+
+ private ModelFile () {} /* Utility Class */
+}