adopted to git (cygwin)
[luayats.git] / apps / tn / test-down-up-noalign.lua
blob1fa924e4cf911c07dc342a9e631dad67166862a9
1 require "yats.stdlib"
2 require "yats.core"
3 require "yats.n23"
4 require "yats.graphics"
5 require "yats.user"
6 local fmt = string.format
8 -- Helper: units
9 local ms, us, ns = 1e-3, 1e-6, 1e-9
10 local Gbps, Mbps, kbps = 1e9, 1e6, 1e3
12 -- Fequently used functions
13 local t2s, r2s, s2t = yats.t2s, yats.r2s, yats.s2t
15 -- Init Simulation time
16 yats.sim:setRand(1)
17 yats.sim:SetSlotLength(1*ns)
19 -- Logging Setup
20 yats.log:setLevel("INFO")
21 yats.kernel_log:setLevel("INFO")
22 local log = yats.log
24 -- Simulation Config
25 local N = 4
26 local SOURCETYPE="cbr"
27 local RTT = 16*us
28 local TLINEUP = 2*us
29 local TLINEDN = 2*us
30 local SEGSIZE = 64
31 local CHUNKSIZE = 32
32 local FLEN = 1518
33 local N2 = SEGSIZE
34 local srate = 4 * Gbps
35 local rates = {
36 3*149*Mbps,
37 100*Mbps,
38 100*Mbps,
39 90*Mbps,
40 45*Mbps,
41 20*Mbps,
42 10*Mbps,
43 2*Mbps
45 local loads = {
46 0.95, 0.95, 0.95, 0.95, 0.95, 0.95, 0.95, 0.95
47 -- 1, 1, 1, 1, 1, 1, 1, 1
48 -- 1.1, 1,1, 1,1, 1,1, 1, 1, 1, 1
51 -- Graphic output configuration
52 local x,y,dx,dy = 0,0,200,100
55 local ddelta = t2s(1*us)
56 --local ddelta = 1000
57 local dupdate = ddelta/40
58 local dmaxval = 5
59 local senders = {}
60 local receivers = {}
61 local uplines = {}
63 ----------------------------------------------------------------
64 -- Network
65 ----------------------------------------------------------------
66 -- Demux PtP to receivers
67 local dout = {}
68 for i = 1, N do
69 dout[i] = {"receiver-"..i, "in"}
70 end
71 local demux = yats.demux{"demux", maxvci = N, nout = N, out = dout}
73 -- PtP LINK => PHY(demux)
74 dnline = yats.line{"dnline",delay = t2s(TLINEDN), out = {"demux", "demux"}}
76 -- DF Mux
77 local mux = yats.muxDF{"mux", ninp = N, active = r2s(1.2 * Gbps, SEGSIZE),
78 maxvci = N, buff = 100, out = {"dnline", "line"}}
80 -- Sources, Senders, Receivers
81 local src, d2f, msrc, mrx, mbf, snk, mln = {}, {}, {}, {}, {}, {}, {}
82 local mrxmean = {}
84 for i = 1, N do
86 -- Sources
87 if SOURCETYPE == "cbr" then
88 src[i] = yats.cbrsrc{
89 "src-"..i, delta = r2s(rates[i]*1.001, SEGSIZE), vci=i,
90 out = {"d2f-"..i, "dat2fram"}
92 else
93 src[i] = yats.geosrc{"src-"..i, ed = r2s(rates[i]*loads[i], FLEN), vci = i,
94 out = {"d2f-"..i, "dat2fram"}}
95 end
96 -- Frame generator
97 d2f[i] = yats.dat2fram{"d2f-"..i, flen = FLEN, connid = i,
98 out = {"scheduler-"..i, "in"}}
99 -- Sink
100 snk[i] = yats.sink{"snk-"..i}
102 local n2 = 10*us * rates[i] / 8
104 -- Sender/Scheduler
105 senders[i] = yats.scheduler{"scheduler-"..i, cycle = r2s(1.2 * Gbps, SEGSIZE),
106 n2 = n2, n3 = RTT * rates[i] / 8, segsize = SEGSIZE, out = {"mux", "in"..i}}
108 -- Receivers
109 receivers[i] = yats.receiver{"receiver-"..i, rtt = RTT, rate = rates[i], n2 = n2,
110 meantime = 100*us, watermark = SEGSIZE*1,
111 chunksize = CHUNKSIZE, out = {{"upline-"..i, "line"}, {"snk-"..i, "sink"}}}
113 --- Source rate
114 msrc[i] = yats.meter{
115 "msrc-"..i, title = "SRCRATE-"..i,
116 val = {senders[i], "Count"},
117 win = {x,y,dx,dy},
118 mode = yats.DiffMode,
119 nvals = 100,
120 maxval = dmaxval,
121 delta = ddelta,
122 update = dupdate,
123 display = false
125 -- Receive rate
126 mrx[i] = yats.meter{
127 "mrx-"..i, title = "CHNRATE-"..i,
128 val = {receivers[i], "Count"},
129 win = {x,y,dx,dy},
130 mode = yats.DiffMode,
131 nvals = 100,
132 maxval = dmaxval,
133 delta = ddelta,
134 update = dupdate,
135 display = false
137 -- Channel mean rate
138 mrxmean[i] = yats.meter{
139 "mrxmean-"..i, title = "MEANRATE-"..i,
140 val = {receivers[i], "ival4"},
141 mode = yats.AbsMode,
142 win = {x,y,dx,dy},
143 nvals = 100,
144 maxval = 1 * Gbps,
145 delta = ddelta,
146 update = dupdate,
147 display = false
150 -- Line rate
151 mln[i] = yats.meter{
152 "mln-"..i, title = "LINRATE-"..i,
153 val = {snk[i], "Count"},
154 win = {x,y,dx,dy},
155 mode = yats.DiffMode,
156 nvals = 100,
157 maxval = dmaxval,
158 delta = ddelta,
159 update = dupdate,
160 display = false
163 mbf[i] = yats.meter{
164 "mbf-"..i, title = "BF-"..i,
165 val = {receivers[i], "ival0"},
166 mode = yats.AbsMode,
167 win = {x,y,dx,dy},
168 nvals = 100,
169 maxval = N2 + RTT * 800*Mbps / 8,
170 delta = ddelta, update = dupdate,
171 display = false
173 -- PtP PHY => LINK(sender)
174 uplines[i] = yats.line{
175 "upline-"..i,
176 delay = t2s(TLINEUP),
177 out = {"scheduler-"..i, "credit"}
179 -- Configure demux
180 demux:signal{i,i,i}
183 ----------------------------------------------------------
184 -- Display
185 ----------------------------------------------------------
186 local instr = {}
187 for i = 1, N do
188 table.insert(instr, {msrc[i], mrx[i], mrxmean[i], mbf[i], mln[i]})
190 local disp = yats.bigdisplay{
191 "disp", title="TN PtP", nrow = N, ncol = 5, width = 200, height = 100,
192 instruments = instr,
194 disp:show()
196 ----------------------------------------------------------
197 -- Run
198 ----------------------------------------------------------
199 printf("Connecting ...\n")
200 yats.sim:connect()
202 local T1, T2, T3, T4, T5 = 500, 100, 567, 100, 500
204 yats.sim:run(t2s(T1*us))
206 local rec = receivers[1]
207 local snd = senders[1]
209 -- 1. Change rate DOWN - no hold-off time !!!
210 iup.Message("info", "Change down")
212 -- 1.1 Change and recalc n1 + n2 for scheduler rate adoptions
213 log:info(fmt("Changing linerate down"))
214 rec:setlinerate(rates[1]/3)
216 yats.sim:run(t2s(T2*us))
218 -- 2.1 Adopt max. buffer for min. delay after rate change
219 --local n2, n3 = rec:align(rates[1]/3)
221 -- 2.2 Adopting scheduler rate
222 --snd:setn2n3(n2, n3)
224 -- 3. Run a while at lowered rate
225 yats.sim:run(t2s(T3*us))
227 -- 4. Chage rate UP
229 iup.Message("info", "change up")
231 -- 4.1 Prepare receiver to new higher rate
232 --n2, n3 = rec:align(rates[1])
234 -- 4.3 Prepare sender to new higher rate
235 --snd:setn2n3(n2, n3)
237 -- 5. Run a while at low rate but old parameters Wait to Restore
238 yats.sim:run(t2s(T4*us))
240 -- 6. Now change the rate => no recalc, because everything has been set.
241 log:info(fmt("Changing linerate up"))
242 n2, n3 = rec:setlinerate(rates[1])
244 yats.sim:run(t2s(T5*us))
246 ----------------------------------------------------------
247 -- Result output
248 ----------------------------------------------------------
249 for i = 1, N do
250 local src, rx, tx, snk = src[i], receivers[i], senders[i], snk[i]
251 local cr = tx:getcreditcount()*(4+2+1)*8/yats.SimTimeReal
252 printf("ch-%d: src=%d rx=%d rx-loss=%d ur=%s sk=%d ra=%.1f Mbps cc=%d cr=%.1g Mbps %.1f %% bfmax=%d\n",
253 i, src.counter, rx.counter, rx.lost, rx.underrun, snk.counter, rates[i]/Mbps, tx:getcreditcount(),
254 cr/Mbps, cr/rates[i]*100, rx.maxbuf)