Browse Source

Bugfixes + drawio2CBD better

rparedis 1 year ago
parent
commit
17701263d9

File diff suppressed because it is too large
+ 1 - 0
examples/scripts/EvenNumberGen/EvenNumberGen.drawio


+ 24 - 25
examples/scripts/EvenNumberGen/EvenNumberGen.py

@@ -1,14 +1,26 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py EvenNumberGen.xml -av -F CBD -e LCG -t 30 -f
+# This file was automatically generated from drawio2CBD from
+#   .\EvenNumberGen.drawio
 
 from pyCBD.Core import *
 from pyCBD.lib.std import *
 
+class EvenNumberGen(CBD):
+    def __init__(self, block_name):
+        super().__init__(block_name, input_ports=[], output_ports=['OUT1'])
+
+        # Create the Blocks
+        self.addBlock(Counter("counter"))
+        self.addBlock(Double("double"))
+
+        # Create the Connections
+        self.addConnection("counter", "double", output_port_name="OutCount", input_port_name="InNumber")
+        self.addConnection("double", "OUT1", output_port_name="OutDouble")
+
 
 class Counter(CBD):
     def __init__(self, block_name):
-        CBD.__init__(self, block_name, input_ports=[], output_ports=['OutCount'])
+        super().__init__(block_name, input_ports=[], output_ports=['OutCount'])
 
         # Create the Blocks
         self.addBlock(ConstantBlock("zero", value=(0.0)))
@@ -17,37 +29,24 @@ class Counter(CBD):
         self.addBlock(AdderBlock("sum"))
 
         # Create the Connections
