Example ToolBus Application Specification
As example we have an application consisting of two tools. Tool1 can either send a 'message' to Tool2 and then waits for an acknowledgement from Tool2, or it can send a 'quit' after which the application will shutdown. In this example Tool1 needs a separate adpter for communicating with the ToolBus and Tool2 has this adapter built-in.
Specification of the Tools
data module Data begin exports begin functions message : -> Tterm ack : -> Tterm quit : -> Tterm end imports ToolTypes end Data
process module Tool1 begin exports begin atoms snd : Tterm rec : Tterm processes Tool1 end imports Data definitions Tool1 = snd(message) . rec(ack) . Tool1 + snd(quit) end Tool1 process module AdapterTool1 begin exports begin processes AdapterTool1 end imports Data, ToolFunctions, ToolAdapterPrimitives, ToolToolBusPrimitives definitions AdapterTool1 = tooladapter-rec(message) . tooltb-snd-event(tbterm(message)) . tooltb-rec-ack-event(tbterm(message)) . tooladapter-snd(ack) . AdapterTool1 + tooladapter-rec(quit) . tooltb-snd-event(tbterm(quit)) end AdapterTool1
process module Tool1Adapter begin imports NewToolAdapter { Tool bound by [ tool-snd -> snd, tool-rec -> rec, Tool -> Tool1 ] to Tool1 Adapter bound by [ Adapter -> AdapterTool1 ] to AdapterTool1 renamed by [ ToolAdapter -> Tool1Adapter ] } end Tool1Adapter
process module Tool2 begin exports begin processes Tool2 end imports Data, ToolFunctions, ToolToolBusPrimitives definitions Tool2 = tooltb-rec(tbterm(message)) . tooltb-snd(tbterm(ack)) . Tool2 end Tool2
Specification of the ToolBus Processes
data module ID begin exports begin functions T1 : -> TBid t1 : -> TBterm T2 : -> TBid t2 : -> TBterm end imports ToolBusTypes end ID
tb-snd-msg
and
tb-rec-ms
.
The first argument of a message will always be the origin of the message, and
the second argument will serve as its destination.
Uppercase identifiers (of type TBid) are used as tool identifiers.
Strictly speaking these are not necessary, since there can't be any
communication with any other tool because of encapsulation.
By using them, however, the actions for communication with a tool will have
more similarity to the ones used in the ToolBus.
process module PTool1 begin exports begin processes PTool1 end imports Tool1Adapter, ID, ToolBusPrimitives, ToolBusFunctions processes PT1 definitions PTool1 = Tool1Adapter || PT1 PT1 = tb-rec-event(T1, tbterm(message)) . tb-snd-msg(t1, t2, tbterm(message)) . tb-rec-msg(t2, t1, tbterm(ack)) . tb-snd-ack-event(T1, tbterm(message)) . PT1 + tb-rec-event(T1, tbterm(quit)) . snd-tb-shutdown end PTool1 process module PTool2 begin exports begin processes PTool2 end imports Tool2, ID, ToolBusPrimitives processes PT2 definitions PTool2 = Tool2 || PT2 PT2 = tb-rec-msg(t1, t2, tbterm(message)) . tb-snd-eval(T2, tbterm(message)) . tb-rec-value(T2, tbterm(ack)) . tb-snd-msg(t2, t1, tbterm(ack)) . PT2 end PTool2
Specification of the ToolBus Application
process module Tools begin exports begin processes System end imports NewTool { Tool bound by [ Tool -> PTool1 ] to PTool1 renamed by [ TBProcess -> XPTool1 ] }, NewTool { Tool bound by [ Tool -> PTool2 ] to PTool2 renamed by [ TBProcess -> XPTool2 ] }, ID, ToolBusFunctions definitions System = XPTool1 || XPTool2 end Tools
At this stage renamings are necessary to be able to distinguish
the two processes TBProcess (and sets).
process module App begin imports NewToolBus { Application bound by [ Application -> System ] to Tools } end App
The main process of this application is ToolBus.