Acme description

Family PipesAndFiltersFam = {

  Port Type WritePort;



  Port Type ReadPort = {

    Properties {

      inputType : string = "char";

    }

  };



  Role Type Source = {

    Properties {

      outputType : string = "char";

    }

  };



  Role Type Sink;



  Component Type Filter = {

    Properties {

      prop : string = "invariant forall p : port in self.ports | declaresType (p, ReadPort) OR declaresType (p, WritePort);"; 

    };

  };



  Component Type BinaryFilter extends Filter with {

    Properties {

      binary : string;

    };

  };



  Connector Type Pipe;



};





System simple-demo : PipesAndFiltersFam = {

  Properties {

    invariant-2 : string = "invariant forall f : Filter in self.components | size(f.ports) >=2;"; 

  };

  Component Capitalize : Filter = new Filter extended with {

    Port stdin : ReadPort = new ReadPort;

    Port stdout : WritePort = new WritePort;



    Representation {

      System Aggregate-rep : PipesAndFiltersFam = {



        Component LowerCase : Filter = new Filter extended with {

          Port out : WritePort = new WritePort;

          Port inport : ReadPort = new ReadPort;

        };



        Component Merge : Filter = new Filter extended with {

          Port left : ReadPort = new ReadPort;

          Port right : ReadPort = new ReadPort;

          Port stdout : WritePort = new WritePort;

        };



        Component Split : Filter = new Filter extended with {

          Port left : WritePort = new WritePort;

          Port right : WritePort = new WritePort;

          Port stdin : ReadPort = new ReadPort;

        };



        Component UpperCase : BinaryFilter = new BinaryFilter extended with {

          Port stderr : WritePort = new WritePort;

          Port stdin : ReadPort = new ReadPort;

          Port stdout : WritePort = new WritePort;

        };



        Connector Pipe26 : Pipe = new Pipe extended with {



          Role sink : Sink = new Sink;

          Role source : Source = new Source;

        };



        Connector Pipe27 : Pipe = new Pipe extended with {

          Role sink : Sink = new Sink;

          Role source : Source = new Source;

        };



        Connector Pipe28 : Pipe = new Pipe extended with {

          Role sink : Sink = new Sink;

          Role source : Source = new Source;

        };



        Connector Pipe29 : Pipe = new Pipe extended with {

          Role sink : Sink = new Sink; 

          Role source : Source = new Source;

        };

        Attachments {

          LowerCase.inport to Pipe27.sink;

          LowerCase.out to Pipe28.source;

          Merge.left to Pipe29.sink;

          Merge.right to Pipe28.sink;

          Split.left to Pipe26.source;

          Split.right to Pipe27.source;

          UpperCase.stdin to Pipe26.sink;

          UpperCase.stdout to Pipe29.source;

        };

      }; /* end system */

      Bindings {

        stdin to Split.stdin;

        stdout to Merge.stdout;

      };

    };

  };



  Component Compress : Filter = new Filter extended with {

    Port stdout : WritePort = new WritePort;

    Port stdin : ReadPort = new ReadPort;

  };



  Component Package : Filter = new Filter extended with {

    Port out : WritePort = new WritePort;

    Port inport : ReadPort = new ReadPort;

  };



  Connector Pipe10 : Pipe = new Pipe extended with {

    Role sink : Sink = new Sink;

    Role source : Source = new Source;

  };



  Connector Pipe15 : Pipe = new Pipe extended with {

    Role sink : Sink = new Sink;

    Role source : Source = new Source;

  };



  Attachments {

    Capitalize.stdin to Pipe10.sink;

    Capitalize.stdout to Pipe15.source;

    Package.inport to Pipe15.sink;

    Compress.stdin to Pipe10.source;

  };

}; /* end system */

/* End of Design */