From 4e709fa30380025603cd037e278d26f944dec56b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Antonio=20Garc=C3=ADa-Dom=C3=ADnguez?= <nyoescape@gmail.com>
Date: Mon, 6 May 2019 22:34:00 +0100
Subject: [PATCH] Add models and metamodels

---
 docs/diagrams/BDD.png   | Bin 0 -> 4482 bytes
 docs/diagrams/Nodes.png | Bin 0 -> 4241 bytes
 docs/diagrams/TT.png    | Bin 0 -> 6632 bytes
 docs/diagrams/Tree.png  | Bin 0 -> 3679 bytes
 metamodels/BDD.ecore    |  42 +++++++++++++++++++++++++
 metamodels/BDD.km3      |  50 ++++++++++++++++++++++++++++++
 models/OUT.bddmodel     |  51 +++++++++++++++++++++++++++++++
 models/Test.bdd         |  27 ++++++++++++++++
 models/Test.bddmodel    |  51 +++++++++++++++++++++++++++++++
 models/Test.tt          |  14 +++++++++
 models/Test.ttmodel     |  66 ++++++++++++++++++++++++++++++++++++++++
 11 files changed, 301 insertions(+)
 create mode 100644 docs/diagrams/BDD.png
 create mode 100644 docs/diagrams/Nodes.png
 create mode 100644 docs/diagrams/TT.png
 create mode 100644 docs/diagrams/Tree.png
 create mode 100644 metamodels/BDD.ecore
 create mode 100644 metamodels/BDD.km3
 create mode 100644 models/OUT.bddmodel
 create mode 100644 models/Test.bdd
 create mode 100644 models/Test.bddmodel
 create mode 100644 models/Test.tt
 create mode 100644 models/Test.ttmodel

diff --git a/docs/diagrams/BDD.png b/docs/diagrams/BDD.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc98ff284996b21e0eef2c529af0062d66cd6f3d
GIT binary patch
literal 4482
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
VoBgQnJO%~^22WQ%mvv4FO#mC+&inuX

literal 0
HcmV?d00001

diff --git a/docs/diagrams/Nodes.png b/docs/diagrams/Nodes.png
new file mode 100644
index 0000000000000000000000000000000000000000..95eae8fdadf165c28bd37c0b1752ae7dfa18136e
GIT binary patch
literal 4241
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
P7#KWV{an^LB{Ts51gvWT

literal 0
HcmV?d00001

diff --git a/docs/diagrams/TT.png b/docs/diagrams/TT.png
new file mode 100644
index 0000000000000000000000000000000000000000..e337b87899ff19f55a61f39930c5c82f7d373853
GIT binary patch
literal 6632
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
NJYD@<);T3K0RUjk3Jw4O

literal 0
HcmV?d00001

diff --git a/docs/diagrams/Tree.png b/docs/diagrams/Tree.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e1ed238507797b89575853ec035989bd5b13115
GIT binary patch
literal 3679
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
UP>#cmfq{X+)78&qol`;+05tAm+5i9m

literal 0
HcmV?d00001

