<?xml version="1.0"?>
<!DOCTYPE paradigm SYSTEM "edf.dtd">

<paradigm name ="xAlfa">

   <comment> Generated by the Meta2000 interpreter </comment>

   <folder name = "RootFolder" metaref = "1000" rootobjects = "Architecture Style " >
      <constraint type="function" name="COMPAT">
         <![CDATA[method;gme::FCO;inDat: gme::FCO, outDat: gme::FCO;ocl::Boolean;
-- inDat is subtype of outDat or viceversa
let typ = outDat.type() in
  let typIn = inDat.type() in
    inDat = outDat ||  inDat.subTypes().includes(typ) || typ = inDat || inDat.subTypes().exists(kk | kk.subTypes().includes(typ)) ||
     outDat.subTypes().includes(typIn) || typIn = outDat || outDat.subTypes().exists(kk | kk.subTypes().includes(typIn) )]]>
      </constraint>
      <constraint type="function" name="getInner">
         <![CDATA[method;gme::Connection;mapping: gme::Connection;gme::FCO;
let dest = mapping.connectionPoint("dst").target() in 
   let src = mapping.connectionPoint("src").target() in 
      if(src.parent().oclAsType(Model).atoms().includes(dest)) then
        src
     else
       dest
    endif]]>
      </constraint>
      <constraint type="function" name="getInput">
         <![CDATA[method;Duct;;FCO;
 if ( self.connectionPoint("dst").target().isKindOf(Input) )
   then 
         self.connectionPoint("dst").target()
   else 
        self.connectionPoint("src").target()
endif
]]>
      </constraint>
      <constraint type="function" name="getOuter">
         <![CDATA[method;gme::Connection;mapping :gme::Connection;gme::FCO;
let dest = mapping.connectionPoint("dst").target() in 
   let src = mapping.connectionPoint("src").target() in 
      if(src.parent().oclAsType(Model).atoms().includes(dest)) then
        dest
     else
       src
    endif]]>
      </constraint>
      <constraint type="function" name="getOutput">
         <![CDATA[method;Duct;;FCO;
 if ( self.connectionPoint("src").target().isKindOf(Output) )
   then 
         self.connectionPoint("src").target()
   else 
        self.connectionPoint("dst").target()
endif
]]>
      </constraint>
      <constraint type="function" name="getRoot">
         <![CDATA[method;gme::Object;;gme::Object;
if(self.parent().isFolder()) then
   self
else 
  self.parent().getRoot()
endif ]]>
      </constraint>
      <constraint type="function" name="input">
         <![CDATA[attribute;Twoway;;ocl::Set;
self.members()->select(i | i.oclIsKindOf(Input))]]>
      </constraint>
      <constraint type="function" name="input">
         <![CDATA[attribute;Interface;;ocl::Set;
self.members()->select(i | i.oclIsKindOf(Input))]]>
      </constraint>
      <constraint type="function" name="isConnected">
         <![CDATA[method;Twoway;;ocl::Boolean;
let somePortal = self.members()->any(1=1) in
if (somePortal.connectedFCOs(Duct)->any(1=1).memberOfSets(Interface)->size()>0) then
   self.members()->forAll( i,j :FCO|  i.connectedFCOs(Duct)->any(1=1).memberOfSets(Interface)->any(1=1) = j.connectedFCOs(Duct)->any(1=1).memberOfSets(Interface)->any(1=1) )
else
   self.members()->forAll( i,j :FCO|  i.connectedFCOs(Duct)->any(1=1).memberOfSets(Twoway)->any(1=1)  = j.connectedFCOs(Duct)->any(1=1).memberOfSets(Twoway)->any(1=1) )
endif]]>
      </constraint>
      <constraint type="function" name="isConnected">
         <![CDATA[method;meta::Interface;;ocl::Boolean;
let somePortal = self.members()->any(1=1) in
if (somePortal.connectedFCOs(Duct)->any(1=1).memberOfSets(Interface)->size()>0) then
   self.members()->forAll( i,j :FCO|  i.connectedFCOs(Duct)->any(1=1).memberOfSets(Interface)->any(1=1) = j.connectedFCOs(Duct)->any(1=1).memberOfSets(Interface)->any(1=1))
else
   self.members()->forAll( i,j :FCO|  i.connectedFCOs(Duct)->any(1=1).memberOfSets(Twoway)->any(1=1)  = j.connectedFCOs(Duct)->any(1=1).memberOfSets(Twoway)->any(1=1))
endif]]>
      </constraint>
      <constraint type="function" name="isInPortal">
         <![CDATA[method;gme::FCO;portal: FCO;ocl::Boolean;
portal.isTypeOf(Input)]]>
      </constraint>
      <constraint type="function" name="isInstance">
         <![CDATA[method;Particle;;ocl::Boolean;
if(self.getRoot().oclIsKindOf(Architecture)) then
 true
else 
  false
endif]]>
      </constraint>
      <constraint type="function" name="isMapped">
         <![CDATA[method;Twoway;;ocl::Boolean;
let myParent = self.parent() in
  let inputPortals = self.input in
    let outputPortals = self.output in
     if(inputPortals.size()>0) then
       let inputMapped = inputPortals->forAll (i:Input | i.connectedFCOs(InputMapping)->select(p:Input| p.parent() = myParent.parent())->size()>0) in
         if(outputPortals.size()>0) then
          let outputMapped = outputPortals->forAll (o:Output | o.connectedFCOs(OutputMapping)->select(p:Output| p.parent() = myParent.parent())->size()>0) in
             inputMapped || outputMapped
         else
           inputMapped 
        endif
    else
          let outputMapped = outputPortals->forAll (o:Output | o.connectedFCOs(OutputMapping)->select(p:Output| p.parent() = myParent.parent())->size()>0) in
             outputMapped 
  endif
   ]]>
      </constraint>
      <constraint type="function" name="isMapped">
         <![CDATA[method;Interface;;ocl::Boolean;
let myParent = self.parent() in
  let inputPortals = self.input in
    let outputPortals = self.output in
     if(inputPortals.size()>0) then
       let inputMapped = inputPortals->forAll (i:Input | i.connectedFCOs(InputMapping)->select(p:Input| p.parent() = myParent.parent())->size()>0) in
         if(outputPortals.size()>0) then
          let outputMapped = outputPortals->forAll (o:Output | o.connectedFCOs(OutputMapping)->select(p:Output| p.parent() = myParent.parent())->size()>0) in
             inputMapped || outputMapped
         else
           inputMapped 
        endif
    else
          let outputMapped = outputPortals->forAll (o:Output | o.connectedFCOs(OutputMapping)->select(p:Output| p.parent() = myParent.parent())->size()>0) in
             outputMapped 
  endif
   ]]>
      </constraint>
      <constraint type="function" name="isOutPortal">
         <![CDATA[method;gme::FCO;portal: FCO;ocl::Boolean;
portal.isTypeOf(Output)]]>
      </constraint>
      <constraint type="function" name="isTemplate">
         <![CDATA[method;Particle;;ocl::Boolean;
if(self.getRoot().oclIsKindOf(Style)) then
 true
else 
  false
endif]]>
      </constraint>
      <constraint type="function" name="output">
         <![CDATA[attribute;Interface;;ocl::Set;
self.members()->select(i | i.oclIsKindOf(Output))]]>
      </constraint>
      <constraint type="function" name="output">
         <![CDATA[attribute;Twoway;;ocl::Set;
self.members()->select(i | i.oclIsKindOf(Output))]]>
      </constraint>
      <attrdef name="Direction" metaref = "1917" valuetype = "enum" defvalue = "Initiator">
         <dispname></dispname>
         <enumitem dispname = "Initiator" value = "Initiator"></enumitem>
         <enumitem dispname = "Terminator" value = "Terminator"></enumitem>
      </attrdef>
      <attrdef name="Expression" metaref = "1226" valuetype = "string" defvalue = "">
         <dispname></dispname>
         <regnode name="multiLine" value = "25"></regnode>
      </attrdef>
      <attrdef name="Holds" metaref = "1137" valuetype = "integer" defvalue = "0">
         <dispname></dispname>
      </attrdef>
      <attrdef name="InputBehavior" metaref = "2009" valuetype = "enum" defvalue = "auto">
         <dispname></dispname>
         <enumitem dispname = "auto" value = "auto"></enumitem>
         <enumitem dispname = "receive" value = "receive"></enumitem>
         <enumitem dispname = "handle" value = "handle"></enumitem>
      </attrdef>
      <attrdef name="Loses" metaref = "1027" valuetype = "enum" defvalue = "None">
         <dispname></dispname>
         <enumitem dispname = "None" value = "None"></enumitem>
         <enumitem dispname = "Initial" value = "Initial"></enumitem>
         <enumitem dispname = "Last" value = "Last"></enumitem>
         <enumitem dispname = "First" value = "First"></enumitem>
         <enumitem dispname = "All" value = "All"></enumitem>
      </attrdef>
      <attrdef name="Multiple" metaref = "2006" valuetype = "boolean" defvalue = "true">
         <dispname></dispname>
      </attrdef>
      <attrdef name="OutputBehavior" metaref = "2010" valuetype = "enum" defvalue = "auto">
         <dispname></dispname>
         <enumitem dispname = "auto" value = "auto"></enumitem>
         <enumitem dispname = "send" value = "send"></enumitem>
         <enumitem dispname = "reply" value = "reply"></enumitem>
      </attrdef>
      <attrdef name="Shorthand" metaref = "2007" valuetype = "string" defvalue = "">
         <dispname></dispname>
      </attrdef>
      <attrdef name="Type" metaref = "2008" valuetype = "string" defvalue = "">
         <dispname></dispname>
      </attrdef>
      <atom name = "AlloyDataConstraint" metaref = "1391"  attributes = "Expression">
         <dispname>AlloyDataConstraint</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="data.bmp"></regnode>
      </atom>
      <atom name = "AlloyDefinition" metaref = "1885"  attributes = "Expression Shorthand Multiple Type">
         <dispname>AlloyDefinition</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="structure.bmp"></regnode>
      </atom>
      <atom name = "AlloyStructuralConstraint" metaref = "2026"  attributes = "Expression">
         <dispname>AlloyStructuralConstraint</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="structure.bmp"></regnode>
      </atom>
      <atom name = "AlloyTopologyConstraint" metaref = "1639"  attributes = "Expression">
         <dispname>AlloyTopologyConstraint</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="topology.bmp"></regnode>
      </atom>
      <atom name = "CoLaBehavioralConstraint" metaref = "1408"  attributes = "Expression">
         <dispname>CoLaBehavioralConstraint</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="behavior.bmp"></regnode>
            <regnode name = "icon" value ="behavior.bmp"></regnode>
      </atom>
      <atom name = "CoLaConcreteBehavior" metaref = "2053"  attributes = "Expression">
         <dispname>CoLaConcreteBehavior</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="behaviorinst.bmp"></regnode>
      </atom>
      <atom name = "Datum" metaref = "1914" >
         <dispname>Datum</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
            <regnode name = "icon" value ="datum.bmp"></regnode>
      </atom>
      <atom name = "Input" metaref = "1001"  attributes = "InputBehavior">
         <dispname>Input</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Disjoint_Partition" eventmask = "0x809000" depth = "1" priority = "2">
            <![CDATA[self.memberOfSets(Interface) -> size = 1 or 
self.memberOfSets(Twoway) -> size = 1]]>
            <dispname>Every Portal should be a part of exactly one  Interface or Twoway.</dispname>
         </constraint>
            <constraint name="ValidInputMappingDstCardinality0" eventmask = "0x0" depth = "0" priority = "2">
               <![CDATA[let dstCount = self.attachingConnections( "dst", InputMapping ) -> size in
(dstCount <= 1)]]>
               <dispname>Multiplicity of objects, which are associated to Input as "dst" over InputMapping, has to match 0..1.</dispname>
            </constraint>
            <constraint name="ValidInputMappingSrcCardinality1" eventmask = "0x0" depth = "0" priority = "2">
               <![CDATA[let srcCount = self.attachingConnections( "src", InputMapping ) -> size in
(srcCount <= 1)]]>
               <dispname>Multiplicity of objects, which are associated to Input as "src" over InputMapping, has to match 0..1.</dispname>
            </constraint>
            <regnode name = "icon" value ="input.bmp"></regnode>
      </atom>
      <atom name = "Output" metaref = "1002"  attributes = "OutputBehavior">
         <dispname>Output</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Disjoint_Partition" eventmask = "0x809000" depth = "1" priority = "2">
            <![CDATA[self.memberOfSets(Interface) -> size = 1 or 
self.memberOfSets(Twoway) -> size = 1]]>
            <dispname>Every Portal should be a part of exactly one  Interface or Twoway.</dispname>
         </constraint>
            <constraint name="ValidOutputMappingDstCardinality2" eventmask = "0x0" depth = "0" priority = "2">
               <![CDATA[let dstCount = self.attachingConnections( "dst", OutputMapping ) -> size in
(dstCount <= 1)]]>
               <dispname>Multiplicity of objects, which are associated to Output as "dst" over OutputMapping, has to match 0..1.</dispname>
            </constraint>
            <constraint name="ValidOutputMappingSrcCardinality3" eventmask = "0x0" depth = "0" priority = "2">
               <![CDATA[let srcCount = self.attachingConnections( "src", OutputMapping ) -> size in
(srcCount <= 1)]]>
               <dispname>Multiplicity of objects, which are associated to Output as "src" over OutputMapping, has to match 0..1.</dispname>
            </constraint>
            <regnode name = "icon" value ="output.bmp"></regnode>
      </atom>
      <reference name = "DatumReference" metaref = "2019" >
         <dispname>DatumReference</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Rule_S2_A2" eventmask = "0x0" depth = "1" priority = "2">
            <![CDATA[if (self.refersTo().parent().oclIsTypeOf(Style)) then 
let style = self.refersTo().parent().oclAsType(Style) in
  let models = style.models() in
        models->select(m:Model | m.referenceParts(DatumReference).includes(self))->size()>0
else
let arch = self.refersTo().parent().oclAsType(Architecture) in
  let models = arch.models() in
        models->select(m:Model | m.referenceParts(DatumReference).includes(self))->size()>0
endif]]>
            <dispname>All the datum references declared in the style must be to valid datums defined in the style or architecture</dispname>
         </constraint>
         <pointerspec name ="ref">
            <pointeritem desc = "Datum"></pointeritem>
         </pointerspec>
      </reference>
      <set name = "Interface" metaref = "1452" >
         <dispname>Interface</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Not_Empty" eventmask = "0x0" depth = "1" priority = "2">
            <![CDATA[self.members()->notEmpty()]]>
            <dispname>Interface or twoway must have member portals</dispname>
         </constraint>
         <constraint name="Rule_3" eventmask = "0x0" depth = "any" priority = "2">
            <![CDATA[ self.isConnected() || self.isMapped()
]]>
            <dispname>All Interfaces in a constituent must either be mapped or connected</dispname>
         </constraint>
         <constraint name="Unique_portal_name" eventmask = "0x809000" depth = "1" priority = "2">
            <![CDATA[let me = self.members() in
me->forAll(p1,p2: Portal | p1 != p2  implies p1.name <> p2.name)]]>
            <dispname>Portal names must be unique within an Interface or a Twoway</dispname>
         </constraint>
            <regnode name = "icon" value ="interface.bmp"></regnode>
         <pointerspec name = "set">
            <pointeritem desc = "Input"></pointeritem>
            <pointeritem desc = "Output"></pointeritem>
         </pointerspec>
      </set>
      <set name = "Twoway" metaref = "1706"  attributes = "Direction">
         <dispname>Twoway</dispname>
            <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Not_Empty" eventmask = "0x0" depth = "1" priority = "2">
            <![CDATA[self.members()->notEmpty()]]>
            <dispname>Interface or twoway must have member portals</dispname>
         </constraint>
         <constraint name="OnePortalEach" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[self.members()->select( i | i.oclIsKindOf(Input))->size = 1 &&
self.members()->select( i | i.oclIsKindOf(Output))->size = 1]]>
            <dispname>Each TwoWay should contain exactly one Input and one Output</dispname>
         </constraint>
         <constraint name="Rule_3" eventmask = "0x0" depth = "any" priority = "2">
            <![CDATA[ self.isConnected() || self.isMapped()
]]>
            <dispname>All Interfaces in a constituent must either be mapped or connected</dispname>
         </constraint>
         <constraint name="Unique_portal_name" eventmask = "0x809000" depth = "1" priority = "2">
            <![CDATA[let me = self.members() in
me->forAll(p1,p2: Portal | p1 != p2  implies p1.name <> p2.name)]]>
            <dispname>Portal names must be unique within an Interface or a Twoway</dispname>
         </constraint>
            <regnode name = "icon" value ="twoway.bmp"></regnode>
         <pointerspec name = "set">
            <pointeritem desc = "Input"></pointeritem>
            <pointeritem desc = "Output"></pointeritem>
         </pointerspec>
      </set>
      <connection name = "Allows" metaref = "1088" >
         <dispname>Allows</dispname>
         <regnode name = "color" value ="0x0000ff"></regnode>
         <regnode name = "dstStyle" value ="butt"></regnode>
         <regnode name = "srcStyle" value ="butt"></regnode>
         <regnode name = "lineType" value ="dash"></regnode>
         <connjoint>
            <pointerspec name = "src">
               <pointeritem desc = "Birelay Input"></pointeritem>
               <pointeritem desc = "Birelay Output"></pointeritem>
               <pointeritem desc = "Input"></pointeritem>
               <pointeritem desc = "Output"></pointeritem>
               <pointeritem desc = "Particle Input"></pointeritem>
               <pointeritem desc = "Particle Output"></pointeritem>
               <pointeritem desc = "Relay Input"></pointeritem>
               <pointeritem desc = "Relay Output"></pointeritem>
            </pointerspec>
            <pointerspec name = "dst">
               <pointeritem desc = "Birelay DatumReference"></pointeritem>
               <pointeritem desc = "DatumReference"></pointeritem>
               <pointeritem desc = "Particle DatumReference"></pointeritem>
               <pointeritem desc = "Relay DatumReference"></pointeritem>
            </pointerspec>
         </connjoint>
      </connection>
      <connection name = "Duct" metaref = "1003"  attributes = "Holds Loses">
         <dispname>Duct</dispname>
         <constraint name="Rule_S3_A4" eventmask = "0x80800800" depth = "1" priority = "1">
            <![CDATA[ let out = getOutput() in
     let inp = getInput() in 
           out.connectedFCOs(Allows)->forAll( outDatRef:DatumReference |  let outDat = outDatRef.refersTo() in 
                                                                              inp.connectedFCOs(Allows)->exists(inDatRef:DatumReference |  let inDat = inDatRef.refersTo() in COMPAT(inDat,outDat)))
]]>
            <dispname>The portal ends of the duct must allow compatible datums</dispname>
         </constraint>
         <regnode name = "color" value ="0x000000"></regnode>
         <regnode name = "dstStyle" value ="butt"></regnode>
         <regnode name = "srcStyle" value ="butt"></regnode>
         <regnode name = "lineType" value ="solid"></regnode>
         <connjoint>
            <pointerspec name = "src">
               <pointeritem desc = "Birelay Input"></pointeritem>
               <pointeritem desc = "Birelay Output"></pointeritem>
               <pointeritem desc = "Input"></pointeritem>
               <pointeritem desc = "Output"></pointeritem>
               <pointeritem desc = "Particle Input"></pointeritem>
               <pointeritem desc = "Particle Output"></pointeritem>
               <pointeritem desc = "Relay Input"></pointeritem>
               <pointeritem desc = "Relay Output"></pointeritem>
            </pointerspec>
            <pointerspec name = "dst">
               <pointeritem desc = "Birelay Input"></pointeritem>
               <pointeritem desc = "Birelay Output"></pointeritem>
               <pointeritem desc = "Input"></pointeritem>
               <pointeritem desc = "Output"></pointeritem>
               <pointeritem desc = "Particle Input"></pointeritem>
               <pointeritem desc = "Particle Output"></pointeritem>
               <pointeritem desc = "Relay Input"></pointeritem>
               <pointeritem desc = "Relay Output"></pointeritem>
            </pointerspec>
         </connjoint>
      </connection>
      <connection name = "InputMapping" metaref = "2141" >
         <dispname>InputMapping</dispname>
         <constraint name="Mapping_Validity" eventmask = "0x80000000" depth = "1" priority = "1">
            <![CDATA[let outer = getOuter(self) in
     let inner = getInner(self) in 
         inner.parent().oclAsType(Model).modelParts().includes(outer.parent()) &&
         inner.connectedFCOs(Duct)->notEmpty() ]]>
            <dispname>External portals can only be mapped to internal unsatisfied portals</dispname>
         </constraint>
         <regnode name = "color" value ="0x00ff00"></regnode>
         <regnode name = "dstStyle" value ="butt"></regnode>
         <regnode name = "srcStyle" value ="butt"></regnode>
         <regnode name = "lineType" value ="dash"></regnode>
         <connjoint>
            <pointerspec name = "src">
               <pointeritem desc = "Birelay Input"></pointeritem>
               <pointeritem desc = "Input"></pointeritem>
               <pointeritem desc = "Particle Input"></pointeritem>
               <pointeritem desc = "Relay Input"></pointeritem>
            </pointerspec>
            <pointerspec name = "dst">
               <pointeritem desc = "Birelay Input"></pointeritem>
               <pointeritem desc = "Input"></pointeritem>
               <pointeritem desc = "Particle Input"></pointeritem>
               <pointeritem desc = "Relay Input"></pointeritem>
            </pointerspec>
         </connjoint>
      </connection>
      <connection name = "OutputMapping" metaref = "2142" >
         <dispname>OutputMapping</dispname>
         <constraint name="Mapping_Validity" eventmask = "0x80000000" depth = "1" priority = "1">
            <![CDATA[let outer = getOuter(self) in
     let inner = getInner(self) in 
         inner.parent().oclAsType(Model).modelParts().includes(outer.parent()) &&
         inner.connectedFCOs(Duct)->notEmpty() ]]>
            <dispname>External portals can only be mapped to internal unsatisfied portals</dispname>
         </constraint>
         <regnode name = "color" value ="0x00ff00"></regnode>
         <regnode name = "dstStyle" value ="butt"></regnode>
         <regnode name = "srcStyle" value ="butt"></regnode>
         <regnode name = "lineType" value ="dash"></regnode>
         <connjoint>
            <pointerspec name = "src">
               <pointeritem desc = "Birelay Output"></pointeritem>
               <pointeritem desc = "Output"></pointeritem>
               <pointeritem desc = "Particle Output"></pointeritem>
               <pointeritem desc = "Relay Output"></pointeritem>
            </pointerspec>
            <pointerspec name = "dst">
               <pointeritem desc = "Birelay Output"></pointeritem>
               <pointeritem desc = "Output"></pointeritem>
               <pointeritem desc = "Particle Output"></pointeritem>
               <pointeritem desc = "Relay Output"></pointeritem>
            </pointerspec>
         </connjoint>
      </connection>
      <model name = "Architecture" metaref = "2160" >
         <dispname>Architecture</dispname>
         <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Rule_A1" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let constituents = self.modelParts(meta::Particle) +self.modelParts(meta::Birelay) +self.modelParts(meta::Relay)in
   constituents->forAll(c:Constituent| c.setParts(Interface)->forAll(i:Interface | i.isConnected()) && c.setParts(Twoway)->forAll(i:Twoway | i.isConnected()))]]>
            <dispname>All interfaces and twoways should be satisfied</dispname>
         </constraint>
         <constraint name="Unique_names" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let parts = self.parts(Duct) + self.parts(Particle) + self.parts(Relay) + self.parts(Birelay) in
     parts->forAll(at1,at2: FCO | at1 != at2  implies at1.name <>at2.name)]]>
            <dispname>Names of parts in a constituent must be unique</dispname>
         </constraint>
         <role name = "Birelay" metaref = "2191" kind = "Birelay"><dispname>Birelay</dispname></role>
         <role name = "Datum" metaref = "2192" kind = "Datum"><dispname>Datum</dispname></role>
         <role name = "Duct" metaref = "2193" kind = "Duct"><dispname>Duct</dispname></role>
         <role name = "Particle" metaref = "2194" kind = "Particle"><dispname>Particle</dispname></role>
         <role name = "Relay" metaref = "2195" kind = "Relay"><dispname>Relay</dispname></role>
         <aspect name = "Composition" metaref = "2196" >
            <part metaref = "2199" role = "Birelay" primary = "yes" linked = "no"></part>
            <part metaref = "2200" role = "Particle" primary = "yes" linked = "no"></part>
            <part metaref = "2201" role = "Relay" primary = "yes" linked = "no"></part>
            <part metaref = "2197" role = "Datum" primary = "yes" linked = "no"></part>
            <part metaref = "2202" role = "Duct" primary = "yes" linked = "no"></part>
         </aspect>
      </model>
      <model name = "Birelay" metaref = "1082" >
         <dispname>Birelay</dispname>
         <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Unique_names" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let parts = self.parts(Duct) + self.parts(Interface) + self.parts(Twoway) + self.parts(Particle) + self.parts(Relay) + self.parts(Birelay) in
     parts->forAll(at1,at2: FCO | at1 != at2  implies at1.name <>at2.name)]]>
            <dispname>Names of parts in a constituent must be unique</dispname>
         </constraint>
         <constraint name="ValidBirelayPartCardinality4" eventmask = "0x0" depth = "0" priority = "2">
            <![CDATA[let partCount = self.parts( "Twoway" ) -> size in
(partCount >= 1)]]>
            <dispname>Multiplicity of parts, which are contained by Birelay, has to match 0..*.</dispname>
         </constraint>
         <constraint name="ValidBirelayPartCardinality5" eventmask = "0x0" depth = "0" priority = "2">
            <![CDATA[let partCount = self.parts( "Input" ) -> size + self.parts( "Output" ) -> size in
(partCount >= 1)]]>
            <dispname>Multiplicity of parts, which are contained by Birelay, has to match 0..*.</dispname>
         </constraint>
         <regnode name = "icon" value ="constituent.bmp"></regnode>
         <regnode name = "icon" value ="birelay.bmp"></regnode>
         <role name = "Allows" metaref = "2058" kind = "Allows"><dispname>Allows</dispname></role>
         <role name = "AlloyDefinition" metaref = "2059" kind = "AlloyDefinition"><dispname>AlloyDefinition</dispname></role>
         <role name = "AlloyStructuralConstraint" metaref = "2060" kind = "AlloyStructuralConstraint"><dispname>AlloyStructuralConstraint</dispname></role>
         <role name = "DatumReference" metaref = "2062" kind = "DatumReference"><dispname>DatumReference</dispname></role>
         <role name = "Input" metaref = "1370" kind = "Input"><dispname>Input</dispname></role>
         <role name = "InputMapping" metaref = "2178" kind = "InputMapping"><dispname>InputMapping</dispname></role>
         <role name = "Output" metaref = "1371" kind = "Output"><dispname>Output</dispname></role>
         <role name = "OutputMapping" metaref = "2179" kind = "OutputMapping"><dispname>OutputMapping</dispname></role>
         <role name = "Twoway" metaref = "1707" kind = "Twoway"><dispname>Twoway</dispname></role>
         <aspect name = "Interface" metaref = "1283" >
            <part metaref = "2203" role = "Allows" primary = "yes" linked = "no"></part>
            <part metaref = "2204" role = "DatumReference" primary = "yes" linked = "no"></part>
            <part metaref = "1709" role = "Input" primary = "yes" linked = "yes"></part>
            <part metaref = "1710" role = "Output" primary = "yes" linked = "yes"></part>
            <part metaref = "1708" role = "Twoway" primary = "yes" linked = "yes"></part>
         </aspect>
         <aspect name = "Composition" metaref = "1239" >
            <part metaref = "2180" role = "InputMapping" primary = "yes" linked = "no"></part>
            <part metaref = "2181" role = "OutputMapping" primary = "yes" linked = "no"></part>
            <part metaref = "1711" role = "Input" primary = "no" linked = "yes"></part>
            <part metaref = "1712" role = "Output" primary = "no" linked = "yes"></part>
         </aspect>
         <aspect name = "Constraint" metaref = "2067" >
            <part metaref = "2068" role = "AlloyDefinition" primary = "yes" linked = "no"></part>
            <part metaref = "2069" role = "AlloyStructuralConstraint" primary = "yes" linked = "no"></part>
         </aspect>
      </model>
      <model name = "Particle" metaref = "1004" >
         <dispname>Particle</dispname>
         <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Particle_Behavior_Constraint" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let parts = self.parts(Particle) + self.parts(Relay) + self.parts(Birelay) in
     let behaviorExps = self.atomParts(CoLaConcreteBehavior) in
          let constraintExps = self.atomParts(CoLaBehavioralConstraint) in
               if (self.isTemplate()) then 
                    (parts->isEmpty() or constraintExps->isEmpty()) and behaviorExps->isEmpty()
               else
                    (parts->isEmpty() or behaviorExps->isEmpty()) and constraintExps->isEmpty()
                endif]]>
            <dispname>Composite Particle cannot have concrete behavior or behavioral constraints. Other particles should have behavioral constraints if they are templates or behavior if they are instances</dispname>
         </constraint>
         <constraint name="Unique_names" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let parts = self.parts(Duct) + self.parts(Interface) + self.parts(Twoway) + self.parts(Particle) + self.parts(Relay) + self.parts(Birelay) in
     parts->forAll(at1,at2: FCO | at1 != at2  implies at1.name <>at2.name)]]>
            <dispname>Names of parts in a constituent must be unique</dispname>
         </constraint>
         <constraint name="ValidParticlePartCardinality6" eventmask = "0x0" depth = "0" priority = "2">
            <![CDATA[let partCount = self.parts( "Input" ) -> size + self.parts( "Output" ) -> size in
(partCount >= 1)]]>
            <dispname>Multiplicity of parts, which are contained by Particle, has to match 1..*.</dispname>
         </constraint>
         <constraint name="ValidParticlePartCardinality7" eventmask = "0x0" depth = "0" priority = "2">
            <![CDATA[let partCount = self.parts( "Interface" ) -> size in
(partCount >= 1)]]>
            <dispname>Multiplicity of parts, which are contained by Particle, has to match 1..*.</dispname>
         </constraint>
         <regnode name = "icon" value ="constituent.bmp"></regnode>
         <regnode name = "icon" value ="particle.bmp"></regnode>
         <role name = "Allows" metaref = "2071" kind = "Allows"><dispname>Allows</dispname></role>
         <role name = "AlloyDefinition" metaref = "2072" kind = "AlloyDefinition"><dispname>AlloyDefinition</dispname></role>
         <role name = "AlloyStructuralConstraint" metaref = "2073" kind = "AlloyStructuralConstraint"><dispname>AlloyStructuralConstraint</dispname></role>
         <role name = "Birelay" metaref = "1196" kind = "Birelay"><dispname>Birelay</dispname></role>
         <role name = "CoLaBehavioralConstraint" metaref = "2074" kind = "CoLaBehavioralConstraint"><dispname>CoLaBehavioralConstraint</dispname></role>
         <role name = "CoLaConcreteBehavior" metaref = "2139" kind = "CoLaConcreteBehavior"><dispname>CoLaConcreteBehavior</dispname></role>
         <role name = "DatumReference" metaref = "2075" kind = "DatumReference"><dispname>DatumReference</dispname></role>
         <role name = "Duct" metaref = "1198" kind = "Duct"><dispname>Duct</dispname></role>
         <role name = "Input" metaref = "1005" kind = "Input"><dispname>Input</dispname></role>
         <role name = "InputMapping" metaref = "2182" kind = "InputMapping"><dispname>InputMapping</dispname></role>
         <role name = "Interface" metaref = "1456" kind = "Interface"><dispname>Interface</dispname></role>
         <role name = "Output" metaref = "1006" kind = "Output"><dispname>Output</dispname></role>
         <role name = "OutputMapping" metaref = "2183" kind = "OutputMapping"><dispname>OutputMapping</dispname></role>
         <role name = "Particle" metaref = "1007" kind = "Particle"><dispname>Particle</dispname></role>
         <role name = "Relay" metaref = "1202" kind = "Relay"><dispname>Relay</dispname></role>
         <aspect name = "Interface" metaref = "1288" >
            <part metaref = "2205" role = "Allows" primary = "yes" linked = "no"></part>
            <part metaref = "2206" role = "DatumReference" primary = "yes" linked = "no"></part>
            <part metaref = "1566" role = "Interface" primary = "yes" linked = "no"></part>
            <part metaref = "1567" role = "Input" primary = "yes" linked = "yes"></part>
            <part metaref = "1570" role = "Output" primary = "yes" linked = "yes"></part>
         </aspect>
         <aspect name = "Composition" metaref = "1012" >
            <part metaref = "2108" role = "Birelay" primary = "yes" linked = "no"></part>
            <part metaref = "2077" role = "Particle" primary = "yes" linked = "no"></part>
            <part metaref = "2109" role = "Relay" primary = "yes" linked = "no"></part>
            <part metaref = "2079" role = "Duct" primary = "yes" linked = "no"></part>
            <part metaref = "2184" role = "InputMapping" primary = "yes" linked = "no"></part>
            <part metaref = "2185" role = "OutputMapping" primary = "yes" linked = "no"></part>
            <part metaref = "1623" role = "Input" primary = "no" linked = "yes"></part>
            <part metaref = "1626" role = "Output" primary = "no" linked = "yes"></part>
         </aspect>
         <aspect name = "Constraint" metaref = "2080" >
            <part metaref = "2083" role = "CoLaBehavioralConstraint" primary = "yes" linked = "no"></part>
            <part metaref = "2140" role = "CoLaConcreteBehavior" primary = "yes" linked = "no"></part>
            <part metaref = "2110" role = "Birelay" primary = "no" linked = "no"></part>
            <part metaref = "2084" role = "Particle" primary = "no" linked = "no"></part>
            <part metaref = "2111" role = "Relay" primary = "no" linked = "no"></part>
            <part metaref = "2081" role = "AlloyDefinition" primary = "yes" linked = "no"></part>
            <part metaref = "2082" role = "AlloyStructuralConstraint" primary = "yes" linked = "no"></part>
         </aspect>
      </model>
      <model name = "Relay" metaref = "1039" >
         <dispname>Relay</dispname>
         <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Unique_names" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let parts = self.parts(Duct) + self.parts(Interface) + self.parts(Twoway) + self.parts(Particle) + self.parts(Relay) + self.parts(Birelay) in
     parts->forAll(at1,at2: FCO | at1 != at2  implies at1.name <>at2.name)]]>
            <dispname>Names of parts in a constituent must be unique</dispname>
         </constraint>
         <constraint name="ValidRelayPartCardinality8" eventmask = "0x0" depth = "0" priority = "2">
            <![CDATA[let partCount = self.parts( "Input" ) -> size + self.parts( "Output" ) -> size in
(partCount >= 1)]]>
            <dispname>Multiplicity of parts, which are contained by Relay, has to match 1..*.</dispname>
         </constraint>
         <constraint name="ValidRelayPartCardinality9" eventmask = "0x0" depth = "0" priority = "2">
            <![CDATA[let partCount = self.parts( "Interface" ) -> size in
(partCount >= 1)]]>
            <dispname>Multiplicity of parts, which are contained by Relay, has to match 1..*.</dispname>
         </constraint>
         <regnode name = "icon" value ="constituent.bmp"></regnode>
         <regnode name = "icon" value ="relay.bmp"></regnode>
         <role name = "Allows" metaref = "2085" kind = "Allows"><dispname>Allows</dispname></role>
         <role name = "AlloyDefinition" metaref = "2086" kind = "AlloyDefinition"><dispname>AlloyDefinition</dispname></role>
         <role name = "AlloyStructuralConstraint" metaref = "2087" kind = "AlloyStructuralConstraint"><dispname>AlloyStructuralConstraint</dispname></role>
         <role name = "DatumReference" metaref = "2089" kind = "DatumReference"><dispname>DatumReference</dispname></role>
         <role name = "Input" metaref = "1074" kind = "Input"><dispname>Input</dispname></role>
         <role name = "InputMapping" metaref = "2186" kind = "InputMapping"><dispname>InputMapping</dispname></role>
         <role name = "Interface" metaref = "1457" kind = "Interface"><dispname>Interface</dispname></role>
         <role name = "Output" metaref = "1075" kind = "Output"><dispname>Output</dispname></role>
         <role name = "OutputMapping" metaref = "2187" kind = "OutputMapping"><dispname>OutputMapping</dispname></role>
         <aspect name = "Interface" metaref = "1290" >
            <part metaref = "2207" role = "Allows" primary = "yes" linked = "no"></part>
            <part metaref = "2208" role = "DatumReference" primary = "yes" linked = "no"></part>
            <part metaref = "1575" role = "Interface" primary = "yes" linked = "no"></part>
            <part metaref = "1576" role = "Input" primary = "yes" linked = "yes"></part>
            <part metaref = "1579" role = "Output" primary = "yes" linked = "yes"></part>
         </aspect>
         <aspect name = "Composition" metaref = "1243" >
            <part metaref = "2188" role = "InputMapping" primary = "yes" linked = "no"></part>
            <part metaref = "2189" role = "OutputMapping" primary = "yes" linked = "no"></part>
            <part metaref = "1627" role = "Input" primary = "no" linked = "yes"></part>
            <part metaref = "1630" role = "Output" primary = "no" linked = "yes"></part>
         </aspect>
         <aspect name = "Constraint" metaref = "2094" >
            <part metaref = "2095" role = "AlloyDefinition" primary = "yes" linked = "no"></part>
            <part metaref = "2096" role = "AlloyStructuralConstraint" primary = "yes" linked = "no"></part>
         </aspect>
      </model>
      <model name = "Style" metaref = "2166" >
         <dispname>Style</dispname>
         <regnode name = "namePosition" value ="4"></regnode>
         <constraint name="Rule_S1" eventmask = "0x0" depth = "1" priority = "2">
            <![CDATA[let constituents = self.modelParts(meta::Particle) +self.modelParts(meta::Birelay) +self.modelParts(meta::Relay)in
    constituents->forAll(c:Model | c.setParts(Interface)->forAll(i:Interface | i.isConnected()) && c.setParts(Twoway)->forAll(i:Twoway | i.isConnected()) )]]>
            <dispname>All the interface and twoway templates must be satisfied</dispname>
         </constraint>
         <constraint name="Unique_names" eventmask = "0x800000" depth = "1" priority = "2">
            <![CDATA[let parts = self.parts(Duct) + self.parts(Particle) + self.parts(Relay) + self.parts(Birelay) in
     parts->forAll(at1,at2: FCO | at1 != at2  implies at1.name <>at2.name)]]>
            <dispname>Names of parts in a constituent must be unique</dispname>
         </constraint>
         <role name = "AlloyDataConstraint" metaref = "1873" kind = "AlloyDataConstraint"><dispname>AlloyDataConstraint</dispname></role>
         <role name = "AlloyTopologyConstraint" metaref = "1874" kind = "AlloyTopologyConstraint"><dispname>AlloyTopologyConstraint</dispname></role>
         <role name = "Birelay" metaref = "2098" kind = "Birelay"><dispname>Birelay</dispname></role>
         <role name = "Datum" metaref = "1915" kind = "Datum"><dispname>Datum</dispname></role>
         <role name = "Duct" metaref = "1017" kind = "Duct"><dispname>Duct</dispname></role>
         <role name = "Particle" metaref = "1018" kind = "Particle"><dispname>Particle</dispname></role>
         <role name = "Relay" metaref = "1042" kind = "Relay"><dispname>Relay</dispname></role>
         <aspect name = "Composition" metaref = "1019" >
            <part metaref = "2099" role = "Birelay" primary = "yes" linked = "no"></part>
            <part metaref = "2100" role = "Particle" primary = "yes" linked = "no"></part>
            <part metaref = "2101" role = "Relay" primary = "yes" linked = "no"></part>
            <part metaref = "1916" role = "Datum" primary = "yes" linked = "no"></part>
            <part metaref = "2017" role = "Duct" primary = "yes" linked = "no"></part>
         </aspect>
      </model>
   </folder>
</paradigm>

