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 */