diff --git a/docs/diagrams/BDD.png b/docs/diagrams/BDD.png new file mode 100644 index 0000000000000000000000000000000000000000..bc98ff284996b21e0eef2c529af0062d66cd6f3d Binary files /dev/null and b/docs/diagrams/BDD.png differ diff --git a/docs/diagrams/Nodes.png b/docs/diagrams/Nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..95eae8fdadf165c28bd37c0b1752ae7dfa18136e Binary files /dev/null and b/docs/diagrams/Nodes.png differ diff --git a/docs/diagrams/TT.png b/docs/diagrams/TT.png new file mode 100644 index 0000000000000000000000000000000000000000..e337b87899ff19f55a61f39930c5c82f7d373853 Binary files /dev/null and b/docs/diagrams/TT.png differ diff --git a/docs/diagrams/Tree.png b/docs/diagrams/Tree.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1ed238507797b89575853ec035989bd5b13115 Binary files /dev/null and b/docs/diagrams/Tree.png differ diff --git a/metamodels/BDD.ecore b/metamodels/BDD.ecore new file mode 100644 index 0000000000000000000000000000000000000000..69350fbd450a55e45775ea7ba17238af4ebddd35 --- /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 0000000000000000000000000000000000000000..1f75c4271cb10fa8a6fb556f3e3fcb766b83c4ce --- /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 0000000000000000000000000000000000000000..26319428ab14c367af79965904f6f25eee1653f9 --- /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 0000000000000000000000000000000000000000..65bf5dca7274180d06959513b860a5c7ba45e61a --- /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 0000000000000000000000000000000000000000..6ffe94e40fb5c1439c9b729837d9158526d90937 --- /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 0000000000000000000000000000000000000000..5dc021bdd8b1c34770ebe570d4c075cf4ef318f9 --- /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 0000000000000000000000000000000000000000..9f3da5e374bb96648c7e6cb0e7ba4581308454a6 --- /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>