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