본문
OMNeT++ User Manual - 3.9 Connections
연결(Connections)은 복합 모듈의 connections 부분에 정의된다. 연결은 계층적 레벨상에서만 가능하다; 즉, 두개의 서브모듈 게이트를 연결하거나, 서브모듈과 부모 (복합) 모듈의 게이트 내로 연결하거나, 혹은 (별 필요는 없지만) 부모 모듈상의 두개의 게이트를 연결할수는 있지만, 부모 모듈의 바깥쪽의 게이트를 연결하거나, 복합 서브모듈의 내부에서는 연결할 수 없다.
입력, 출력 게이트는 단방향 화살표로 연결되고, 입출력(inout) 게이트는 양방향 화살표(<-->)로 연결된다. 두개의 게이트를 하나의 채널로 연결시키기 위해, 화살표 두개를 사용하고 그 사이에 채널 명세를 기입할 수 있다. @display와 같은 속성값을 연결에 적용하는데에는 기존의 방법 그대로가 사용된다. 참고로, 입출력 게이트는 실제로는 입력 게이트와 출력 게이트가 결합된 형태라는것은 이미 이전에 다루었다. 필요한 경우에, 이 서브게이트들은 port@i, port@o와같이 개별적으로 연결될 수 있다. 혹은 벡터 게이트의 경우 port$i[k], port$o[k]로 표현할 수 있다.
게이트는 서브모듈에 연결시 modulespec.gatespec으로 명시되거나, 복합 모듈에 연결시 gatespec으로 명시될 수 있다. modulespec은 스칼라 서브모듈의 경우 서브모듈의 이름이거나 혹은 서브모듈 벡터일 경우 서브모듈의 이름과 대괄호로 둘러싸인 인덱스가 결합된 형태로 보여진다. gatespec은 스칼라 게이트의 경우, 게이트 이름이고, 게이트 벡터인 경우, 게이트 이름과 대괄호로 둘러싸인 인덱스가 결합된 형태 또는 gatename++으로 표현된다.
gatename++ 표기법은 게이트내에서 (차례대로) 연결성이 없는(unconnected) 게이트 인덱스가 선택되도록 한다. 만약 해당 게이트 벡터에서의 모든 게이트가 이미 연결성이 존재한다면(connected), 서브모듈에서는 게이트 벡터 크기가 증가될 것이며, 복합 모듈의 경우, 마지막으로 게이트가 연결된 후에 발생하는 ++은 오류를 일으킬것이다. ++연산자가 $i 혹은 $o와 함께 사용되는 경우(예를 들어 g$i++, g$o++), 양방향에 대해 동일한 게이트 크기를 갖도록 하기 위해 게이트 쌍(입력+출력)이 추가될 것이다.
참고로, 왜 복합 모듈의 게이트 벡터를 확장하는것이 불가능할까? 모델 구조는 하향식 방식으로 설계되어있으며, NED에서는 방향을 바꾸어 되돌아가서 이들을 연결하는 방법이 불가능하기 떄문에, 새로운 게이트는 외부와는 연결되어있지 않은 상태로 남게될것이다.
* 채널 명세
채널 명세(연결 내에 -->channelspec--> 로 선언된)은 여러면에서 보자면 서브모듈과 비슷하다.
다음의 연결은 두개의 사용자가 정의한 채널 타입(Ethernet100, Backbone)을 사용한다. 이 코드는 매개변수(cost, length)를 어떻게 설정하고 출력 문자열(@display)을 어떻게 설정하는지에 대한 예를 보여준다.
내장 채널 타입을 사용할 경우에는, 매개변수로 채널 타입을 추론할 수 있으므로, 타입 이름은 생략될 수 있다. 만약 매개변수로 datarate, ber, per가 지정되는 경우, ned.DatarateChannel이 선택되고, delay나 disabled 매개변수가 사용되는 경우 ned.DelayChannel으로 채널 타입이 결정될 것이다. 그 외의 경우에는 ned.IdealChannel으로 설정된다. 만약 채널 타입이 명시적으로 표현되지 않는 상태에서 다른 매개변수가 설정되는 경우, 'ned.delayChannel has no such parameter'등과 같은 오류를 발생할 것이다.
a.g++ <--> Ethernet100 <--> b.g++;
a.g++ <--> Backbone {cost=100; length=52km; ber=1e-8;} <--> b.g++;
a.g++ <--> Backbone {@display("ls=green,2");} <--> b.g++;
a.g++ <--> {delay=10ms;} <--> b.g++;
a.g++ <--> {delay=10ms; ber=1e-8;} <--> b.g++;
a.g++ <--> {@display("ls=red");} <--> b.g++;
비록 복잡하고 불편하긴 하지만, 연결 매개변수는 (서브모듈 매개변수와 마찬가지로) 패턴 지정방식으로 할당될 수 있다. 채널은 원천(source) 게이트와 채널명의 결합형태로서 구분될 수 있다.(단, 채널명은 항상 channel이다). 양방향 연결의 경우 두개의 방향에 대한 설정을 각각 해주어야 하기 때문에 약간 까다로울 수 있다.
module Queueing {
parameters:
source.out.channel.delay = 10ms;
queue.out.channel.delay = 20ms;
submodules:
source: Source; queue: Queue; sink: Sink;
connections:
source.out --> ned.DelayChannel --> queue.in;
queue.out --> ned.DelayChannel <--> sink.in;
network Network {
parameters:
hostA.g$o[0].channel.datarate = 100Mbps; // the A -> B connection
hostB.g$o[0].channel.datarate = 100Mbps; // the B -> A connection
hostA.g$o[1].channel.datarate = 1Gbps; // the A -> C connection
hostC.g$o[0].channel.datarate = 1Gbps; // the C -> A connection
submodules:
hostA: Host; hostB: Host; hostC: Host;
connections:
hostA.g++ <--> ned.DatarateChannel <--> hostB.g++;
hostA.g++ <--> ned.DatarateChannel <--> hostC.g++;
원문출처 : OMNeT++ User Manual - 3.9 Connections
댓글