diff --git a/src/main/java/syscamstranslator/SysCAMSTBlockTDF.java b/src/main/java/syscamstranslator/SysCAMSTBlockTDF.java index 12f8bc9edfc36a496ba070b73053245a7fe019ac..6b59d50f5056295d44133a274fa47879b374366a 100644 --- a/src/main/java/syscamstranslator/SysCAMSTBlockTDF.java +++ b/src/main/java/syscamstranslator/SysCAMSTBlockTDF.java @@ -68,6 +68,7 @@ public class SysCAMSTBlockTDF extends SysCAMSTComponent { private LinkedList<SysCAMSTPortConverter> portConverter; private SysCAMSTPortConverter localPortConverter; private int n; + private boolean isTimestepPropagated; public SysCAMSTBlockTDF(String _name, double _period, String _time, String _processCode, DefaultListModel<String> _listStruct, String _nameTemplate, String _typeTemplate, DefaultListModel<String> _listTypedef, SysCAMSTCluster _cluster) { name = _name; @@ -82,6 +83,7 @@ public class SysCAMSTBlockTDF extends SysCAMSTComponent { portTDF = new LinkedList<SysCAMSTPortTDF>(); portConverter = new LinkedList<SysCAMSTPortConverter>(); n = 0; + isTimestepPropagated = false; } public String getName() { @@ -139,6 +141,14 @@ public class SysCAMSTBlockTDF extends SysCAMSTComponent { public void addPortConverter(SysCAMSTPortConverter converter){ portConverter.add(converter); } + + public boolean getIsTimestepPropagated() { + return isTimestepPropagated; + } + + public void setIsTimestepPropagated() { + isTimestepPropagated = true; + } public void syncTDFBlockDEBlock(double[] time_prev) throws SysCAMSValidateException { double tp; @@ -196,12 +206,12 @@ public class SysCAMSTBlockTDF extends SysCAMSTComponent { } System.out.println("time_prev_max_out: " + time_prev_max[1]); - if(time_now_min_de < time_prev_max[1]) { + if(time_now_min_tdf < time_prev_max[1]) { localPortConverter.setDelay((int)Math.ceil((time_prev_max[1]-time_now_min_de)/tp) + d); localPortConverter.setRecompute(true); throw new SysCAMSValidateException("Timestamp of previous write port executed module is: " + time_prev_max[1] - + " and current timestamp is: " + time_now_min_de + ".\n" - + "Suggested delay in port \"" + localPortConverter.getName() + "\": " + (Math.ceil((time_prev_max[1]-time_now_min_de)/tp) + d)); + + " and current timestamp is: " + time_now_min_tdf + ".\n" + + "Suggested delay in port \"" + localPortConverter.getName() + "\": " + (Math.ceil((time_prev_max[1]-time_now_min_tdf)/tp) + d)); } time_prev_max[0] = Double.valueOf(Math.max(time_prev_max[0],time_now_max_de)); System.out.println("New time_prev_max_in: " + time_prev_max[0]); @@ -232,8 +242,8 @@ public class SysCAMSTBlockTDF extends SysCAMSTComponent { for (k = 1; k <= r; k++) { time_tmp_tdf = (n*tm)+((k-1)*tp); time_tmp_de = (n*tm)+((k-1)*tp)+(d*tp);; - System.out.println("tmstmp_in_tdf: " + time_tmp_tdf); - System.out.println("tmstmp_in_de: " + time_tmp_de); + System.out.println("tmstmp_out_tdf: " + time_tmp_tdf); + System.out.println("tmstmp_out_de: " + time_tmp_de); time_now_min_tdf = Math.min(time_tmp_tdf, time_now_min_tdf); time_now_max_tdf = Math.max(time_tmp_tdf, time_now_max_tdf); time_now_min_de = Math.min(time_tmp_de, time_now_min_de); diff --git a/src/main/java/ui/SysCAMSPanelTranslator.java b/src/main/java/ui/SysCAMSPanelTranslator.java index 67e98f79bfc3bd61d4d57fd6fe26408a065d7c23..c590afb21c4b313d4d822e5d689fc5487a6e0397 100644 --- a/src/main/java/ui/SysCAMSPanelTranslator.java +++ b/src/main/java/ui/SysCAMSPanelTranslator.java @@ -167,6 +167,11 @@ public class SysCAMSPanelTranslator { String blockTDFName = blockTDF.getValue(); double periodBlock = blockTDF.getPeriod(); String timeBlock = blockTDF.getTime(); + if (timeBlock.equals("s")) { + timeBlock = timeBlock + "ec"; + } else if (timeBlock.equals("\u03BCs")) { + timeBlock = "us"; + } String processCode = blockTDF.getProcessCode(); DefaultListModel<String> listStruct = blockTDF.getListStruct(); String nameTemplate = blockTDF.getNameTemplate(); @@ -182,6 +187,11 @@ public class SysCAMSPanelTranslator { String portName = portTDF.getPortName(); double periodPort = portTDF.getPeriod(); String time = portTDF.getTime(); + if (time.equals("s")) { + time = time + "ec"; + } else if (time.equals("\u03BCs")) { + time = "us"; + } int rate = portTDF.getRate(); int delay = portTDF.getDelay(); String type = portTDF.getTDFType(); @@ -200,6 +210,11 @@ public class SysCAMSPanelTranslator { String portName = portConverter.getPortName(); double periodPort = portConverter.getPeriod(); String time = portConverter.getTime(); + if (time.equals("s")) { + time = time + "ec"; + } else if (time.equals("\u03BCs")) { + time = "us"; + } int rate = portConverter.getRate(); int delay = portConverter.getDelay(); String type = portConverter.getConvType(); diff --git a/src/main/java/ui/window/JDialogSysCAMSExecutableCodeGeneration.java b/src/main/java/ui/window/JDialogSysCAMSExecutableCodeGeneration.java index f59997cf4131f5191d816b09ce1aa50a88cf9683..f025550281d59bac416a821b5d16517288366cae 100644 --- a/src/main/java/ui/window/JDialogSysCAMSExecutableCodeGeneration.java +++ b/src/main/java/ui/window/JDialogSysCAMSExecutableCodeGeneration.java @@ -591,7 +591,6 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i RealVector execRate = solveTopologyMatrix(topologyMatrix, tdfBlocks); //TODO: to recompute missing delays in loops: modify buffer with the suggested delay, and loop. do { - System.out.println("Computing schedule... " ); recompute = computeSchedule(execRate, topologyMatrix, buffer, tdfBlocks, connectors); if(recompute) suggest_delays = true; @@ -893,9 +892,7 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i } } jta.append("Error: At least one Module or Port Timestep should be entered in at least one TDF block of this cluster.\n"); - //System.out.println("Error: at least one timestep should be entered."); throw new InterruptedException(); - //return; } public boolean propagateTm(SysCAMSTBlockTDF tdfBlock, LinkedList<SysCAMSTConnector> connectors) { @@ -910,11 +907,15 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i * propagateTp(nextTdfBlock); * else //(Tp of connected block > 0) * validate timestep consitency between 2 ports. + * if connected block is unvisted + * propagateTp(nextTdfBlock); * return * */ double tm = tdfBlock.getPeriod(); double tp; int rate; + //Mark this tdf block as visited. + tdfBlock.setIsTimestepPropagated(); SysCAMSTPortTDF p1_tdfPort, p2_tdfPort; for(SysCAMSTPortTDF tdfPort : tdfBlock.getPortTDF()) { tp = tdfPort.getPeriod(); @@ -923,7 +924,6 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i //validate timestep consistency (rate*tp == tm) if(rate*tp != tm){ jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + tdfPort.getName()+"\".\n"); - //System.out.println("Error in propagateTM: Tm inconsistent with Tp of port: " + tdfPort.getName()); return false; } } else { @@ -946,9 +946,14 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i if(p2_tdfPort.getPeriod() != tp) { jta.append("Error: In block \""+tdfBlock.getName()+"\" Timestep Tp of port \"" +tdfPort.getName() + "\" is inconsistent with timestep Tp of port \"" + p2_tdfPort.getName()+"\" from block \""+p2_tdfPort.getBlockTDF().getName()+"\".\n"); - //System.out.println("Error in propagateTM: Tp inconsistent with Tp of ports " + tdfPort.getName() + " and " + p2_tdfPort.getName()); return false; } + //if connected block was not visited yet, then propagate timestep + if(!p2_tdfPort.getBlockTDF().getIsTimestepPropagated()) { + if(!propagateTpTdf(p2_tdfPort.getBlockTDF(), p2_tdfPort, connectors)) { + return false; + } + } } } else if(p2_tdfPort.getName().equals(tdfPort.getName()) && p2_tdfPort.getBlockTDF().getName().equals(tdfBlock.getName())) { if(p1_tdfPort.getPeriod() <= 0) { @@ -961,9 +966,14 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i if(p1_tdfPort.getPeriod() != tp) { jta.append("Error: In block \""+tdfBlock.getName()+"\" Timestep Tp of port \"" +tdfPort.getName() + "\" is inconsistent with timestep Tp of port \"" + p1_tdfPort.getName()+"\" from block \""+p1_tdfPort.getBlockTDF().getName()+"\".\n"); - //System.out.println("Error in propagateTM: Tp inconsistent with Tp of ports " + tdfPort.getName() + " and " + p1_tdfPort.getName()); return false; } + //if connected block was not visited yet, then propagate timestep + if(!p1_tdfPort.getBlockTDF().getIsTimestepPropagated()) { + if(!propagateTpTdf(p1_tdfPort.getBlockTDF(), p1_tdfPort, connectors)) { + return false; + } + } } } } @@ -977,7 +987,6 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i //validate timestep consistency (rate*tp == tm) if(rate*tp != tm){ jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + converterPort.getName()+"\".\n"); - //System.out.println("Error in propagateTM: Tm inconsistent with Tp of port: " + converterPort.getName()); return false; } } else { @@ -1003,7 +1012,6 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i if(tm > 0) { if(rate*tp != tm) { jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + tdfPort.getName()+"\".\n"); - //System.out.println("Error in propagateTpTdf: Tm inconsistent with Tp of port " + tdfPort.getName()); return false; } } else { @@ -1021,7 +1029,6 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i if(tm > 0) { if(rate*tp != tm) { jta.append("Error: In block \""+tdfBlock.getName()+ "\" Timestep Tm is inconsistent with timestep Tp of port \"" + converterPort.getName()+"\".\n"); - //System.out.println("Error in propagateTpConverter: Tm inconsistent with Tp of port " + converterPort.getName()); return false; } } else { @@ -1085,15 +1092,16 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i double[] resultArray = new double[kernelMatrix.getRowDimension()]; double result_tmp = 0.0; int v_lcm = 1; - Fraction[] resultFractionArray = new Fraction[kernelMatrix.getRowDimension()]; + BigFraction[] resultFractionArray = new BigFraction[kernelMatrix.getRowDimension()]; for (int i = 0; i < kernelMatrix.getRowDimension(); i++) { System.out.printf("The kernelMatrix is %f .\n", kernelMatrix.getEntry(i, 0) ); resultArray[i] = kernelMatrix.getEntry(i, 0) / kernelMatrix.getEntry(kernelMatrix.getRowDimension()-1, 0); result_tmp = kernelMatrix.getEntry(i, 0) / kernelMatrix.getEntry(kernelMatrix.getRowDimension()-1, 0); - resultFractionArray[i] = new Fraction(result_tmp); - System.out.println("The resultArray is: "+ resultArray[i] ); - System.out.println("The resultFractionArray is: "+ resultFractionArray[i].toString() ); - v_lcm = ArithmeticUtils.lcm(resultFractionArray[i].getDenominator() , v_lcm); + resultFractionArray[i] = new BigFraction(result_tmp, 2147483647); + System.out.println("The resultArray is: "+ resultArray[i] + ", result_tmp: " + result_tmp); + System.out.println("The resultFractionArray is: "+ resultFractionArray[i].toString() + " with num: " + resultFractionArray[i].getNumeratorAsInt() + " and denom: "+ resultFractionArray[i].getDenominatorAsInt() + + " and given as a double: " + resultFractionArray[i].doubleValue()); + v_lcm = ArithmeticUtils.lcm(resultFractionArray[i].getDenominatorAsInt() , v_lcm); System.out.println("The lcm is: "+ v_lcm ); } int[] tmpResult = new int[kernelMatrix.getRowDimension()]; @@ -1115,11 +1123,13 @@ public class JDialogSysCAMSExecutableCodeGeneration extends javax.swing.JFrame i boolean deadlock = false; boolean recompute = false; SysCAMSTBlockTDF tdfBlock; + LinkedList<SysCAMSTPortConverter> portConvertersTmp; + double[] time_prev = {0.0, 0.0}; //array to store "in" ([0]) and "out" ([1]) previous times //Reset the number of times all blocks have been executed for(int i = 0; i < tdfBlocks.size(); i++) { tdfBlocks.get(i).setN(0); } - double[] time_prev = {0.0, 0.0}; //array to store in[0] and out[1] previous times + try { while (!(q1.equals(q)) && !deadlock){ deadlock = true;