본문
OMNeT++ Manual - Gates, Submodules
게이트(gate)는 모듈의 연결점(connection points)을 지칭한다. OMNeT++은 세가지의 게이트 - 입력(input), 출력(output), 입출력(inout) -을 지원하며, 여기에서 입출력 게이트는 입력게이트와 출력게이트가 합쳐진 형태를 띈다. 입력이든 출력이든, 게이트는 다른 게이트에 연결할 수 있다. (복합 모듈 게이트의 경우 이는 내/외부에 각각 하나의 연결을 의미) 권장되진 않지만, 입출력게이트의 입력부와 출력부의 연결을 독립적으로 구성할 수 있다.
게이트는 단일 게이트 혹은 벡터 게이트(gate vector)으로 구성할 수 있다. 벡터 게이트의 크기는 게이트 선언시에 대괄호([])안에 지정되는데, 이때 크기를 지정하지 않고도 ([]) 선언 할 수도 있어, 모듈을 서브클래싱하거나 복합 모듈 내의 서브모듈로서 사용하는등의 경우에 있어 확장/유연성을 지원한다. 또한 벡터 게이트의 크기를 자동으로 증가시켜주는 ++ 연산자를 사용하여 연결을 설정할 수 있기 떄문에 굳이 크기를 지정할 필요는 없다.
게이트의 크기는 sizeof() 를 사용하여 확인할 수 있다. NED는 보통 모든 게이트가 서로 연결되기를 원한다. 이 요구조건을 완화하기 위해, 특정 게이트에 대해 @loose 속성을 사용하여, 게이트 검사기능을 비활성화할 수 있다. 또한, 독립적으로 구성되어 sendDirect()를 통해 모듈이 직접 메시지를 받을 수 있도 설정된 입력게이트에는 @directIn 속성을 사용해야 한다. allowunconnected 속성을 모듈의 연결 선언부에 명시함으로서 복합 모듈내의 모든 게이트에 대한 검사기능을 비활성화 할수도 있다.
아래의 예에서는 Classifier 모듈은 작업을 수신하는 하나의 입력 게이트와 이를 전송할 출력 게이트들로 이루어져있다. 출력게이트의 크기는 모듈 매개변수에서 결정된다. 그리고 Sink모듈은 다양한 모듈과 연결될 수 있도록 벡터 게이트로 정의된 in[] 입력 게이트를 가지고 있다.
simple Classifier {
parameters:
int numCategories;
gates:
input in; output out[numCategories];
}
simple Sink {
gates:
input in[];
}
만약 다음과 같이 TreeNode가 정의된다면, children[]의 크기는 서브클래스 혹은 서브모듈을 통해 결정될 수 있다.
simple TreeNode {
gates:
inout parent; inout children[];
}
simple BinaryTreeNode extends TreeNode {
gates:
children[2];
}
module BinaryTree {
submodules:
nodes[31]: TreeNode {
gates:
children[2];
}
connections:
...
}
module Node {
submodules:
routing: Routing; // a submodule
queue[sizeof(port)]: Queue; // submodule vector
...
}
module Node {
gates:
inout port[];
submodules:
routing: Routing {
parameters: // this keyword is optional
routingTable = "routingtable.txt"; // assign parameter
gates:
in[sizeof(port)]; // set gate vector size
out[sizeof(port)];
}
queue[sizeof(port)]: Queue {
@display("t=queue id $id"); // modify display string
id = 1000+index; // use submodule index to generate different IDs
}
connections:
...
}
module Host {
parameters:
bool withTCP = default(true);
submodules:
tcp : TCP if withTCP;
...
}
댓글