diff --git a/metamodels/BDD.ecore b/metamodels/BDD.ecore
new file mode 100644
index 0000000..69350fb
--- /dev/null
+++ b/metamodels/BDD.ecore
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
+  <ecore:EPackage name="PrimitiveTypes">
+    <eClassifiers xsi:type="ecore:EDataType" name="String"/>
+    <eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
+  </ecore:EPackage>
+  <ecore:EPackage name="BDD">
+    <eClassifiers xsi:type="ecore:EClass" name="BDD">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ports" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Port" containment="true" eOpposite="/1/Port/owner"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="tree" ordered="false" lowerBound="1" eType="/1/Tree" containment="true" eOpposite="/1/Tree/ownerBDD"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Port" abstract="true">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false" lowerBound="1" eType="/1/BDD" eOpposite="/1/BDD/ports"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InputPort" eSuperTypes="/1/Port">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="subtrees" ordered="false" upperBound="-1" eType="/1/Subtree" eOpposite="/1/Subtree/port"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="OutputPort" eSuperTypes="/1/Port">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" ordered="false" upperBound="-1" eType="/1/Assignment" eOpposite="/1/Assignment/port"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Tree" abstract="true">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ownerBDD" ordered="false" eType="/1/BDD" eOpposite="/1/BDD/tree"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ownerSubtreeForZero" ordered="false" eType="/1/Subtree" eOpposite="/1/Subtree/treeForZero"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ownerSubtreeForOne" ordered="false" eType="/1/Subtree" eOpposite="/1/Subtree/treeForOne"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Leaf" eSuperTypes="/1/Tree">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Assignment" containment="true" eOpposite="/1/Assignment/owner"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Assignment">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" ordered="false" lowerBound="1" eType="/1/OutputPort" eOpposite="/1/OutputPort/assignments"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false" lowerBound="1" eType="/1/Leaf" eOpposite="/1/Leaf/assignments"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Subtree" eSuperTypes="/1/Tree">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" ordered="false" lowerBound="1" eType="/1/InputPort" eOpposite="/1/InputPort/subtrees"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="treeForZero" ordered="false" lowerBound="1" eType="/1/Tree" containment="true" eOpposite="/1/Tree/ownerSubtreeForZero"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="treeForOne" ordered="false" lowerBound="1" eType="/1/Tree" containment="true" eOpposite="/1/Tree/ownerSubtreeForOne"/>
+    </eClassifiers>
+  </ecore:EPackage>
+</xmi:XMI>
diff --git a/metamodels/BDD.km3 b/metamodels/BDD.km3
new file mode 100644
index 0000000..1f75c42
--- /dev/null
+++ b/metamodels/BDD.km3
@@ -0,0 +1,50 @@
+
+
+package BDD {
+
+   class BDD {
+      attribute name : String;
+      reference ports[1-*] container : Port oppositeOf owner;
+      reference tree container : Tree oppositeOf ownerBDD;
+   }
+
+   abstract class Port {
+      attribute name : String;
+      reference owner : BDD oppositeOf ports;
+   }
+
+   class InputPort extends Port {
+      reference subtrees[*] : Subtree oppositeOf port;
+   }
+
+   class OutputPort extends Port {
+      reference assignments[*] : Assignment oppositeOf port;
+   }
+
+   abstract class Tree {
+      reference ownerBDD[0-1] : BDD oppositeOf tree;
+      reference ownerSubtreeForZero[0-1] : Subtree oppositeOf treeForZero;
+      reference ownerSubtreeForOne[0-1] : Subtree oppositeOf treeForOne;
+   }
+
+   class Leaf extends Tree {
+      reference assignments[1-*] container : Assignment oppositeOf owner;
+   }
+
+   class Assignment {
+      attribute value : Boolean;
+      reference port : OutputPort oppositeOf assignments;
+      reference owner : Leaf oppositeOf assignments;
+   }
+
+   class Subtree extends Tree {
+      reference port : InputPort oppositeOf subtrees;
+      reference treeForZero container : Tree oppositeOf ownerSubtreeForZero;
+      reference treeForOne container : Tree oppositeOf ownerSubtreeForOne;
+   }
+}
+   
+package PrimitiveTypes {
+   datatype String;
+   datatype Boolean;
+}
diff --git a/models/OUT.bddmodel b/models/OUT.bddmodel
new file mode 100644
index 0000000..2631942
--- /dev/null
+++ b/models/OUT.bddmodel
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<BDD xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="BDD" name="Test">
+  <ports xsi:type="InputPort" name="a" subtrees="//@tree"/>
+  <ports xsi:type="InputPort" name="b" subtrees="//@tree/@treeForOne/@treeForZero //@tree/@treeForZero"/>
+  <ports xsi:type="InputPort" name="c" subtrees="//@tree/@treeForOne/@treeForZero/@treeForOne //@tree/@treeForZero/@treeForOne //@tree/@treeForOne/@treeForZero/@treeForZero"/>
+  <ports xsi:type="InputPort" name="d" subtrees="//@tree/@treeForOne //@tree/@treeForZero/@treeForOne/@treeForZero"/>
+  <ports xsi:type="OutputPort" name="s" assignments="//@tree/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForOne/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForOne/@assignments.0"/>
+  <tree xsi:type="Subtree" port="//@ports.0">
+    <treeForZero xsi:type="Subtree" port="//@ports.1">
+      <treeForZero xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForZero>
+      <treeForOne xsi:type="Subtree" port="//@ports.2">
+        <treeForZero xsi:type="Subtree" port="//@ports.3">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Leaf">
+          <assignments value="false" port="//@ports.4"/>
+        </treeForOne>
+      </treeForOne>
+    </treeForZero>
+    <treeForOne xsi:type="Subtree" port="//@ports.3">
+      <treeForZero xsi:type="Subtree" port="//@ports.1">
+        <treeForZero xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForOne>
+      </treeForZero>
+      <treeForOne xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForOne>
+    </treeForOne>
+  </tree>
+</BDD>
diff --git a/models/Test.bdd b/models/Test.bdd
new file mode 100644
index 0000000..65bf5dc
--- /dev/null
+++ b/models/Test.bdd
@@ -0,0 +1,27 @@
+bdd Test (in a, in b, in c, in d, out s) {
+  subtree a {
+    F:subtree b {
+        F:leaf s = F
+        T:subtree c {
+            F:subtree d {
+                F:leaf s = T
+                T:leaf s = F
+              }
+            T:leaf s = F
+          }
+      }
+    T:subtree d {
+        F:subtree b {
+            F:subtree c {
+                F:leaf s = F
+                T:leaf s = T
+              }
+            T:subtree c {
+                F:leaf s = T
+                T:leaf s = F
+              }
+          }
+        T:leaf s = F
+      }
+  }
+}
\ No newline at end of file
diff --git a/models/Test.bddmodel b/models/Test.bddmodel
new file mode 100644
index 0000000..6ffe94e
--- /dev/null
+++ b/models/Test.bddmodel
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<BDD xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="BDD" name="Test">
+  <ports xsi:type="InputPort" name="a" subtrees="//@tree"/>
+  <ports xsi:type="InputPort" name="b" subtrees="//@tree/@treeForOne/@treeForZero //@tree/@treeForZero"/>
+  <ports xsi:type="InputPort" name="c" subtrees="//@tree/@treeForOne/@treeForZero/@treeForOne //@tree/@treeForZero/@treeForOne //@tree/@treeForOne/@treeForZero/@treeForZero"/>
+  <ports xsi:type="InputPort" name="d" subtrees="//@tree/@treeForOne //@tree/@treeForZero/@treeForOne/@treeForZero"/>
+  <ports xsi:type="OutputPort" name="s" assignments="//@tree/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForOne/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForZero/@assignments.0"/>
+  <tree xsi:type="Subtree" port="//@ports.0">
+    <treeForZero xsi:type="Subtree" port="//@ports.1">
+      <treeForZero xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForZero>
+      <treeForOne xsi:type="Subtree" port="//@ports.2">
+        <treeForZero xsi:type="Subtree" port="//@ports.3">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Leaf">
+          <assignments value="false" port="//@ports.4"/>
+        </treeForOne>
+      </treeForOne>
+    </treeForZero>
+    <treeForOne xsi:type="Subtree" port="//@ports.3">
+      <treeForZero xsi:type="Subtree" port="//@ports.1">
+        <treeForZero xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForOne>
+      </treeForZero>
+      <treeForOne xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForOne>
+    </treeForOne>
+  </tree>
+</BDD>
diff --git a/models/Test.tt b/models/Test.tt
new file mode 100644
index 0000000..5dc021b
--- /dev/null
+++ b/models/Test.tt
@@ -0,0 +1,14 @@
+
+truth table Test (in a, in b, in c, in d, out s)
+{
+   {a=F, b=F,           s=F}
+   {a=F, b=T, c=F, d=F, s=T}
+   {a=F, b=T, c=F, d=T, s=F}
+   {a=F, b=T, c=T,      s=F}
+   {a=T, b=F, c=F, d=F, s=F}
+   {a=T, b=F, c=T, d=F, s=T}
+   {a=T, d=T,           s=F}
+   {a=T, b=T, c=F, d=F, s=T}
+   {a=T, b=T, c=T, d=F, s=F}
+}
+
diff --git a/models/Test.ttmodel b/models/Test.ttmodel
new file mode 100644
index 0000000..9f3da5e
--- /dev/null
+++ b/models/Test.ttmodel
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<TruthTable xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="TT" location="2:1-13:2" name="Test">
+  <ports xsi:type="InputPort" location="2:19-2:23" name="a" cells="//@rows.0/@cells.0 //@rows.1/@cells.0 //@rows.2/@cells.0 //@rows.3/@cells.0 //@rows.4/@cells.0 //@rows.5/@cells.0 //@rows.6/@cells.0 //@rows.7/@cells.0 //@rows.8/@cells.0"/>
+  <ports xsi:type="InputPort" location="2:25-2:29" name="b" cells="//@rows.0/@cells.1 //@rows.1/@cells.1 //@rows.2/@cells.1 //@rows.3/@cells.1 //@rows.4/@cells.1 //@rows.5/@cells.1 //@rows.7/@cells.1 //@rows.8/@cells.1"/>
+  <ports xsi:type="InputPort" location="2:31-2:35" name="c" cells="//@rows.1/@cells.2 //@rows.2/@cells.2 //@rows.3/@cells.2 //@rows.4/@cells.2 //@rows.5/@cells.2 //@rows.7/@cells.2 //@rows.8/@cells.2"/>
+  <ports xsi:type="InputPort" location="2:37-2:41" name="d" cells="//@rows.1/@cells.3 //@rows.2/@cells.3 //@rows.4/@cells.3 //@rows.5/@cells.3 //@rows.6/@cells.1 //@rows.7/@cells.3 //@rows.8/@cells.3"/>
+  <ports xsi:type="OutputPort" location="2:43-2:48" name="s" cells="//@rows.0/@cells.2 //@rows.1/@cells.4 //@rows.2/@cells.4 //@rows.3/@cells.3 //@rows.4/@cells.4 //@rows.5/@cells.4 //@rows.6/@cells.2 //@rows.7/@cells.4 //@rows.8/@cells.4"/>
+  <rows location="4:4-4:29">
+    <cells location="4:5-4:8" value="false" port="//@ports.0"/>
+    <cells location="4:10-4:13" value="false" port="//@ports.1"/>
+    <cells location="4:25-4:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="5:4-5:29">
+    <cells location="5:5-5:8" value="false" port="//@ports.0"/>
+    <cells location="5:10-5:13" value="true" port="//@ports.1"/>
+    <cells location="5:15-5:18" value="false" port="//@ports.2"/>
+    <cells location="5:20-5:23" value="false" port="//@ports.3"/>
+    <cells location="5:25-5:28" value="true" port="//@ports.4"/>
+  </rows>
+  <rows location="6:4-6:29">
+    <cells location="6:5-6:8" value="false" port="//@ports.0"/>
+    <cells location="6:10-6:13" value="true" port="//@ports.1"/>
+    <cells location="6:15-6:18" value="false" port="//@ports.2"/>
+    <cells location="6:20-6:23" value="true" port="//@ports.3"/>
+    <cells location="6:25-6:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="7:4-7:29">
+    <cells location="7:5-7:8" value="false" port="//@ports.0"/>
+    <cells location="7:10-7:13" value="true" port="//@ports.1"/>
+    <cells location="7:15-7:18" value="true" port="//@ports.2"/>
+    <cells location="7:25-7:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="8:4-8:29">
+    <cells location="8:5-8:8" value="true" port="//@ports.0"/>
+    <cells location="8:10-8:13" value="false" port="//@ports.1"/>
+    <cells location="8:15-8:18" value="false" port="//@ports.2"/>
+    <cells location="8:20-8:23" value="false" port="//@ports.3"/>
+    <cells location="8:25-8:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="9:4-9:29">
+    <cells location="9:5-9:8" value="true" port="//@ports.0"/>
+    <cells location="9:10-9:13" value="false" port="//@ports.1"/>
+    <cells location="9:15-9:18" value="true" port="//@ports.2"/>
+    <cells location="9:20-9:23" value="false" port="//@ports.3"/>
+    <cells location="9:25-9:28" value="true" port="//@ports.4"/>
+  </rows>
+  <rows location="10:4-10:29">
+    <cells location="10:5-10:8" value="true" port="//@ports.0"/>
+    <cells location="10:10-10:13" value="true" port="//@ports.3"/>
+    <cells location="10:25-10:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="11:4-11:29">
+    <cells location="11:5-11:8" value="true" port="//@ports.0"/>
+    <cells location="11:10-11:13" value="true" port="//@ports.1"/>
+    <cells location="11:15-11:18" value="false" port="//@ports.2"/>
+    <cells location="11:20-11:23" value="false" port="//@ports.3"/>
+    <cells location="11:25-11:28" value="true" port="//@ports.4"/>
+  </rows>
+  <rows location="12:4-12:29">
+    <cells location="12:5-12:8" value="true" port="//@ports.0"/>
+    <cells location="12:10-12:13" value="true" port="//@ports.1"/>
+    <cells location="12:15-12:18" value="true" port="//@ports.2"/>
+    <cells location="12:20-12:23" value="false" port="//@ports.3"/>
+    <cells location="12:25-12:28" value="false" port="//@ports.4"/>
+  </rows>
+</TruthTable>
-- 
GitLab