본문

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:

    ...

}


그럼 여기서 나오는 서브모듈이란 무엇인가? 복합 모듈을 구성하는 각 모듈을 서브모듈이라 한다. 서브모듈은 이름을 가지며, 이는 복합/간이(compound/simple) 모듈의 인스턴스이다. 서브모듈의 NED 정의상에서, 모듈타입은 대개 정적으로(statically) 지정되지만, 문자열 표현을 통해 지정할 수도 있다(이를 parametric submodule type이라 하며 3.11.1절에서 다룬다) NED는 서브모듈 배열(벡터)를 지원하며, 조건부(conditional) 서브모듈 또한 지원한다.서브모듈의 벡터 크기는 게이트에서와는 다르게, 항상 명시되어야 하며, 지정되지 않은채로 둘 수 없다. 기존의 복합 모듈에 새로운 서브모듈을 추가하는것은 서브클래싱을 통해 가능하다.(이에대해서는 3.4절에서 다루었다). 서브모듈의 기본 문법은 다음과 같다. 

module Node {

    submodules:

        routing: Routing; // a submodule

        queue[sizeof(port)]: Queue; // submodule vector

    ...

}


앞선 예제에서 보았듯,서브모듈은 몸체를 중괄호({})로 표현할 수 있으며 이때 매개변수를 설정하거나 벡터게이트의 크기를 지정하고 출력 문자열 속성(@display) 등과 같은 설정을 할 수 있다. 하지만 새로운 매개변수나 게이트를 추가하는것은 불가능하다. 중괄호내에서 설정된 출력 문자열은 타입에서의 출력 문자열과 결합되어 유효 출력 문자열을 생성해낸다. 결합 알고리즘은 8장에서 다룬다. 만약 queue: Queue; 만을 기입한다면 이는 queue: Queue{}와 동일한 효과를 갖는다.

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:

        ...

}


if 키워드가 서브모듈 혹은 서브모듈 벡터에 추가된다면 이는 조건부 서브모듈임을 의미한다. 벡터 사이즈가 0을 갖을 수 있으므로, 조건부 서브모듈 벡터는 효과적이지 않을 수도 있다.

 

module Host {

    parameters:

        bool withTCP = default(true);

    submodules:

        tcp : TCP if withTCP;

    ...

}



==========
gate vector를 벡터 게이트라고 했는데 submodule vector는 서브모듈 벡터로 하였다. 그런데 막상 생각해보니 벡터를 담는 게이트가 아니라 게이트의 벡터(배열)을 의미하는것이므로 게이트 벡터라고 표기하는것이 훨씬 좋을것 같다. 

원문출처 : OMNeT++ User Manual : 3.7 Gates, 3.8 Submodules


댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.