-        self.addConnection("zero", "delay", input_port_name='IC', output_port_name='OUT1')
-        self.addConnection("delay", "sum", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("delay", "OutCount", output_port_name='OUT1')
-        self.addConnection("one", "sum", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("sum", "delay", input_port_name='IN1', output_port_name='OUT1')
+        self.addConnection("zero", "delay", output_port_name="OUT1", input_port_name="IC")
+        self.addConnection("delay", "sum", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("one", "sum", output_port_name="OUT1", input_port_name="IN2")
+        self.addConnection("sum", "delay", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("delay", "OutCount", output_port_name="OUT1")
 
 
 class Double(CBD):
     def __init__(self, block_name):
-        CBD.__init__(self, block_name, input_ports=['InNumber'], output_ports=['OutDouble'])
+        super().__init__(block_name, input_ports=['InNumber'], output_ports=['OutDouble'])
 
         # Create the Blocks
         self.addBlock(ConstantBlock("two", value=(2.0)))
         self.addBlock(ProductBlock("mult"))
 
         # Create the Connections
-        self.addConnection("InNumber", "mult", input_port_name='IN1')
-        self.addConnection("two", "mult", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("mult", "OutDouble", output_port_name='OUT1')
-
-
-class EvenNumberGen(CBD):
-    def __init__(self, block_name):
-        CBD.__init__(self, block_name, input_ports=[], output_ports=["OUT1"])
-
-        # Create the Blocks
-        self.addBlock(Counter("counter"))
-        self.addBlock(Double("double"))
-
-        # Create the Connections
-        self.addConnection("counter", "double", input_port_name='InNumber', output_port_name='OutCount')
-        self.addConnection("double", "OUT1", input_port_name='IN1', output_port_name='OutDouble')
+        self.addConnection("InNumber", "mult", input_port_name="IN1")
+        self.addConnection("two", "mult", output_port_name="OUT1", input_port_name="IN2")
+        self.addConnection("mult", "OutDouble", output_port_name="OUT1")
 
 

File diff suppressed because it is too large
+ 0 - 1
examples/scripts/EvenNumberGen/EvenNumberGen.xml


+ 2 - 2
examples/scripts/EvenNumberGen/EvenNumberGen_experiment.py

@@ -1,6 +1,6 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py EvenNumberGen.xml -av -F CBD -e LCG -t 30 -f
+# This file was automatically generated from drawio2CBD from
+#   .\EvenNumberGen.drawio
 
 from pyCBD.lib.endpoints import SignalCollectorBlock
 from EvenNumberGen import *

+ 0 - 29
examples/scripts/Fibonacci/Fibonacci.py

@@ -1,29 +0,0 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
-
-from pyCBD.Core import *
-from pyCBD.lib.std import *
-
-
-class FibonacciGen(CBD):
-    def __init__(self, block_name):
-        CBD.__init__(self, block_name, input_ports=[], output_ports=['OUT1'])
-
-        # Create the Blocks
-        self.addBlock(DelayBlock("delay1"))
-        self.addBlock(DelayBlock("delay2"))
-        self.addBlock(AdderBlock("sum", 2))
-        self.addBlock(ConstantBlock("zero", value=(0)))
-        self.addBlock(ConstantBlock("one", value=(1)))
-
-        # Create the Connections
-        self.addConnection("delay1", "delay2", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("delay1", "sum", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("delay2", "sum", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("sum", "delay1", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("sum", "OUT1", output_port_name='OUT1')
-        self.addConnection("zero", "delay1", input_port_name='IC', output_port_name='OUT1')
-        self.addConnection("one", "delay2", input_port_name='IC', output_port_name='OUT1')
-
-

File diff suppressed because it is too large
+ 0 - 1
examples/scripts/Fibonacci/Fibonacci.xml


File diff suppressed because it is too large
+ 1 - 0
examples/scripts/Fibonacci/FibonacciGen.drawio


+ 31 - 0
examples/scripts/Fibonacci/FibonacciGen.py

@@ -0,0 +1,31 @@
+#!/usr/bin/python3
+# This file was automatically generated from drawio2CBD from
+#   .\FibonacciGen.drawio
+
+from pyCBD.Core import *
+from pyCBD.lib.std import *
+
+class FibonacciGen(CBD):
+    """
+    Generates the next number in Fibonacci sequence at every iteration.
+    """
+    def __init__(self, block_name):
+        super().__init__(block_name, input_ports=[], output_ports=['OUT1'])
+
+        # Create the Blocks
+        self.addBlock(DelayBlock("delay1"))
+        self.addBlock(DelayBlock("delay2"))
+        self.addBlock(AdderBlock("sum", numberOfInputs=(2)))
+        self.addBlock(ConstantBlock("zero", value=(0)))
+        self.addBlock(ConstantBlock("one", value=(1)))
+
+        # Create the Connections
+        self.addConnection("delay1", "delay2", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("delay1", "sum", output_port_name="OUT1", input_port_name="IN2")
+        self.addConnection("delay2", "sum", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("sum", "delay1", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("sum", "OUT1", output_port_name="OUT1")
+        self.addConnection("zero", "delay1", output_port_name="OUT1", input_port_name="IC")
+        self.addConnection("one", "delay2", output_port_name="OUT1", input_port_name="IC")
+
+

+ 3 - 3
examples/scripts/Fibonacci/Fibonacci_experiment.py

@@ -1,8 +1,8 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
+# This file was automatically generated from drawio2CBD from
+#   .\FibonacciGen.drawio
 
-from Fibonacci import *
+from FibonacciGen import *
 from pyCBD.simulator import Simulator
 import matplotlib.pyplot as plt
 

File diff suppressed because it is too large
+ 1 - 0
examples/scripts/LCG/LCG.drawio


+ 17 - 16
examples/scripts/LCG/LCG.py

@@ -1,14 +1,14 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py LCG.xml -av -F CBD -e LCG -t 100
+# This file was automatically generated from drawio2CBD from
+#   .\LCG.drawio
 
 from pyCBD.Core import *
 from pyCBD.lib.std import *
-
+from pyCBD.lib.endpoints import SignalCollectorBlock
 
 class LCG(CBD):
-    def __init__(self, block_name, a=(1), c=(4), m=(9), x0=(0)):
-        CBD.__init__(self, block_name, input_ports=[], output_ports=["OUT1"])
+    def __init__(self, block_name, x0=(0), a=(1), c=(4), m=(9)):
+        super().__init__(block_name, input_ports=[], output_ports=[])
 
         # Create the Blocks
         self.addBlock(ConstantBlock("a", value=(a)))
@@ -16,19 +16,20 @@ class LCG(CBD):
         self.addBlock(ConstantBlock("c", value=(c)))
         self.addBlock(ConstantBlock("m", value=(m)))
         self.addBlock(DelayBlock("delay"))
-        self.addBlock(ProductBlock("mult"))
-        self.addBlock(AdderBlock("sum"))
+        self.addBlock(ProductBlock("mult", numberOfInputs=(2)))
+        self.addBlock(AdderBlock("sum", numberOfInputs=(2)))
         self.addBlock(ModuloBlock("mod"))
+        self.addBlock(SignalCollectorBlock("collector"))
 
         # Create the Connections
-        self.addConnection("x0", "delay", input_port_name='IC', output_port_name='OUT1')
-        self.addConnection("a", "mult", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("delay", "mult", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("mult", "sum", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("c", "sum", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("sum", "mod", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("m", "mod", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("mod", "delay", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("mod", "OUT1", input_port_name='IN1', output_port_name='OUT1')
+        self.addConnection("x0", "delay", output_port_name="OUT1", input_port_name="IC")
+        self.addConnection("a", "mult", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("delay", "mult", output_port_name="OUT1", input_port_name="IN2")
+        self.addConnection("mult", "sum", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("c", "sum", output_port_name="OUT1", input_port_name="IN2")
+        self.addConnection("m", "mod", output_port_name="OUT1", input_port_name="IN2")
+        self.addConnection("sum", "mod", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("mod", "delay", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("mod", "collector", output_port_name="OUT1", input_port_name="IN1")
 
 

File diff suppressed because it is too large
+ 0 - 1
examples/scripts/LCG/LCG.xml


+ 16 - 16
examples/scripts/LCG/LCG_experiment.py

@@ -1,28 +1,28 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py LCG.xml -av -F CBD -e LCG -t 30
+# This file was automatically generated from drawio2CBD from
+#   .\LCG.drawio
 
 from pyCBD.simulator import Simulator
 from LCG import *
 import matplotlib.pyplot as plt
+from pyCBD.realtime.plotting import PlotManager, ScatterPlot, follow
 
-def term(model, _):
-	signals = [y for __, y in model.getSignalHistory("OUT1")]
-	unique_signals = set(signals)
-	return len(signals) > len(unique_signals)
+fig = plt.figure(figsize=(15, 5), dpi=100)
+ax = fig.add_subplot(1, 1, 1)
+ax.set_ylim((0, 9))
 
-lcg = LCG("LCG", 1, 4, 9, 0)
+cbd = LCG("LCG")
 
-# Run the Simulation
-sim = Simulator(lcg)
-sim.setTerminationCondition(term)
-sim.run()
+manager = PlotManager()
+manager.register("lcg", cbd.find('collector')[0], (fig, ax), ScatterPlot())
+manager.connect('lcg', 'update', lambda d, axis=ax: axis.set_xlim(follow(d[0], 10.0, lower_bound=0.0)))
 
-# Print a full cycle: [0, 4, 8, 3, 7, 2, 6, 1, 5]
-print([v for _, v in lcg.getSignalHistory("OUT1")])
 
-data = lcg.getSignalHistory('OUT1')
-x, y = [x for x, _ in data], [y for _, y in data]
+# Run the Simulation
+sim = Simulator(cbd)
+sim.setRealTime()
+sim.setProgressBar()
+sim.run(30.0)
 
-plt.scatter(x, y, s=5)
 plt.show()
+# while sim.is_running(): pass

+ 0 - 36
examples/scripts/LCG2/LCG.py

@@ -1,36 +0,0 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py LCG.xml -av -F CBD -e LCG -t 100
-
-from pyCBD.Core import *
-from pyCBD.lib.std import *
-from pyCBD.lib.endpoints import SignalCollectorBlock
-
-
-class LCG(CBD):
-    def __init__(self, block_name, a=(1), c=(4), x0=(0), m=(9)):
-        CBD.__init__(self, block_name, input_ports=[], output_ports=[])
-
-        # Create the Blocks
-        self.addBlock(ConstantBlock("a", value=(a)))
-        self.addBlock(ConstantBlock("x0", value=(x0)))
-        self.addBlock(ConstantBlock("c", value=(c)))
-        self.addBlock(ConstantBlock("m", value=(m)))
-        self.addBlock(DelayBlock("delay"))
-        self.addBlock(ProductBlock("mult"))
-        self.addBlock(AdderBlock("sum"))
-        self.addBlock(ModuloBlock("mod"))
-        self.addBlock(SignalCollectorBlock("collector"))
-
-        # Create the Connections
-        self.addConnection("x0", "delay", input_port_name='IC', output_port_name='OUT1')
-        self.addConnection("a", "mult", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("delay", "mult", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("mult", "sum", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("c", "sum", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("m", "mod", input_port_name='IN2', output_port_name='OUT1')
-        self.addConnection("sum", "mod", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("mod", "delay", input_port_name='IN1', output_port_name='OUT1')
-        self.addConnection("mod", "collector", input_port_name='IN1', output_port_name='OUT1')
-
-

File diff suppressed because it is too large
+ 0 - 1
examples/scripts/LCG2/LCG.xml


+ 0 - 29
examples/scripts/LCG2/LCG_experiment.py

@@ -1,29 +0,0 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py LCG.xml -av -F CBD -e LCG -t 30
-
-# from CBD.lib.plotting import SignalPlotBlock
-from pyCBD.simulator import Simulator
-from LCG import *
-import matplotlib.pyplot as plt
-from pyCBD.realtime.plotting import PlotManager, ScatterPlot, follow
-
-fig = plt.figure(figsize=(15, 5), dpi=100)
-ax = fig.add_subplot(1, 1, 1)
-ax.set_ylim((0, 9))
-
-cbd = LCG("LCG")
-
-manager = PlotManager()
-manager.register("lcg", cbd.find('collector')[0], (fig, ax), ScatterPlot())
-manager.connect('lcg', 'update', lambda d, axis=ax: axis.set_xlim(follow(d[0], 10.0, lower_bound=0.0)))
-
-
-# Run the Simulation
-sim = Simulator(cbd)
-sim.setRealTime()
-sim.setProgressBar()
-sim.run(30.0)
-
-plt.show()
-# while sim.is_running(): pass

File diff suppressed because it is too large
+ 1 - 0
examples/scripts/SinGen/SinGen.drawio


+ 9 - 17
examples/scripts/SinGen/SinGen.py

@@ -1,28 +1,20 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py SinGen.xml -fav -F CBD -e SinGen -E delta=0.1
+# This file was automatically generated from drawio2CBD from
+#   .\SinGen.drawio
 
 from pyCBD.Core import *
 from pyCBD.lib.std import *
 
-DELTA_T = 0.1
-
 class SinGen(CBD):
-    def __init__(self, name="SinGen"):
-        CBD.__init__(self, name, input_ports=[], output_ports=["OUT1"])
+    def __init__(self, block_name):
+        super().__init__(block_name, input_ports=[], output_ports=['OUT1'])
 
-        # Add the 't' parameter
-        # Let's call it 'time'
+        # Create the Blocks
         self.addBlock(TimeBlock("time"))
+        self.addBlock(GenericBlock("sine", block_operator=("sin")))
 
-        # Add the block that computes the actual sine function
-        # Let's call it 'sin'
-        self.addBlock(GenericBlock("sin", block_operator="sin"))
-
-        # Connect them together
-        self.addConnection("time", "sin", input_port_name='IN1', output_port_name='OUT1')
-
-        # Connect the output port
-        self.addConnection("sin", "OUT1", output_port_name='OUT1')
+        # Create the Connections
+        self.addConnection("time", "sine", output_port_name="OUT1", input_port_name="IN1")
+        self.addConnection("sine", "OUT1", output_port_name="OUT1")
 
 

File diff suppressed because it is too large
+ 0 - 1
examples/scripts/SinGen/SinGen.xml


+ 2 - 2
examples/scripts/SinGen/SinGen_experiment.py

@@ -1,6 +1,6 @@
 #!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
+# This file was automatically generated from drawio2CBD from
+#   .\SinGen.drawio
 
 from SinGen import *
 from pyCBD.simulator import Simulator

+ 0 - 4
examples/scripts/SinGen/SinGen_gameloop_experiment.py

@@ -1,7 +1,3 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
-
 from SinGen import *
 from pyCBD.simulator import Simulator
 import matplotlib.pyplot as plt

+ 0 - 4
examples/scripts/SinGen/SinGen_latex_experiment.py

@@ -1,7 +1,3 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
-
 from SinGen import *
 from pyCBD.converters.latexify import CBD2Latex
 

+ 0 - 4
examples/scripts/SinGen/SinGen_threading_experiment.py

@@ -1,7 +1,3 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
-
 from SinGen import *
 from pyCBD.simulator import Simulator
 import matplotlib.pyplot as plt

+ 0 - 4
examples/scripts/SinGen/SinGen_tkinter_experiment.py

@@ -1,7 +1,3 @@
-#!/usr/bin/python3
-# This file was automatically generated from drawio2cbd with the command:
-#   /home/red/git/DrawioConvert/__main__.py Fibonacci.xml -F CBD -e FibonacciGen -gvaf
-
 from SinGen import *
 from pyCBD.simulator import Simulator
 import matplotlib.pyplot as plt

+ 0 - 686
examples/scripts/SinGen/sine.vcd

@@ -1,686 +0,0 @@
-$date
-	Generated at 2023-01-20 13:52:51.
-$end
-$version
-	Generated by pyCBD 1.6.
-$end
-$timescale 1ms $end
-$scope module SinGen $end
-$var real 32 ! OUT1 $end
-$scope module clock_clock $end
-$var real 32 " delta_t $end
-$var real 32 # rel_time $end
-$var real 32 $ time $end
-$upscope $end
-$scope module clock_delta $end
-$var real 32 % OUT1 $end
-$upscope $end
-$scope module sin $end
-$var real 32 & OUT1 $end
-$upscope $end
-$scope module time $end
-$var real 32 ' OUT1 $end
-$var real 32 ( relative $end
-$upscope $end
-$upscope $end
-$enddefinitions $end
-$dumpvars
-r0.000000 '
-r0.000000 (
-r0.000000 &
-r0.000000 $
-r0.000000 #
-r0.100000 "
-r0.100000 %
-r0.000000 !
-$end
-#333
-$dumpvars
-r0.333000 '
-r0.333000 (
-r0.326507 &
-r0.333000 $
-r0.333000 #
-r0.100000 "
-r0.100000 %
-r0.326507 !
-$end
-#666
-$dumpvars
-r0.666000 '
-r0.666000 (
-r0.617162 &
-r0.666000 $
-r0.666000 #
-r0.100000 "
-r0.100000 %
-r0.617162 !
-$end
-#999
-$dumpvars
-r0.999000 '
-r0.999000 (
-r0.840890 &
-r0.999000 $
-r0.999000 #
-r0.100000 "
-r0.100000 %
-r0.840890 !
-$end
-#1332
-$dumpvars
-r1.332000 '
-r1.332000 (
-r0.970563 &
-r1.332000 $
-r1.332000 #
-r0.100000 "
-r0.100000 %
-r0.970563 !
-$end
-#1665
-$dumpvars
-r1.665000 '
-r1.665000 (
-r0.994433 &
-r1.665000 $
-r1.665000 #
-r0.100000 "
-r0.100000 %
-r0.994433 !
-$end
-#1998
-$dumpvars
-r1.998000 '
-r1.998000 (
-r0.910037 &
-r1.998000 $
-r1.998000 #
-r0.100000 "
-r0.100000 %
-r0.910037 !
-$end
-#2331
-$dumpvars
-r2.331000 '
-r2.331000 (
-r0.723930 &
-r2.331000 $
-r2.331000 #
-r0.100000 "
-r0.100000 %
-r0.723930 !
-$end
-#2664
-$dumpvars
-r2.664000 '
-r2.664000 (
-r0.459104 &
-r2.664000 $
-r2.664000 #
-r0.100000 "
-r0.100000 %
-r0.459104 !
-$end
-#2997
-$dumpvars
-r2.997000 '
-r2.997000 (
-r0.144064 &
-r2.997000 $
-r2.997000 #
-r0.100000 "
-r0.100000 %
-r0.144064 !
-$end
-#3330
-$dumpvars
-r3.330000 '
-r3.330000 (
-r-0.187084 &
-r3.330000 $
-r3.330000 #
-r0.100000 "
-r0.100000 %
-r-0.187084 !
-$end
-#3663
-$dumpvars
-r3.663000 '
-r3.663000 (
-r-0.497529 &
-r3.663000 $
-r3.663000 #
-r0.100000 "
-r0.100000 %
-r-0.497529 !
-$end
-#3996
-$dumpvars
-r3.996000 '
-r3.996000 (
-r-0.754041 &
-r3.996000 $
-r3.996000 #
-r0.100000 "
-r0.100000 %
-r-0.754041 !
-$end
-#4329
-$dumpvars
-r4.329000 '
-r4.329000 (
-r-0.926442 &
-r4.329000 $
-r4.329000 #
-r0.100000 "
-r0.100000 %
-r-0.926442 !
-$end
-#4662
-$dumpvars
-r4.662000 '
-r4.662000 (
-r-0.997555 &
-r4.662000 $
-r4.662000 #
-r0.100000 "
-r0.100000 %
-r-0.997555 !
-$end
-#4995
-$dumpvars
-r4.995000 '
-r4.995000 (
-r-0.960101 &
-r4.995000 $
-r4.995000 #
-r0.100000 "
-r0.100000 %
-r-0.960101 !
-$end
-#5328
-$dumpvars
-r5.328000 '
-r5.328000 (
-r-0.815607 &
-r5.328000 $
-r5.328000 #
-r0.100000 "
-r0.100000 %
-r-0.815607 !
-$end
-#5661
-$dumpvars
-r5.661000 '
-r5.661000 (
-r-0.582112 &
-r5.661000 $
-r5.661000 #
-r0.100000 "
-r0.100000 %
-r-0.582112 !
-$end
-#5994
-$dumpvars
-r5.994000 '
-r5.994000 (
-r-0.285083 &
-r5.994000 $
-r5.994000 #
-r0.100000 "
-r0.100000 %
-r-0.285083 !
-$end
-#6327
-$dumpvars
-r6.327000 '
-r6.327000 (
-r0.043742 &
-r6.327000 $
-r6.327000 #
-r0.100000 "
-r0.100000 %
-r0.043742 !
-$end
-#6660
-$dumpvars
-r6.660000 '
-r6.660000 (
-r0.367526 &
-r6.660000 $
-r6.660000 #
-r0.100000 "
-r0.100000 %
-r0.367526 !
-$end
-#6993
-$dumpvars
-r6.993000 '
-r6.993000 (
-r0.651488 &
-r6.993000 $
-r6.993000 #
-r0.100000 "
-r0.100000 %
-r0.651488 !
-$end
-#7326
-$dumpvars
-r7.326000 '
-r7.326000 (
-r0.862987 &
-r7.326000 $
-r7.326000 #
-r0.100000 "
-r0.100000 %
-r0.862987 !
-$end
-#7659
-$dumpvars
-r7.659000 '
-r7.659000 (
-r0.979866 &
-r7.659000 $
-r7.659000 #
-r0.100000 "
-r0.100000 %
-r0.979866 !
-$end
-#7992
-$dumpvars
-r7.992000 '
-r7.992000 (
-r0.990125 &
-r7.992000 $
-r7.992000 #
-r0.100000 "
-r0.100000 %
-r0.990125 !
-$end
-#8325
-$dumpvars
-r8.325000 '
-r8.325000 (
-r0.890279 &
-r8.325000 $
-r8.325000 #
-r0.100000 "
-r0.100000 %
-r0.890279 !
-$end
-#8658
-$dumpvars
-r8.658000 '
-r8.658000 (
-r0.692969 &
-r8.658000 $
-r8.658000 #
-r0.100000 "
-r0.100000 %
-r0.692969 !
-$end
-#8991
-$dumpvars
-r8.991000 '
-r8.991000 (
-r0.420120 &
-r8.991000 $
-r8.991000 #
-r0.100000 "
-r0.100000 %
-r0.420120 !
-$end
-#9324
-$dumpvars
-r9.324000 '
-r9.324000 (
-r0.100531 &
-r9.324000 $
-r9.324000 #
-r0.100000 "
-r0.100000 %
-r0.100531 !
-$end
-#9657
-$dumpvars
-r9.657000 '
-r9.657000 (
-r-0.229864 &
-r9.657000 $
-r9.657000 #
-r0.100000 "
-r0.100000 %
-r-0.229864 !
-$end
-#9990
-$dumpvars
-r9.990000 '
-r9.990000 (
-r-0.535373 &
-r9.990000 $
-r9.990000 #
-r0.100000 "
-r0.100000 %
-r-0.535373 !
-$end
-#10323
-$dumpvars
-r10.323000 '
-r10.323000 (
-r-0.781518 &
-r10.323000 $
-r10.323000 #
-r0.100000 "
-r0.100000 %
-r-0.781518 !
-$end
-#10656
-$dumpvars
-r10.656000 '
-r10.656000 (
-r-0.941737 &
-r10.656000 $
-r10.656000 #
-r0.100000 "
-r0.100000 %
-r-0.941737 !
-$end
-#10989
-$dumpvars
-r10.989000 '
-r10.989000 (
-r-0.999489 &
-r10.989000 $
-r10.989000 #
-r0.100000 "
-r0.100000 %
-r-0.999489 !
-$end
-#11322
-$dumpvars
-r11.322000 '
-r11.322000 (
-r-0.946387 &
-r11.322000 $
-r11.322000 #
-r0.100000 "
-r0.100000 %
-r-0.946387 !
-$end
-#11655
-$dumpvars
-r11.655000 '
-r11.655000 (
-r-0.789364 &
-r11.655000 $
-r11.655000 #
-r0.100000 "
-r0.100000 %
-r-0.789364 !
-$end
-#11988
-$dumpvars
-r11.988000 '
-r11.988000 (
-r-0.546361 &
-r11.988000 $
-r11.988000 #
-r0.100000 "
-r0.100000 %
-r-0.546361 !
-$end
-#12321
-$dumpvars
-r12.321000 '
-r12.321000 (
-r-0.242730 &
-r12.321000 $
-r12.321000 #
-r0.100000 "
-r0.100000 %
-r-0.242730 !
-$end
-#12654
-$dumpvars
-r12.654000 '
-r12.654000 (
-r0.087412 &
-r12.654000 $
-r12.654000 #
-r0.100000 "
-r0.100000 %
-r0.087412 !
-$end
-#12987
-$dumpvars
-r12.987000 '
-r12.987000 (
-r0.408117 &
-r12.987000 $
-r12.987000 #
-r0.100000 "
-r0.100000 %
-r0.408117 !
-$end
-#13320
-$dumpvars
-r13.320000 '
-r13.320000 (
-r0.683731 &
-r13.320000 $
-r13.320000 #
-r0.100000 "
-r0.100000 %
-r0.683731 !
-$end
-#13653
-$dumpvars
-r13.653000 '
-r13.653000 (
-r0.883962 &
-r13.653000 $
-r13.653000 #
-r0.100000 "
-r0.100000 %
-r0.883962 !
-$end
-#13986
-$dumpvars
-r13.986000 '
-r13.986000 (
-r0.988003 &
-r13.986000 $
-r13.986000 #
-r0.100000 "
-r0.100000 %
-r0.988003 !
-$end
-#14319
-$dumpvars
-r14.319000 '
-r14.319000 (
-r0.982760 &
-r14.319000 $
-r14.319000 #
-r0.100000 "
-r0.100000 %
-r0.982760 !
-$end
-#14652
-$dumpvars
-r14.652000 '
-r14.652000 (
-r0.869288 &
-r14.652000 $
-r14.652000 #
-r0.100000 "
-r0.100000 %
-r0.869288 !
-$end
-#14985
-$dumpvars
-r14.985000 '
-r14.985000 (
-r0.661177 &
-r14.985000 $
-r14.985000 #
-r0.100000 "
-r0.100000 %
-r0.661177 !
-$end
-#15318
-$dumpvars
-r15.318000 '
-r15.318000 (
-r0.379889 &
-r15.318000 $
-r15.318000 #
-r0.100000 "
-r0.100000 %
-r0.379889 !
-$end
-#15651
-$dumpvars
-r15.651000 '
-r15.651000 (
-r0.056861 &
-r15.651000 $
-r15.651000 #
-r0.100000 "
-r0.100000 %
-r0.056861 !
-$end
-#15984
-$dumpvars
-r15.984000 '
-r15.984000 (
-r-0.272376 &
-r15.984000 $
-r15.984000 #
-r0.100000 "
-r0.100000 %
-r-0.272376 !
-$end
-#16317
-$dumpvars
-r16.317000 '
-r16.317000 (
-r-0.571662 &
-r16.317000 $
-r16.317000 #
-r0.100000 "
-r0.100000 %
-r-0.571662 !
-$end
-#16650
-$dumpvars
-r16.650000 '
-r16.650000 (
-r-0.807747 &
-r16.650000 $
-r16.650000 #
-r0.100000 "
-r0.100000 %
-r-0.807747 !
-$end
-#16983
-$dumpvars
-r16.983000 '
-r16.983000 (
-r-0.955911 &
-r16.983000 $
-r16.983000 #
-r0.100000 "
-r0.100000 %
-r-0.955911 !
-$end
-#17316
-$dumpvars
-r17.316000 '
-r17.316000 (
-r-0.998636 &
-r17.316000 $
-r17.316000 #
-r0.100000 "
-r0.100000 %
-r-0.998636 !
-$end
-#17649
-$dumpvars
-r17.649000 '
-r17.649000 (
-r-0.931076 &
-r17.649000 $
-r17.649000 #
-r0.100000 "
-r0.100000 %
-r-0.931076 !
-$end
-#17982
-$dumpvars
-r17.982000 '
-r17.982000 (
-r-0.762178 &
-r17.982000 $
-r17.982000 #
-r0.100000 "
-r0.100000 %
-r-0.762178 !
-$end
-#18315
-$dumpvars
-r18.315000 '
-r18.315000 (
-r-0.509147 &
-r18.315000 $
-r18.315000 #
-r0.100000 "
-r0.100000 %
-r-0.509147 !
-$end
-#18648
-$dumpvars
-r18.648000 '
-r18.648000 (
-r-0.199946 &
-r18.648000 $
-r18.648000 #
-r0.100000 "
-r0.100000 %
-r-0.199946 !
-$end
-#18981
-$dumpvars
-r18.981000 '
-r18.981000 (
-r0.130981 &
-r18.981000 $
-r18.981000 #
-r0.100000 "
-r0.100000 %
-r0.130981 !
-$end
-#19314
-$dumpvars
-r19.314000 '
-r19.314000 (
-r0.447643 &
-r19.314000 $
-r19.314000 #
-r0.100000 "
-r0.100000 %
-r0.447643 !
-$end
-#19647
-$dumpvars
-r19.647000 '
-r19.647000 (
-r0.714680 &
-r19.647000 $
-r19.647000 #
-r0.100000 "
-r0.100000 %
-r0.714680 !
-$end
-#20000

+ 20 - 0
experiments/test.py

@@ -0,0 +1,20 @@
+from pyCBD.Core import CBD
+from pyCBD.lib.std import *
+
+class Double(CBD):
+	def __init__(self):
+		CBD.__init__(self, "Double", ["single"], ["double"])
+		self.addBlock(ConstantBlock("two", 2))
+		self.addBlock(ProductBlock("mult"))
+
+		self.addConnection("two", "mult")
+		# self.addConnection("two", "mult")
+		self.addConnection("single", "mult")
+		self.addConnection("mult", "double")
+
+model = Double()
+
+from pyCBD.depGraph import createDepGraph
+
+dg = createDepGraph(model, 0)
+print(dg)

+ 36 - 24
src/pyCBD/Core.py

@@ -8,8 +8,6 @@ from collections import namedtuple
 InputLink = namedtuple("InputLink", ["block", "output_port"])
 Signal = namedtuple("Signal", ["time", "value"])
 
-epsilon = 0.001
-
 class Port:
     """
     Defines a port of a block.
@@ -211,7 +209,7 @@ class BaseBlock:
             logger = logging.getLogger("CBD")
             logger.warning("No block name given, using hashed object id. This is a bad practice and should be avoided.",
                            extra={"block": self})
-        if re.match(r"[^a-zA-Z0-9_]", self.__block_name):
+        if re.search(r"[^a-zA-Z0-9_.]", self.__block_name):
             logger = logging.getLogger("CBD")
             logger.warning("Block names should only contain alphanumeric characters or underscores.", extra={"block": self})
 
@@ -405,7 +403,6 @@ class BaseBlock:
             A list of ports that must be computed in order to compute this block,
             at the time of the iteration.
         """
-        # TODO: what with multiple sequential connectors
         return [p.getIncoming().source for p in self.getInputPorts() if p.getIncoming() is not None]
 
     def getPortConnectedToInput(self, input_port):
@@ -585,6 +582,9 @@ class CBD(BaseBlock):
         self.__blocksDict = {}
         self.__clock = None
 
+        # When flattened, we still want to access the old ports!
+        self.__aliases = {}
+
     def clone(self):
         # Clone all fields
         other: CBD = BaseBlock.clone(self)
@@ -640,6 +640,8 @@ class CBD(BaseBlock):
         for block in blocks:
             if isinstance(block, CBD) and not block.getBlockType() in ignore:
                 block.flatten(ignore, psep)
+                for k, v in block.__aliases.items():
+                    self.__aliases[block.getBlockName() + psep + k] = block.getBlockName() + psep + v
                 for child in block.getBlocks():
                     child.setBlockName(block.getBlockName() + psep + child.getBlockName())
                     self.addBlock(child)
@@ -653,6 +655,7 @@ class CBD(BaseBlock):
                             Port.disconnect(port, target)
                             self.addConnection(source.block, target.block, input_port_name=target.name,
                                                output_port_name=source.name)
+                        self.__aliases[block.getBlockName() + psep + port.name] = source.block.getBlockName() + psep + source.name
                 self.removeBlock(block)
 
     def flattened(self, ignore=None, psep="."):
@@ -742,9 +745,9 @@ class CBD(BaseBlock):
             formalisms/simulators, the Clock's outputs should be replaced with the
             corresponding simulator's clock without loss of generality.
         """
-        self.addBlock(Clock("%s-clock" % prefix, delta_t, start_time))
-        self.addBlock(ConstantBlock("%s-delta" % prefix, delta_t))
-        self.addConnection("%s-delta" % prefix, "%s-clock" % prefix, input_port_name='h')
+        self.addBlock(Clock("%s_clock" % prefix, delta_t, start_time))
+        self.addBlock(ConstantBlock("%s_delta" % prefix, delta_t))
+        self.addConnection("%s_delta" % prefix, "%s_clock" % prefix, input_port_name='h')
 
     def addBlock(self, block):
         """
@@ -822,12 +825,6 @@ class CBD(BaseBlock):
                 to_block = self.getBlockByName(to_block)
         to_block.linkToInput(from_block, name_input=input_port_name, name_output=output_port_name)
 
-    def getDependencies(self, curIteration):
-        deps = []
-        for block in self.getBlocks():
-            deps += [x for x in block.getDependencies(curIteration) if x.block == self]
-        return deps
-
     def removeConnection(self, block, input_port_name):
         """
         Removes an input connection of block :code:`block` and port :code:`input_port_name`.
@@ -863,18 +860,33 @@ class CBD(BaseBlock):
         """
         if path == '':
             return self, self.getPath()
-        cur = self
-        for p in path.split(sep):
-            if p in cur.__blocksDict:
-                cur = cur.getBlockByName(p)
-            elif p in cur.getInputPortNames():
-                cur = cur.getInputPortByName(p)
-                path = cur.block.getPath()
-            elif p in cur.getOutputPortNames():
-                cur = cur.getOutputPortByName(p)
-                path = cur.block.getPath()
+        if path in self.__aliases:
+            return self.find(self.__aliases[path], sep)
+
+        ps = path.split(sep)
+        cur = None
+        px = 0
+        p = ps[px]
+        while px < len(ps):
+            if p in self.__blocksDict:
+                cur = self.getBlockByName(p)
+                if isinstance(cur, CBD):
+                    cur, path = cur.find(sep.join(ps[1:]), sep)
+            else:
+                if p in self.getInputPortNames():
+                    cur = self.getInputPortByName(p)
+                    path = cur.block.getPath()
+                elif p in self.getOutputPortNames():
+                    cur = self.getOutputPortByName(p)
+                    path = cur.block.getPath()
+
+            if cur is None:
+                px += 1
+                p += sep + ps[px]
             else:
-                raise ValueError("Cannot find block '{}' in '{}'.".format(p, cur.getPath()))
+                break
+        if cur is None:
+            raise ValueError("Cannot find block '{}' in '{}'.".format(path, self.getPath()))
         return cur, path
 
     def __repr__(self):

+ 13 - 6
src/pyCBD/lib/std.py

@@ -48,7 +48,7 @@ class ConstantBlock(BaseBlock):
 		self.appendToSignal(self.getValue())
 
 	def __repr__(self):  # pragma: no cover
-		return BaseBlock.__repr__(self) + "  Value = " + str(self.getValue()) + "\n"
+		return BaseBlock.__repr__(self) + " (" + str(self.getValue()) + ")"
 
 
 class NegatorBlock(BaseBlock):
@@ -817,8 +817,8 @@ class DelayBlock(BaseBlock):
 		BaseBlock.__init__(self, block_name, ["IN1", "IC"], ["OUT1"])
 
 	def getDependencies(self, curIteration):
-		# TO IMPLEMENT: This is a helper function you can use to create the dependency graph
-		# Treat dependencies differently. For instance, at the first iteration (curIteration == 0), the block only depends on the IC;
+		# Treat dependencies differently.
+		# For instance, at the first iteration (curIteration == 0), the block only depends on the IC;
 		if curIteration == 0:
 			return [self.getInputPortByName("IC").getIncoming().source]
 		return []
@@ -932,11 +932,11 @@ class LoggingBlock(BaseBlock):
 		if self.getInputSignal(curIteration, "IN1").value:
 			simtime = str(self.getClock().getTime(curIteration))
 			if self.__lev == logging.WARNING:
-				self.__logger.warning("[" + simtime + "]  " + self.__string, extra={"block": self})
+				self.__logger.warning("[" + simtime + "]  " + self.__string, extra={"block": self, "curIt": curIteration})
 			elif self.__lev == logging.ERROR:
-				self.__logger.error("[" + simtime + "]  " + self.__string, extra={"block": self})
+				self.__logger.error("[" + simtime + "]  " + self.__string, extra={"block": self, "curIt": curIteration})
 			elif self.__lev == logging.CRITICAL:
-				self.__logger.critical("[" + simtime + "]  " + self.__string, extra={"block": self})
+				self.__logger.critical("[" + simtime + "]  " + self.__string, extra={"block": self, "curIt": curIteration})
 
 
 class AddOneBlock(CBD):
@@ -1047,6 +1047,13 @@ class IntegratorBlock(CBD):
 		self.addConnection("sumState", "delayState", input_port_name="IN1")
 		self.addConnection("sumState", "OUT1")
 
+	def getDependencies(self, curIteration):
+		# Treat dependencies differently.
+		# For instance, at the first iteration (curIteration == 0), the block only depends on the IC;
+		if curIteration == 0:
+			return [self.getInputPortByName("IC").getIncoming().source]
+		return []
+
 
 class Clock(BaseBlock):
 	"""

+ 4 - 1
src/pyCBD/naivelog.py

@@ -44,7 +44,10 @@ class ColoredFormatter(logging.Formatter):
 			levelname_color = COLOR_SEQ % (30 + COLORS[levelname]) + levelname + RESET_SEQ
 			record.levelname = levelname_color
 		if hasattr(record, "block"):
-			record.simtime = record.block.getClock().getTime()
+			curIt = 0
+			if hasattr(record, "curIt"):
+				curIt = record.curIt
+			record.simtime = record.block.getClock().getTime(curIt)
 			record.blockname = record.block.getPath()
 		return logging.Formatter.format(self, record)
 

+ 4 - 0
src/pyCBD/simulator.py

@@ -1,5 +1,7 @@
 import logging
 import threading
+
+from pyCBD.Core import Port
 from pyCBD.depGraph import createDepGraph
 from pyCBD.loopsolvers.linearsolver import LinearSolver
 from pyCBD.realtime.threadingBackend import ThreadingBackend, Platform
@@ -671,6 +673,8 @@ class Simulator:
 		for component in sortedGraph:
 			if not self.__hasCycle(component, depGraph):
 				block = component[0]  # the strongly connected component has a single element
+				if isinstance(block, Port):
+					continue
 				if curIteration == 0 or self.__scheduler.mustCompute(block, self.getTime()):
 					block.compute(curIteration)
 					self.__tracer.trace(self.__tracer.traceCompute, (curIteration, block))