diff --git a/VHDL-2008.txt b/VHDL-2008.txt index f7b8a06..e2fe87c 100644 --- a/VHDL-2008.txt +++ b/VHDL-2008.txt @@ -1,8 +1,8 @@ -Quartus 18.1 Unsupported -======================== +Quartus Unsupported +=================== * Unconstrained arrays in records (Supported in Pro) * Vectors in aggregate statements e.g. V := ("0000", others => '1'); * Unary logical operators -* Referencing generics in generic lists -* \ No newline at end of file +* Referencing other generics in generic declaration +* Conditional Assignements \ No newline at end of file diff --git a/doc/Altera/cv_51001.pdf b/doc/Altera/cv_51001.pdf deleted file mode 100644 index 48bc97f..0000000 --- a/doc/Altera/cv_51001.pdf +++ /dev/null @@ -1,5627 +0,0 @@ -%PDF-1.3 -% -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<> -endobj -4 0 obj -<> -endobj -5 0 obj -<> -endobj -6 0 obj -<> -endobj -7 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -8 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -9 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -10 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -11 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -12 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -13 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -14 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -15 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -16 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -17 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -18 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> - /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -19 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -20 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> - /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -21 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -22 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -23 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -24 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> - /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -25 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -26 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -27 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -28 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -29 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -30 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -31 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -32 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -33 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -34 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -35 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -36 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -37 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -38 0 obj -<> - /MediaBox [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -39 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet - [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -40 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -41 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -42 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -43 0 obj -<> /MediaBox - [0 0 612 792] /Parent 6 0 R /Resources - <> /ProcSet [/PDF /Text /ImageC]>> - /Type /Page>> -endobj -44 0 obj -<> -stream -x[Ko$Wt~`ͱq@ -`_S/{43Z4ɪb=>9,#ߗJ3KKH2>z̔Ӟfӱ5nM 0Wi}դ6]m{g<|dCX~zz][^t 9H-{=/߾*DRNUV%Qca&0WP  f'K6&])۩'/MI1;2lٖJD|k]K\f#F\h{O-J{|g0_nnonoWzQ~aWp&?9vO<>!w۟O'ȷ^k@ߝ~As.=-u= \sgf`EFʸ:"-#2 x?-of}ke4iuK= ;at>QR3/yӫz>_ֳ.wX ޺yWI@;Vɦr-ϕ}vJMg -o5@hGDW!n9-~nzs}EWϞ=^vjV9sv=0+ QJJ}#G] c 9FƘ]L ں>t^ơ7@wrBX'x|-›ʆ o`t}T9٘ۻF/2Ilkﵑ a{vo F5Ȋn$| u6B-CA뭻9mձo%EBgUTSEDfE PGCd`JO]zbs5jؙ#HkzwJ0oρ%1Ek3"jbw?a X 4z LG 5xE֭щ%2p3R Fn|{ݹ]*ꀜ167!5N͞ ]'5$BEklDOS? VoըߠĎ;jAV1aLaC8;*Q8Tw@tj%4mCY'<:ᒻww+)>f06 4 ~e6~ؽzcTWNFB>BwsqNƌ9#TwVNS5XL4LR5; -nz92#]~WtT@j>V8R[H Y ҄E{Bn#8qU8HP0a{dXGma9#:ڹ#Ξrq>`]X%ңlsݏx4[_@QYGhot(63])X=돉2VMn7ʨ){ۛ:#fՂ:̎ mS%Qb!N9@'*PHeS)4.->ԉgEhʨQF]LQF݃2Ֆؿ=7LH3X#"N=ˍEG~DU"ȎPE݂*2|BQz,6yf0Im̦.Iږlc٩6tٴ\=\ 4L3a>Cr_PެN|bjqQ!28A]燔tAx>֥*Wѩ;}}S_N֬8j%ĈlX>k0 $,DN֮$ = O6V:Dͬ-r61ZOx u'P&(*Sa >WC<%EiV.E&j -*T2)HG8*-El١_`d L T0YD`IaF`?"V!a8;@*С,h44#g0wEF"h@Ɯ -.}0, I7BgLaWIEv0+RLdJa4T280"ruWqLM` ,- /k =G$j xFz`Ad )`V{2eZ ّQqX@jI"Al`I])oHު!V&k!q1pWr4`eH+C.4lZž#W(֐ܵ(G -&Bf;͋foi1M׎ՒSi QZ`6h8y+^`bH9et!}Il"( C jHj'f% TbҬren?N WZ`e) 9:F5bxEXTyzȪx>6v`ae6̇>LPAa٦*7YL!(s}oj) -΋ sk-?0RVރJboM:i]:dn'$G&3\ 3ԪS/ߩ;u/zZ1o~1&wt/Q}O~~VȵO r`;~ny ?K$:aÏC]YKx9T$֟@:z;_R.]]ϔ#d(+?S|/:w2fz&̎r&>.݋7Kՠl`A - -ktP'$\ -endstream -endobj -45 0 obj -<> -endobj -46 0 obj -<> -endobj -47 0 obj -<> -endobj -48 0 obj -<> /DW 0 - /FontDescriptor 51 0 R /Subtype /CIDFontType2 /Type /Font /W - [3 [342] 17 [361] 38 [724 830] 50 [850] 57 [764] 70 [588 699 664] 76 - [342] 79 [342] 81 [712 686] 85 [497 593 456 712 649 979] 92 [651]]>> -endobj -49 0 obj -<> -stream -xUn0 E|03BhX`JBXM:UtlkY>JZ`fZ f' IaDQ̽n_-έ(Kካ5;5C| h|ai3* qU~F`/k89TW 4=Cu_nHyH$ 3Azț(Cq *'Wq{~X $sYBLB2(JSDC$qsQl8bwP*U/ڻ b -endstream -endobj -50 0 obj -286 -endobj -51 0 obj -<> -endobj -52 0 obj -<> -stream -xڛ̠ܙ -endstream -endobj -53 0 obj -<> -stream -x\}|Sν4ir6IH[ -R(І)/E)PA --ZlV^ :AdSt -$-0ˠSL -_2M$ٟ 缟 -A>vg@G+rQ6sq.$fTƱe wlCoqxլOS*2tOc?$Wͯ[֗͜W=&<0`0[/>/﨩SwFƩj::sD CRT:TN' <ts/8Ud6'8v1)$y)'̤'nV}N=JC-?e}09ݗl& d nRM(HdO $6b!!أ%.'C; 1'Vzx6x>X^ ;O@R`(-0|$*rG#8 {pE q< 8/^~,l19Wu^j9z^A3;w:G+>XR ->#>ʗR7ۃK`-Jy/xJ?ņpMDkp >FAB cA(3-(pb]_cm y.t2O,pmcF,=8+s=q35%'uO%uZ&h뢴F@\^ISms:z"ul7LJzRGX|p|KXv!p$_\oN > gdG'|u&]T+oVT>âK8JWāݷOp)>2,q%|Ӣn8-RJ$ 4꾎9oy;6nhaF[_(+36*fr1U9.>lU9]L2|qcsl^Zg-`F ܁8bl|/nU:Ǖtu7\ .曛y @E\rvN\GYY7gPP1?6WUWV xUSJTQtpSxjOYv*ZTyz83bQM.n\0d?&Eu%rMW8ʱV*Va+NJ4ڠgPۤH-\Mmn{P72Z6)֠&`zWjz.5Ԍ-vI45js ihzm 8:ẉm=qJn=4F*esTE%Ue~W2{QtGm5j@u 9 ?irRApԕ -W, p ygxui¿Mі,q ';-N)=+if33o7((ACuQgҙq):O/.Sn̈ɉ芌~yeqf\u|X_]gXWmڸTKVf6[`x=z5YzȗJM99mҜR|O/%B7ޕ&klƀ̬ ^5ȝlXqd~?oyi.;Eb> +WaeӖN/3w|mm?rPJ8X:0g*p232b}o^89)!"B]ܞ\oq?5hb?7'sGZcp؄$y[|,9 y*Ύd)LU ]\ _+FטmKMK(87-hY )$iv_R1^:ԄC졞rbTU/,[|_pV߻8I=P'֗5 >Pb}L[s߶N<^xi: QO"lTLn̬PAӁRj@ŕ8VQ -+xLE7Z+ga안[Ψgq'FU/ܒ1fIÆ6/BO}g'A-fs=EV_ogQ?3K!9d29X6n >f86[~rJUS׍yiɓ_~{~sP+I9RzGo⬩}L -OCU#R:cVS%I䢤rJ_&51: $!!J|"C\\\L[bc5j@E㍍%⺯> mlwA Ϻőa1VQZ;gL˦/*kٹ^6'c}@^?+EøGvMwٵE2m ?03/r<'eZ$pViEOedވ,a=?*CcD W3>!$Mz|o_#"ZFk(UGc'sWk~VRAj{ -֒RR}&\6j&hCnoLV*ƬCձJ{0tu\«o{G ߿7hܲW*fL'1/^#`~)3;d>F )x9f҂0U3g -ttK@^FY(3frT O;I[Z2D߂B Ѩ3j!bGgx:i9aX)%XI#=buKMzcӭ]fpQRFX؃9 rV<70<0@m\Z&W'/,쾰ZҬ=n`b(\7Y`'b 螃XHiiBZ54+q@BBc> giٞ6t45C-T,GrOKFl,5AC7Mk;c9p#}ؼ[mw=~+ ͵{.|`p=3Yws>豚dt~aš3:+ -}0LH:zYl4b_YEQgQ_+.Emf`CPʢE &&P\0SM6LRn,++ÂYw\3hGIK7gmM&㳂/F -% em8q62;xN^, i.clQ uWE&iE([ '͸oߥ`|3#Ѧ:(& -|̾"N/L ,|m#8ODI`~:#4" ͓D= --HGx8Əb1DùIM(MiXŀ&5'e9 L~*WXLcqEk[TrVo*䫬$(W򼑲ƥ}q/CJ7o3)2F1,c`9c/È?/)+oE]c\+4M.*o#`8#=@(39y^gFv^v1> A0 mmP1] R~/$ HŪY Pб޲Pkc׌0ҿޘ"u=l1rE4.t߉l-鼲>|%m L(UyY;%$~w<0[ڱ0L{' olkڇR.j.aNyIݡ3wnc"+OKi{ɗ1 j؆rI$^"^BEE?4cþ;A@{W\kB\w( ߁?bg1?q{'DpߋczXuvb!til?:C!o.y9P c )_|/Z\.(W0'Ѷtr^o^ ~w^Osn'?FwWϏюft+-ӫQ}1GxA!RVsjR~V_ƒaSwaN6&X2B|mIx*54 Av>S=;JqGg O~yCL&7r"(|k9}nFLtLtj%oLPdʶFOOcm@ةSχkM0]܉S%g>N²Wva8Eq@YѥAe#u+gi3ʗa;ޅ.t ]BЅ.t ]BЅ.t ? -., TdS_mc/|X-b?Dl0$DL'"0a5}26yv1:<Ԓ,$ v,h6ș'd2)Ht^A p.2_s*j}2$"H^HHg0m0_0F&{ V{Ҫ -eó'%̒ -TCy;Z΄#X''>E7 - -0Ȥ plZXk 4[!#3akպVЅ׍ -ȕWb jiR.qu_3k XwB'g)rqEql6}6gnK?ضfzXmM?xs+يSO۟6o4AlĆM{l6GM%E|FG֐Y|`Axx[LkVg6OfO9fS)ǩSejNo3^-{UՍwf.lE>lD< -Òa7X>\o?!xnzqE'֘k)^㶯Z3ľe_5kW+ -W T -t^C+ -+e+DkD=>]vO_co!1!9ep8Iv-{t\|BtLlhmMz}AEec "x90A0X<o#I8DْK 0BaqnBN d [$. h(i"!?uha] Ĝ7厒Ϻר ZHÚu~w@Eᄒ@Mw`+<~][W[[ɧ)^1>7__r@W_X -pG&-jP XdZwoZmE79ǯ -endstream -endobj -54 0 obj -8929 -endobj -55 0 obj -20 -endobj -56 0 obj -<> /DW 0 - /FontDescriptor 59 0 R /Subtype /CIDFontType2 /Type /Font /W - [3 [352] 5 [459] 8 [1076] 10 [269 454] 12 [454 636] 15 - [364 454 364 454 636] 20 28 636 29 30 454 36 - [684 686 698 771 632 575 775 751 421 455 693 557 843 748 787 603 787 - 695 684 616 732 684 989 685 615 685] - 68 [601 623 521 623 596 352 623 633 274 344 592 274 973 633 607 623] - 84 [623 427 521 394 633 592 818 592] 92 [592 525] 95 [454] 135 [545] - 138 [1000] 140 [977] 148 [818] 177 [636 1000 459] 180 [459] 182 [269]]>> -endobj -57 0 obj -<> -stream -xUMn0b;@HYGp̐"c;TEק3n u8Wx  mxՃܦF(nt/3Eכ?8!*hC^}SB{Ebq[蔹 =4r$urc7 +rA(2a]3몔mW5UR٤2O(MQ%K~OzO>,ٳ:`gq`)Êw> -endobj -60 0 obj -<> -stream -xڛ?_ `UY - -endstream -endobj -61 0 obj -<> -stream -x |T8|ι3L&d0  a ! %,"[ nkmժaQARjmEk[ }ՊRBf{ιľ~~~N8{gy^FFġs+σ}^lF Dn_س|e ĿhڅP7Z`n;Z -f1T؟p^Uk;j(B}K͟K˾@_QƉ0K`ϲ-h _W,Y=9p_ w둀dVFYh Y9 * -΂VsAɸhG/fh5C8D{C'!~CLWĚDw) -]Ch/:>Wh?z .A?E?G@oRuѝa7YA(څBCt>~v2]nCwp^@1` N0:#cd {n{)pt`gZKGA7y-?ɩR3h)Mt&ړ$m@ۓ%^'$$fw67P~x@!kR(=^Cnހ^5wX{LP[SRVZTpgV`W86<6R8%}U]P7B!qʞ.S;JozXsgqsxzM]}<<P^[p#'<5K^3Lg}d )gԅqрF-Swx9 ˂[$ݾIZBki%= 48{U6<``d{V:*b^wP'kueWBv :g$b%;0 5O -F,؊w@Xqfkwl;Tm[f،X. :M:ӡNaM=ַ*>uJۆ[)^J8-vbhVB6MòMim'}5!:ӾTmp4>} B[۴#Ks{sixJuha]3ócQZ|[cP8ԗK;vd; 12"Mїy!g!0ubNA;E"'a*+E*R)z#z5WF뇖c.8>ry䗐Dwd M(ϒɒp,%;FP%]]ȢI~{O4|T+Nխ6b[µC©Q#;g#SYj:5bQmb2y[4E:i∆DH}D%߭߈s}RL] _#wU%;UQ+fW۠0# nz^Xi^i`n2d@DOdl=#AӪ:C,-5p`J[G2*E̬ҕYV-H -3 Z -3~&^"$nl^"^"E؎?-e 3ג8T`!ըEL;A@q"ʀ!ɍrrm2S'fPuvОvSC`U8%~=!CO ҊeT$?UMQ܀ vD3l ;+_}w䇉WٌwjB#{q!P#nŋEx6a0Jt!J#D07;^yQt'5R ye:+ga_Uᾪhiv5,&8}5y6cŐ=ُ,Ȣ=aО݌h){f(%tg0PHeyVwDzy -)m7dDxV͠J>.n/PtJ# -% ePЅkj@I"h N&'V_ -k;/v@>K,K\7>Էnٓ>e9gO;@'_@a՘(XlNPQVdEZ3jML'Mpn4lVEa nq 3=U3(s)<'ZApU#mF]$B/Z ,KITJu+@V:C|}&bCpv-wQ'pYA,SDD8 Åaj[CnC^]Y`kkmk -trURZYs;r:s;p<ϲ+I}P;er4ܮEHM$i=f'fG(U6(U䐗T/S ^KEzio^o|{~ o 9Uuh9VA*)R򣢹)%!~ǹ-W#>|ds;< nU_ ίg4z䚦s;ʍ_nx@G6Y͞h(ZR_ovͯN4umByFtyatI"<2g)++P5`%Vsb -Y8,0jMjE -ڼ!xSb7$ZUZ%`o4˭#t8>Dug41 .fD({v*2tmpz5Sx^V>rn8:>-RVYVqblLJDK'E?3aco /G.]qc 8t)2޻fny(<|ˬ {}6$d]!dn%@1 -( B1 -( {6 -D+1XhQH[,X@yN8b"qv"YxfujAb[D j M8?RT+ŀ6OO"aۗ&lXbDjڣxXTi9p+!'w?^Ky'1?,/сп<4]!n:Jb&/GrsYnt%Ku%7D5(BU+ M,ؙlES0_6S4==/TrN9F!dp{S⋹C( ^(%mAu0hDOG4 -sp3 9 ௘4z.[ٶio/EUiYugmBk4 Q+ ^j*i$XYH*/}T~P>E/k+ZYT8zNjZpϕ4fddNL i= 7ȥ)C!bĄ(:{]D j&ŮX4SOǕ4㙉:L̨ 8F(,݈BTWjk -(I~y7LjkaHψ7N&dTݐn9c-5Yg':\=k:֕Ń%;.-A)V2?њQN%/V'51HIY ܏ 7QlzE!^LF+AVǩ8}t㈠O[QokZkL_X׉c `*u%J(6-g=@Zxi[ `x$Ra2M5u -Ge١K; -X'r&*MTL?ŏ;qĥM*(nFDzkƗ_9/{,^aUeՎ&E6Y29k&ff[2:Ɩf.M8 WM*ۋS%lzU.2xpQh`?bjBFKJ -J3UEȚ\t,nKeqD#zfsDAW(jf&Qm0}ˆZMk^:5_h_叏;yƘqO/ٳv j9M?vLJ'7;l(z\Msb+_=E0)Պrܓ0eLfbRN(Gɮ -р -2STCy|TF)2Tŝ;nZxM۷?ukl}^o_K'f55v&^cGV :y;fJ5" 0MB5LX摌ejb1*)P(n@ P(06@ P@3 -Z`K-a.!濰^gI8ԗX+g RPN W˜$#L=?vn݌`LMЧ #\o צ3<`ή& -17n'kpO -x%̈J{A*`:\Š(r [Vmk£lSm UU9j5a pdVYHngZ|Gx7=$J& :R3q11' iRe.^P!qŒZ $7h -86,.al@՘2Q>RYaI+jjKĻ {^ -زwp9XNι`9]]sqy1ᄈij/%-?љ0r.Um7쐉, &pY!i%i+1TqО'vnhԆdj!0qR:ɜh s*E0hZHѴz R f-0Nc4kTz@򈶋A o { _g2iW*)0rie>jR[ -3qXo1HL_EgKSܞ仌9¡`tJp!}–~+`NW<Ԥ~=ɤ߳}N*J'3KjյoU$\).f2f+r3 4xKT4`4AM\i/]GJ%'׌r}w8}͈2 ߗ]c.Y0|=[e/ik ] V&,@hLvk#S ԱNߺ ;Ovؿ6h -m͈wf߿.͎u(WbD2@/"7ߙ `(Og -d0oLO^L~^q⬌2C\p{Hoa]n5adPcZFeBpBmP[`֮cr/$NA8tR2pe0v<fW&,Yxpin9;3tx޹Ia3[* U)&߀{_ʄ2=4]u'jPGUӍ+ 텘4ryCy:ԭ<.y^v;l .u v}qA 3uy4i+@WYYs>yd,6kvn;9>G8}KBQw={]p8 Z4o8O6n-pku@W rmv7NM/KYUHrHD_Sd{("*Δ{j9=RA}YWAW#D4PE6軁X[" pH '/k3Sg}o}yr_\n}v' _%68uFSq..gܱ 1jow/.BUD5 3QLb"e859S@O٭J9)B՚Cde:vVdb<,3),z'?tU02騫36viA.m,4RD*3N[ ڞH&l{60uֽ-9W-)>Pyߧ͌1T6|@e/ꊷC9u -3ˎG -kΖ݁W(5aՁ屎_(;/kaHWt'\5xU&WXQmZdt\1*bAU)Tlũbq -ps^`'Pȯ CQqڙ`]Ua ʒFTJjםStύyڜ3;u.ҹf-&L*RT cVښz2iI$-ŗyyxsxrpo֪_L/3N~|­+/WO|qǒ[t'%[ypT-[Ӽ]EJ@iQ84 a EZ;jf!n'O$`Dr6NF!_C'B} vQ 'T®o7BMR.ʸ(Sαr Nu):H[u9nZPdƾK7J؍4#sug7]]1۲' +q,e ]S[ mna<-0Qa9{zyRې௥;©P2~?^y+㧎?Tz - cʤq'LAn}W׍=jtMs[)l}8\~ j4GeCWDJɸ8T yAgDN -?s#YDJH 4OpGh"GxTDtl13s-s"-}8;Y qC$;F#BcaNƯBPȃ㊣Ȓ<Kkm`Y^yR1TbM;=-r E@(OĿ~ ߌo$kBr+‹ -e+CAp\mdQΐy*/WրJsݷ8=G Cblc 8Gf$EWj7CS,2T_viYLȖvDmϣ(qC:PP *>LS}dLb, b2wņd) c*[7I3s2[X<+3[23Uo6N]H5H[T7,|jSkF-+KDj}'ZC9hܧfGM,y .1񉹦W~LmtgSW]4#\QVsLǠgCn\Ȝ;kdJ{5]-"`#koE^y}Ŧ穢,Gemи= {wD5lc͈H`8|bVd#>:LZS,"[ڐiS -=B}FWg_Vٷj"}k8ۓ fm G~j]DFԳ`It{b٥IN-1ZyXK߾|7M)+nAj~RKKYQy9Wa9/;7_7E(Q'-aYvׄ[L(_;a;/+m‡BNٲ|`ZxzĻEP&i0\ZdlI˜nSu)) -9rE~1q),0E7(-$EJ ͜;׾8i -.Wɦ'g޽VGK&xL*OM؅ :4f__y<'X -1FEjao lm΋YxX2Xp} `og~Ea6K v%!CU . S2H@5Ų( -7`.D׬B\ ZG@f.=.=.c.ÇŞuکirJm#–6qTL0Ԗ ]]]]YSu]j& ߕo -1p18)o -HA>CXʷB:SI>F,>b5BpbhJۧ cLpqq̫=]%cN3 9uq875 Ǎzj˚lhDmL{7q8mV~WA4.lCXФ-Br`s {:Ay:5x=z8U0s]vYX"~CoNl> ' 7| Ԫec6}q_#Y -"rEhM^ke7[ jx+[#&4“m%е~%;0Ԗ.7hA(<Җa z=|>/kN_N޷mǟ!&o.\2ix3` -4͗az׏d+6-P&ZT/m -LWZ(xhhWeC Di0^ݿ?е8[ OO##V%~jp6F >%O8C *OSX=OE"("#Jo5^LYF]hN+zW5@cK*XN; -[SΠ tg_h>ѭS)7jO>iea@|,B&"fO \;X҄V|Z`M×aOq\IFAFIc0#g.sȑ2(+/S˦ ߏ2jfRĕ1 X',$ᵜݔkf<`fHe(4 n]~91Alg8߱﹇no{ I|xc'H<^{7J 7zZXA<13:ZXސc29}AG+_qfwqw7"R8 ܑ8}#C7"Rq" ]43nI='qѻg^Ӵo_K^๭Myʦ;HΞ88Q*†?%xฺ[fQ竑yYI\\ ]76[F ӭ-z%+k|'mheObf]zChw"6%Y:ݵguo 1]&}zbS{?mF%*-HzBuՠTl-L->35ֆ?3ٽꢢŗTߴari/62xN%Əǣoyax1-SZGm]W}uScagk329 wltH-~!"pf4j6 ٙ ҒۛKl\00ǡO8``$`No%!'{ylfb!m$J fH-976R<u|[TVjھ,]oyB"+I'Cۻ_ [t{M&kKdڝxT;\HqapL:^7ouY6MohvEhS>jJ6b2kB6p( // _*;kaAƚD34+13q8!WA/pTu@@Aiv y䳸jy"7VM^G6I7#bH5 N2sY Xg%H">_G_- w]U߱ x]b )f_Ih06@ -בGΝGkۙ QƓb_EQs}ouom,-w%Hst~=`\_5hed<+..RoWnȪ 7eϟ;v]g JfFܖ\·r8HСyY*ԕ?癒p}B}G߀vw((@;K!G.,qxV_&ĭ'x!\hJMI\O/as o|~0'Wޑ@.QTGGGO&nO5>y:څ@N mҟ&3" MYZ -f<}ywb7.R>PNk̫PK.D[~0o~UMMI4~D)lޟ{{/t$6 "T@8S /O2g iZ CcG?#Lt&LBUvDٗتػkB+_^OJ]XB^.=)~%*/Sm7z͉iY喨^ d%__W/MLx$E~^8pU o<ݛ =H!=գ[!OWc haV}66R oA*8An -WUP $M˅n  3| mJzD/40o>#Z| RH˂%1s>(?-D{i=Zž% Ah$\>Z!e -unaOõټiy9sgc:Sc'ݤ"wHik@< Gwd/-ߢh^A ^ QI#9\[๥B>zr^:r8 - i-ԝ'x urJ{ m| 7lP~Q8iyZ# s[[_FG^9N!Sj$;ax[h[K)cgtvH2=R,yZ!q1qh&J@6co @c0' 4?XOWC_-8SmmQ1rF@tt ЖS9>9@7sÜf)9IJk'Fcp󴎏BvZc/ڠAMO-g8ui834,p˓)寑KdѐH!mK= -GT>rQxҰ ; P]+Dp#V@͕AsTho0 -4J\~ -7ysXNu8?| --z^gJ_wu7@BO@4߲%S~\HTgDXg^R`.g -'v7~{`)y -24D?TD.9-DžF%8'=Gd<Uiy ;s]Ic `AdfPڣ7d3zp63rM䘃Q}Nu9jZ^l"HGU *{E7CU%@j0~iEϠ?ށyセjCw<.3 l dRF0;ͮp?،/0?rH)&He -$O.Cn#g0&ÆvNn R4B^f)r ]'=RD/d ec#kݣfcir90-^AC'ʧl47}`4J! 'lh _淣nJ{As_&D]E@n> h|{0]}n]ͷrօ0ΏA'GQ5'H?| mx~??_@ c _I: -٠Uh{/8{!7p E|잇lݨob$>Dszfcp/GzFSR H-WcX^wj}t,!Y($i(O6LKNODaC}zb8HOF%` ocDaDJ*7p masɅzJ3wKmR Uh-CqÞa^vquhK0|acǘ:+cMt6T_JũP"I`(3:=,vrxvGgc^9v!GA4|nKs٬'w,A  =)R R&$g ,f!L h?BIC2  k#p~YYM$zi&H!CC4Aλ!ZKq½`}AOh< ȥ3wt\o"a .DWׂ6ރV4Nm>8:>IXw@;&qFݏ?N/|vr%>KjQwDǛ|%`s샶!φLg7a_;u a{r#ÒSd Wn~&qht6.= 4Gmo`췡x!M>E8S5ڝ,Gn$yt%BWy Zqx ҫa.n~ -V87=ڲމr{B(3'w?B^о>泦!/F(̊K'@(p;B -mE(<x0] X#02𷆸B_ 4tB~O`ԕ"t[q -FAoqsmNZU|Vk 1 ΠZ?JsMzz?y/$yO 40яc1~L?ӏc1~L?ӏi.Z$tAeX/W9m79 9i47xM׭_[z@_}M_=x'TvAf(<hQ'$GRT -Q.@>7ʉU܀"Pu5mQ|gθnm"T;!7 8u>Z{h]RPzqM¥\ -e6vppHVSb 9eySo~icsy -!DE֐c\I2aOuqRǢ/r0f}ċ."Ib^L#ȃ >4cߟ&w 2<6"1Ϟ><Md/எ[AZ  ^i>>– n"k q -/2-kgOzzSoq=$'5nCGòO/\.o{|^oKaMeYԙΈ3d%s3#@*tN&Sp<9 'aH )aUFaL J -D:CD#D^d7&|V{r-:{dƧcFUo/])a[{Ҿ_,^KR>^pA"~>">Yԃ5ORt1z"]2[dKbaaG T%vITߵeG_wDm(a9+37fD&A !i Jn'/{x}'獁W -C'\nCDT)>! Zc[c-mj̆hj 64Tј1bhLXVmւlCVl`kFmmr6qT7WֿkeZjPy1E4k]4Zl`w Z=t3Teuk-=;ի]5-uV/t+NtxNo Sؿz;Ho[.-=yiI4tjٴg2Dti.\_("wPM9\-{姟9d:/{b:|Y~ -endstream -endobj -62 0 obj -20669 -endobj -63 0 obj -27 -endobj -64 0 obj -<> /DW 0 - /FontDescriptor 67 0 R /Subtype /CIDFontType2 /Type /Font /W - [3 [342] 11 12 543 16 [480 361 689 711] 20 28 711 29 [402] 36 - [776 762 724 830 683 650 811 837 546] 46 [771 637 948 847 850 733] 53 - [782 710 682 812 764 1128 764] 68 - [668 699 588 699 664 422 699 712 342] 78 [671 342 1058 712 687 699] 84 - [699 497 593 456 712 650 979 669 651 597] 95 [543] 177 [711]]>> -endobj -65 0 obj -<> -stream -xUn >(`> -endobj -68 0 obj -<> -stream -xڛ  -endstream -endobj -69 0 obj -<> -stream -x}y|U^Kҝtw:{'t@4  !@$0l6IȪ"8I(bq\fDmVy.3*(oDOHwnuw@ߛS[u=9 . f/oş7~#'Z^u7H<5%isoYvj)|@:@nRֶӛFL qRkZn'/YPN,^::6/i]ӡړqc銕56h:8~'=~!L }6'@2 #.K"!b!\ )$Dt?sk3֎pjԂc8 *s  $ad<|OGك }8)#2A#;mH8/t"'DVS+{'"dx^s=Clz x %~A.sSN M4 8,9J&7~Nu:. O3|R4ܧ6ꀺ֋7WO d]@ C#x<8:t,D>Hp~ |>O֐H_97Y)&N_\TX04?/77$;˛Ir ؘh-*j1"N%Q9J Ĕ7J^n~RwWE?~`RDa@d -+nh[X[҂w]=cBh=tYЫpnG/;h'tl^ -1;) wg > D^r<o EHX#i[{`7M0khBʵ"T3:V0hiwpWEk1x?a{yVwNJmE3g[Qź;vlu7nvlllAwTxe_vVpO!,dk.lexV,t9O& mjE;2cGE,@mH1kWZ4Įk(gyZ8li @EaPqu@]üb1Xw#j/#=@i=ÑЈbXؖ;z\cwh=q=;zwtTવ x;=coj1H{&cJnKc[ -^R+C R.$ԆFҩye[<h^ yCn7Ν0;=]}qϋhaWWlSٕ[<[:k2#+ڇry^zOdy砍3ؙ΋>'ڋȄ7==fo2[0MTO1(N{ZwT 􀻺~CQM{%د .6\~<+Tzr3emrl2׶dkAq{RvdmХ]?8mL{R@ -qLuicڧv:/ݹ84Q!p@ыwiIWwgt mS/-=uF1m*c>1Hmؾٸ͌=g6=Wܯ;̟4f,Q&P^bHy`{OohmIYw p'zy; FjH5kf,-%KRqI:i)EH@ n>6ה9Sl-rDQ-mGsԭ}}d=#+GVm;MH }V>yg s1Q\md mZ"[:haށ@x^OF>f* - -CiZjjZn[kQg2YGGɧ@"I7U&Vk-R~3y'ɇ ,  &>B? &LN"_Y67F0ng{_{o‐)E)V<1Nb.v`|[ ܜ֍$M_]g{Xj@l;FfV -]UD}%][.; VYUr(+D*h@Jv0bkg(6ܜ&E%Q$҂֢<{*S=Il+cW3UeczoUeƅ/\vb ֹmsωH9sQO |SL?#&(;G:E"10D0pR|Mg?@^)9Hc %3pYCbq݇q%$NNZ,nceqeeemMd)Z;#Gk.;oravEÐoM(8LT㤎ƔTf,tF1*(L= e4<|oBm%Puabv g65vb`z߶fcS/PBxfukl7tx0w^[;\Coꇘx뇛7td~l^ɤQ?9nDYom-ӯ,vxW8srt*C%rcxIsG+ J5zYɇ(#Ri0m^`p4K W0e8jvx)?Oǔi_͗5"7wGIIk2x5)u$nͿݿ)9}:iKˇ'qC'DbǕg2sDF.2[ Gr܌ܛfox!e. -͘a3$"FT%56J|:iQo5;M}'$r5fIߩ#}:y 4RaC&a"oAG5u׀ ֐d&Z.q BD|៤/;l9ۘϕ%|hRmnd.ĸISEE)ƺv:zK3j˩B ٶNC%Y=0ʾOc/ X7b 9}ʬ긾]GN?MLLI34%fOrג +^TY=%Yձ!JP`txxȰToJjlEtC!bHs|{[q4grcF3F#\oJFdW).+Ndxw5-~p$mJ̩/ʁM4Rf;E[נ.]e>loZ`k9x?U1FANIp|S| O#m%)&_diH>22nweddwd٩ 22x4pSCHMo4ۤ@ZyU{!{B=̷8ER:o҅Z;K2uUN=fȽcϭw/JJN5s,(2++d؉-7(,e&'Ũwfmvq$JIF#֩yt:(w\nɴQpqw:hDΆ4.lO Gȓ|M$E+Kohm5r7էʆ -FVgϩYfD,K=)rD"v]b"좜n1mE2/E0UXK^t imMdj>Z/ъpĬdXC0S -YtH#;MPf9r O\qᨼW^_W:2/oKU7.<@pAy5oGQ)))@؉4}n|*-IJn:PłPmNMcN |@sg/Z!Xg"(9vtJknyzFbLe mύnQ:#e1ɮb8a`3gG'g-6Ϗ4-MNSܹ9mRKY,Qgp(bQOwcSK ]\.y28bu6d`~Uiw)s%Wk͒rV_,IN%ݻ7+P> g0}]z BQ<wO1B2QA))"D5@LBGDd{g1cy wʞ%H'Iz !\ލq8 -.POY)T{j -EZv{-*Kwewewe,$ !G -U8#d(D՝jzvMjͳ<9kؔgN*0">Z]OH{/ڻG0{ibE -nq.˭jD# Ϥ{`zE\B+_J=j͛wz#LhORI$v, j-} ș r\05aiY,{O!s>:zVI8ʄ:EVac Rx_Q.r2.'I\q+`'6]-ܸV"DNuNڅS~&eK璕}GP4v[ "9*"* t:SvDK,߃ҠزGx = >CQ8P\C\R^?:0MJyRo|SI+.<=4 !aԕNb() -.)$I$['#04 -s#CБxCxx`a!ƤH!VBZ' 2wht,Z2##7QOyAdDAFE \EN!֒U*aNYGf]Q1UJB3 -Ut‚%-C&.f$ØTX|4i"P֋tH81:TlxLLXP<@Ӳ`eT )ȫcP[yyRwsN9́,?&ȁq!+6Ro LKYёm$tzi~(-sk6s$t/ҝ4=]}&7*Wˑf5B% b*EW #Y 11K3,sk#,0B'Ģ )OVTTd(kLߕMJ-dxw$0Jh$merHno:cŨf8lN8h}ܗ|^?JKCanJ ڿ5T ?a-~zOe|<Źicsvb1jeu{w& { iJ\' cΙE TQ,`o3csl`.M&Z( w d.ٗA3Z2H 3*]Yli>ޅ"x=ǥT}ҭ{8g_vx>V͘3$9i=j_?~79a-*˦CDE FӫtUq̜+Ȭ&b0ĽE$ 3nBPJ2>1ԛ&fr w/CRt72~ C0MrM׮0 zM|!#z~ēq"l$S.ЕӉD]y ancHij^I*+#VFE7A6S -Ye~(n8K$LB=xޒ __uߠ>#SI(u?}L꾩Χ%7Xb'ũ˖/^6h_djو^8l1u:8S3=l1tKԈRsY͒i?J$~fsۘx -Q͎Y ]Vݷ\9O0H KwqK;¤AmD}H8ux}R&{S:*Ϻ|-9{ۜjE!+#9͆Q03C&)SJ!J%HFsy~R2`3 r -}R+nJpSJѪW -e<4`bP6/a&^u1lzuSV ~+Ł!2]#~89x.B:\->=!S'rqfKQf)"y$tS;P3Ofddfvd 7C[ -  -e^j,+hKgx6f鑜ůyYudTgO/~LsV$'1?n2o )q9(.5G4g6OB*tVq}ٍ :d͎$Li5EHUU?ϒ -hIvf :9ŝv5mhLjF(޵nIHLvͬinG6aRyRw c3E3EbRDﵘ ;D'E8nC;ư`sue$3b-[2a(gk1IKgΏ&fYB`2g݆kaviZOc|kkü%1/n517N?p!S}nnnFs׏WۨnK ۗ<&y5`⧈@1*ɤ7)2@/n/2\A Kox~,Ih*2d9*f}p~9L1Y4ʁ~s2foY_X呜,sc:(PbA'p00N9`b.^J9;8 8I贺J^GIʊ7J/`Pz/+$/}eb¯S_Qc*c[&/?>}{ad7L_]Vei{$ H(6S#/?A"'+=ӦSeQHsnpP z7zƽF@)FsN^*m磃׊*h {}L:X 1:BJ57~nC=Y5E?Ӛ3Yϣ>w^]^dp݃ӂE{5ʟ 3#GvJ"%jvmMf%@0G -[^cq O,GEN1oP).KIIJrs̟$!&"\_0$ ObI=xt 𬔲U+l(Fѕd=խ8v`U]طXe\#S8; 昁^^pևJ.MQ:s/Ͻxqlb V W\>*..vTR;ASa%JP?_fҩ,en1m+ߨ,S1-2/EI<̹'BJKXRF`tY!ito ҶBI V#D+,v<Ϫ˪V3X U34:FQ'CgΒjR\>Icr0)'}!r&P%4p|N)HQ҇aVCғCIB ybn +E=e[6L%(/ZASjvg\MZᦟm *F$q ֑rd= -ܑr쐽r\!r|W~@>&$#"+7Z.-ut$IL@˸U,OF3`dQ7z}i֍D[ -6W\8Mk^.ѺUDh& 䀺ԢhE'IP \q+{=x5]l_wR_GE"@o 6󛨙r9xl 8o|T_?L-^C .ˌ?R94DO+cpX< =E ??a87xcp>%tzz> ܅080_I%B'WIq#I~6AX8)ݎ^Fxl2 X" !F'a;Yl__z&#Ѐ Vj>nXeav~D^ GظIfA!Qz'@"F}|#9q}#}=p'XC@ |9ەzDZ=?!l#țu! B<9O^L&€ ^µ{`!$+WS9 ;#0y=rH_IOhy'D#GYu!ᲈќù<i*yd) "Q/B-MfòP^O'!a4:Eb蛸+M6Q>l Ka&l1/9"h*+¯zq?0Ydx>eKpd]'`'`?pz{\Z~+/Y&o-I-Gv >,0-ؠNH@;`lǃNd>a=Yل >o*KX6mW &M߅y/VW ԆX`ȇPe@eP{i̮hv mA:I\I+yelfBE_g&mW(ڏp}H&{# ?9[_i P 9n_ f4zoU=oP7_85=dtG? vFoa'7>0|n0 Cp Ҝyqa?ty6nrD'^6GJec_D|W!^+*Oᜍ賘 |:flcN|2ٳ3`$8ƀEj8aZ0ԓA"\ 2.3kRnY`ta^m^RQ‹8bFh//| ?<:ӨJY@G:t%j2_x]7ch/a{!8z -!Մt%ԕ 3O\P] A@O`; -l_ ?}_kV]jIG¶I\o<4V ǂtWVLϱ ڱsvLӹch`1M~X;2+A2v*m -qСGi1% Q_^jKM;~z؞W|uW:ڮQah3Q)g<@kj1i{WhfwXpoA<c4η^D0n5 N1q $*/C} ^a@7=a Y^@h}y/ooo '/j4gkoCpm_A#t?CsYF :{H_ -QlC!ɨ̺UB3W \a7F;eM-w!`x s!0X `eB[l}Obb/!.qc@ 58qMW;IwxpDCjRR Ң>?ȸ SMB&! .C 9kΉ -tU -W*\pU -W*\pw@7p:}goiJ8_U^9AC&$$H2 [6 pPBOdq 1lFő d=]} BkHv ]j#5WZm. jšBvAmmGdnh9?NZEF\8:hm3 90c$}QsyLX2{8os>Nn݄ܳܵ-4k\h:<;!g : 1w/k3gjp9tCMw=fqkΏ|a Ǔ:8O!rGxg''Yx1?zܞܱޙ܊ycyCpg7>f9w$YYY͝1;]n7"vtvtrfie:%팍titfe2ԴS'6%:# Ƙ8mFFMf`0(:Ad  `6u_ J:7O KuBvNp P,;kIz"Q{PדQjg6rK#mȞ~q|̆$]Qe8gބ) = =yXb -O|zlxʹ|YEsg)>tU-SxI]_ mq -endstream -endobj -70 0 obj -14869 -endobj -71 0 obj -24 -endobj -72 0 obj -3852 -endobj -73 0 obj -<> -stream -x]M47nW@wYzC$N^DRgƸKlHEo4{W;}LL3SӺ &(_8-THIvgCwa9{ z{@v]_uadqߡ>Cc>XA}6!{Fk@.3?4UZlj[j=AKlO/oV軴";3Fz1ӫzZdxZ\=D/&Rqgf9/w;|O f:0Pֵ* ,ͼ=w~0-jS{j*um{^ƴӿˆ _Q8R#n 4͹ 1`gSٯV!p%}"M36Tƪsmr@$j5I\r˘G=]r%׻X_E9vY8gN'?IJ<kB>ZiN)쭠3ߗ#YĎ)p+3I0:}VkL<3y\yy2OEyJWU&CNJηi7w1ǦQI=Y3yC5M/{I#"!7֭7pM&g鲘L%1yj yʡ!Xϼ! ̢+}[ p7x@'+KM`L. 4fp."y<ϤKUcX}R-nE6u? zN{MjXݽ *zPr;zYۥ.~ZQW k帵rqyU4GЖIl䬏8mxFsU=E4.b$%F܉v'&?F&ǪtP{@xzmI$//9aQߍ˺-$^ -罹np{kt)|[{U^Hک躟ݥ2s}0^Xuh>[-߰~MtE߁s;oBru$`(_zلd8&sGPn%S`z54\lf93Y7o.^<_}77W)pB4G/n'y}py;3 y'ڭ#I+Ž8 YvMcL&^y#W:\r87_`E>C*ڛM -b*rA9o”R 6ߴ trk88kkya9(,zn볣շzv݈P@_1ƁAwY6=(weQ/~LѾ0y:GJ%9y~Xvag<q2TشRfs3 c// ɪ IJ0s&NyQ=EX4gݍHsȃKͶ^ -LbsLP$׆g -o:\Rŀfþ*Z]I-& Aу ;& %Uk^Sm9&ؐfN\RP>-qKQ~{BI),%67 P=I0Ŀk%hxg)z^hM咜0u.XaʗsfD{3~;WwA$6:2s̯S&fWX3{z!*ALjIf&m;Y:Y׃ gb!9mVp]\B.-r? -ir%nU) W`A JJP4ǵXXW1( >,ZFBNQpBylSJbSPwm܂bA+,I=KjvB EI{pb\+*KigouƢ$Q(4l153W5t)jHmF.EFjTuJǰl I8Ə%` w}/n.FU؊5+-%Uր wkÓQ -^UM}l"6nY$".>=7HT, -=e B5Q€-!7ᐰQwQ%cX ˣz: -.S._+$a:Ĥ5AJʱ !>?o|vޓJIH|eHtX7l~s@VM:uS*(wvBS9%X#&UWA A|KQգp$lvE Z7ojoTHIA4%v٫>\/%Û-Gڡ֑J0R$y:~\zkj kiN\݂m:m:NSӦ#4x:NdgFEjI%: 0t0a%M= IXu0tU7䀺,0thH ؘy,!(zP7C!'٣liD˕>l&\l68Χ3-[A-}CSsKrQ1zww0Mw=/ȼ8{8ֳ `^z)0F˵-[GgQ m Pqb4+\ҁ1UENNBi犺SSӻ#lJZ >S}3R:uS%[f^NU=p)`ځ,̪ʼn9xإe<㡭 ?4|ldCwgm:AI"x&Y/!RB3RJvW`,zSFm#̓4> ])D._ |zQPnI,.pZϟA< :t>dз& i5s&}.&$`NBת``~ B(:ꀋzl(<ĠFgjZ`A*)6YZw+jЏE^YuC}~$ FԲ[`8,tx&{ <{֫!J@@:|vGMjb%*]j%cFQTQfѨYS[f|, s̒" 'Y&!"J'9|9 3ZNJЍev]l8V8|i<q K3l;{!S&4P&CYSqȼ_퐆X)_ p+bKX@e4 AwUH'Eg ZT|nrti*YI%V`,\lbHȏ3@gH ;"(`0L*Chd -pC"D;d5S4Ģ(:mfIY6#WqU*'3S/,!iػyab -n b -Է'3`>h:Y`֞JDO R| GM}AQ 6XצIn5Rt44mid'$Krbɥ5Kr8 L_BE/> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [320.09277 568.65002 401.05762 575.65002] /Subtype /Link /Type /Annot>> -endobj -76 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [352.43018 341.04996 467.83105 348.04996] /Subtype /Link /Type /Annot>> -endobj -77 0 obj -<> -stream -x]Io,9rW乁*sM @R I3sd2$~P+%RZ$/})4ĀLVw=%YyCLd:)aw]<.d\bA|?ͺkBNժ^T)hOol-?-¿:LSHWk{{mW0, > ᷔJwx\˷ r)crS3@fe_ෆ8GV뉡5LԚǩy/Y7a6Oo+W1n3]S(b'3 =>E6ʹwyp5r`=40ɳ l ˷}D~A_$n3ePgyg3Ջz3?˪s $WQS 49=YY_\7nI_ܰ=fʿ{xc(@b*:{kBxhu*'^&ns19ĞFWq!R ZVLIj]psFǁH)!kxCbA_a]zj7})s%@D1eD%> -0mLQ0zú?)SKq-u zm"TWfp!iYHy9"*j.CaL)TK~~j+98ʀx"X{,6N khTf) mVooSB{ie𡙶N1Bodd5檌_ 6i>spȣ`2nwab0`1ǦmKC"Yqbd t25'Mq'::,ˑv$62:,\`2diq?K[ZvgX  6v5`}\.MI-dcƻ\x.\F;ʢlmZ-A^! !eCmY0l3o5(}KDzp뙪3c#c]gnK"`|zi`ޕy5w.6'r(!Q{} ,_2,-hP,Eg"tM>fg1ĩ] oX?R@}M?"WSvTE%Պ3- -"53n=ee`i(.c0d3mT4: +͊m2g^9 moć{OdgvC|tG~ivVO峽hLV[wL؆"Ep0bVv8m+ON&4[2h*X!?1~Iv+l8¬lo2 WC)R fD6ozwQqMmLm![f3bOp+YE6ٕyG2_[ێfӑ#)oF|4l#dܐ=yG*YX7z8&_Hg{$ 8!Uoǔ>k9}hmH³ٝags۫墘8(Vzm|+om콹p\MZ7}|'vȷz$69 0f=[}׮-7yp( |4L߀hv|Ҽr+:?i8ʘICG .m YW#wM<vk0^$1/]úgåov6e4v6SN˖f7qw*3Gxy3r$ #`D%p+CQ٫߯ܢ_wnP|wM>%S\5/v?./TorL!1Y\^oF$stl[ ?*=}Sm SuTr{C\hy?WrF3;zuMkDzQ{na2LVhR3 : aHݝ -NgKP?͙1 lzݸM>_))tocٵ<Q|)܄WBf@N?vs᭓U{uf?HGObBίͪ|mfWƙ$qG"vݱQ)'brL5XGĥ{{ϫpWK^ZWotT7`j_J?'^25n-1u]'P9?4:FbFB| o%վ~[~N'Dxof<5P[Gln &TXHӈ܈pcN%> -J]m7X^GR\ c^>O(M9ɳv:XAXHxO9D[|h c4wz!Ъ̀O&YeDRV00. Zd{z_ĨlȒܐyY@U0U8zԎ4RN"#iEʵNuIS}[~6;pC,F -B(e`:Qx>m6g<,ttGi4(6`$ߛ7ס/iljgƊ4+H M*rA$A8# ' .9_u `b nV !9+ uTHiɚm)_p zi]覭Wdje^O-0(Ms*16'ft{&NDKL$iFX-~.ՒR$?J?.MJf 6̞Qʻ(QjȺxXC`8y ( NGuUL*q `Y+UAG&C,7 -qVPhITAq 5&% ?hV܀Z4J)xatهE+0 5<-H0$T @k2̅1 C>!J$.w`hᰌݳ&޸qU8%n@ h@W -.eMETtJInJQwpTHB;Vx`ꓻhR{#A$"~B{R ?ArE#`!'$̄h%xβ<vkZJb770c`%~H)b)OdMMc.`(4Fm%}v!?Pޫg -&4E_!ѭi)Fei"A}b=,Z|(\B܂H}Zt 5 R{G>R+% [ -8Fe)E_{ब] *s2 CPf/tt$;[n*h]gK2`8@*)O30Щ\IJʙ+N $:o}qoꆋu0dZ'I%33u%0>\Z d[tWZ=o@[w qr DVx qB2J&̓mvE[)">P{IX(k7%n1ԅ+g:{;蝹/tD~K҂-giAx}^&{|cy |?CۍA.V_xom~F]e +&&vWfًo*}lWh` eG&^4_EXw[6+I޶ڨښ%'8 -endstream -endobj -78 0 obj -5455 -endobj -79 0 obj -<> -stream -x]Ko$9rWy*dI;24'cÐ ^;"$̪Rw3ӣV1 Ƌʞ~̤ ~c*43E;- I`e 祧*IJ^Ͳ6ZN+]ujP}9*aŦÊ*({k7kOQdƖ!E%63)j D wm@/zӗZ9%@K-U1}+( ԗ$[PC낲8 GPxyGHOk. }_r<*c@7]-=X,.Xf~Cp+!D!(s]TݳՈT>IjD~YԹi4B]KQa\a?ԯ9ꔑ -Lһ5TrВOo9ÖVmh :,6*R;[S^rcGyѽ>>$OzUceɵUYVl%fY$ %Iu(g?w?3&_q*9VPJLP>ǡ ̯kS/03W ]gn}2 vC"1VQ{i椸drks>'_/'MmEcbIF'&~|΄B?QN-u!TY4qX#9F+XN -p[B^\uv? |~͎O Hn2^.6(<r -"/>)ii|۔p%nJ3>zJmCfa ku+,Pv u]~-y%^edCR^Gnn[䥥Ff51,ѴܯUXK&/Kk -ɽt˝iѰ9Ni:cH6uvu+wDBCzbZz7D|FQ1YD)MYf,r{!L -n04BfNi:>=~7ygOVV׵;xK[` My`abKZx7d/\+R=;Y1[շu4> ^Lz#n3U"lƜŐ{4dJEBdʘOrDҞӠ}uMَtL(>ZSNX3bbnXa]yCNS͇M߱wdOy .ם,Wn]R-9ko~فy"x_U:]&Z.n.)8ސ, PRǵI|k*/.[OW%ʭȗ7m7| rZw2ApN -/ x>&DJ*l kwthNW8F\w^-Wg7+$3pnǝ^j֙η\/b퐕JQ][wq&]%H ޣ"2pN*6ZTAlGMe*4sf܍R< 琣%)Z A()fIPl" \h$6~R{tYʰP-%9Wa8{v1o vd@8tnhWH! m,lʤQ:>_* 3{R f Bda&}m\Ԋݫw] -ȺdY_GnV+n J++X%]^ׂs\ E5Ji(<\!\`%eX` 4WjUT(^R೑SMAP؞UVzEA0 ;Kj7cHQNu.K\z-د}%\I׎gA*(TiOܬɡh܋JdKصΚrGsD! 4e O~%Pr:Cv VMH//\"bicz56`rl&{mNn!&FYI-1,dbtͪCvGF)E#^G[#II ͗ZŜx{b$'F=.1jݝAYR3V(Jiޕ%FRu1jNx%]0jz[b$ytT[bI4ft4nb{!1:B!>*\ٝ7W \y'E5kB3972| jUPoόvBNX*nG x{l07rD{rrnQr#VK$:5\?fnˊy+,m)e Ĭ 4fjRVT<6r?PCTcFQUQɕm%!z}i"$A#]rA9 x1 #ZM$<+)B7>OnM)!R[߾,%Um;lS-sFR ,Ԫs~5 Cgn $0E1I K$sC5J7jCHl%80sfslCF~-IC<&sJsn t à{vA-%BPi{fT2 a(otkfIQ6#WS-bg7S'@ڐ-gUJo yM|n_JR=烢| +>2@@2U8mAY'GF hyݳ0jXRd;RvaB8,}gjS S38rvV X8 ͺڪZ >G.S`<{İI18I -?&D -o4<\yk%N$ hJ6GR$ P'~p ~48Ҙ2z!Y2`fBh%Dax4_"ֆrM)V8B8_82S,I&=.(* p{VS/=dMŽ Da$6CI[h8P*Lo{9EӜfJ46,,zLj@Ih}@t ʙh@iZQ3PoyA_턄9m<3RZbri]Y`eTR$ - G)L<@)$Koջ-~;T3)rD!JS=-UpyoMLȿâoAfB6GRYA 1 H(sy1b(Yz4GـDRN - v8sAjRtrR-b>{+eU' ?W2,N 9=|/׵,BzS}_iXӶ }^> -stream -x<Ɏ,q:R 0xLc@7AidJ0f P#"Ȭy4`P9ѹDQE?^> -SKKjQV5Ͽ˟^^§QrQڰ|x): @*wY܅/VԒp5o]4S׿-k,.eQቭr->gL\:e5m﵌./&Ttcϙ GrBwc "_@];6%JO~#"o}HlʼnKSiĴNȅ6t\?U$^pGhL*^ NbH1d;MNS(i_8vBº5|$uG06=YBqgF*Սˁ Rya F]h(pnJ"4cy\+EP㳂gp]A!PzWšC}.&]R.f&UBHg>#Y6?UZQ@-i*éсe8=PbGHmΆ{hA 2K R$՞yaVlCT -hms}etS>몙0~YUx*F>5Ħw&5.Zg*mWB RQ-Bex*coX!NAY 7P"^QsGU{E3cʛvtntfuQ%px}~RA&Qk HS-MM. fLi/샵7L)iW8--$+&֕`|7ʢԍچg*4G_~ydywFhJ~`v2vnODho_YK9kR| -\ىe7y>$Od.rc -9$gt?9dصKd`D;H똘amx{uzyuɠ>fk QHS+ؙpNm71Qڞ Y@rnHN ϴↀrMt\q -Tq$9f>ީh2: a^?x8ih>m-|:bOcZCr)z9Y.[;W¾F #_KϲRkj09*2A uOGr1:9~ߋΘ9p݄V4I"xl9mJګڞXz} . M˙7I+aXp#9H`1]CRݻsϬev O܌޼I2I&iN58dYgsw;";i,'Kby/~Q-J3`ɏ:˳ ~ چ-RT8u:Z,Vzd\!ŕ~:)H̩@bqbh FP3WljI4zjW`aJpV9+&Qo܎g|o+x`>!q͟f; zD]6mAs@#h7</0uOO3ه1\sV<70?:q.3u&G[^)c1ZH-8,j;kq\T-g -?a*Xa*Saq 413>dqObx/}#n#*4n+JE pHzd(dVk^}q|Y+ dBs6Pelʸ-W7j1(Gf -Ҵcl Z[ph@ -7* @.QxxK4Rdղ[]&E[V'8TtT~iiLj+z" 톄 -endstream -endobj -82 0 obj -<> -endobj -83 0 obj -<> /DW 0 - /FontDescriptor 86 0 R /Subtype /CIDFontType2 /Type /Font /W - [3 [352] 21 [636] 29 [454] 36 [683] 38 [698 766] 42 [775 751 421] 49 - [748 787 603 787] 54 [684 616] 57 [683] 68 [601 623 521 623 596] 74 - [622] 76 [274] 78 [587 274 973 633 607 623] 85 [427 521 394 633 591] - 92 [591]]>> -endobj -84 0 obj -<> -stream -xUn0 > -endobj -87 0 obj -<> -stream -xڛmQ   -endstream -endobj -88 0 obj -<> -stream -x|y\gYafFM T@PQTT sPCRK[پeu붧ݺ̶[YVt[E}3{}9s<8H͸zT9h|K$~1uK[KH9Wέp~ -Pw.ZT.5*};8_ o"׃*!DPs >pNUgp8^1.P/a츝 I4D+h9'=7{/4GCNz|^mGxZE`Nx[a7ܭ&x`kЊ>%xU `)lp܎wľ͐y a+Z"-p-܌=ß,@/1LRHch)R/[t"'iE"x׍cWa|8zGN -w:G+Rl,?Sm)z~L L 4s^/[rJz?QF(po[qwvnV:X-ហE/ɟQ&TO|Qy9YiޡC<)Ƀ%%&]NG\l=:*nMFC^ըU(%~ȒCQrSC ~. &/)vE~%lCP~?=X.'n*kjqG456n_7Ċ!]2K:ix+z'-/+8DAO7{4ֈR\ G,Go뻲_,Kss~<4c{f4ztMSPrӑC%5W39146;<.|ٱYp3q57ⷻQRmMH1rէv,r5;:8w8bpGZq+!=ž2Y6Kuƒ23(kr5Mo*^U+')DѕևBpWFK]AaW+aڃji `GYߠq0;g:0΍S׬<蘙]U F{FwL];:Ǝ]nqZUwuOn˷ͤe,||]ekV5M - KlFJ\NTM]TǮ:H!桎Cbc2/ХŬs[f`ÿ~\]Ny=F67^FƧ< ?ó~KIg+jؕƃ^yzp7zB]i4a`ڛ7YoN7w\=AJFP8YG.*#MwWEuE`{t_󛡂TT#`(*>&[&ƹZX\(`ySz)ed xl#>(t(]>U_]4g >(Iy(_lTJ9lW>S>S!º:IԴ:'Cxx?ك3 _í5]3Qm7>}0@E62gWUL~¾'׹F3%{T,XI VXk₩|L.S"~z~aK/Ǫpo19|(Lø"HȔ2mã+JD*UF/ ዢ -mammѱb0hoH4fh17Ϯ6: ijb 1i 8Z ^Sc{ x{3z2 i .WnNNn9;+/Jnlef`K.rmAg 5+Xҩ3>9Oٹ9]7蕄Gn33.A; -/Lr >+3? V4Cx{zӈے@{|$$Jk, +v_ZpZ~6QP(Y'anbX&$\I2bAߊΧ# EQp -"cժ!8A1A54Vʮŗް۸[rs.M\G2z$ *r sK釽.v3sk>2U롉XZab9-qiabͶ61 ^oݥbw%!+SVc钣r٣hӜDKaɐ.l5WiCC=jWp)˜:IAIEnaDMӿ> [t zcÙWII)ۿn(ќ$i7~ʏl郯q9Jcd0cM/ Wi7 CLi(zBVZ{6//i5Dl$UT9H\8IʑʥrIqqTmXL1HƆO= (-C=kHXE\-"BR&f~Ձ ,$ud]Dv |u7y/WLN}WIe7 - 6? m[!hõ^hXAK1URͺ$q .k|=58?85ƵŹ'.p.:Ci9n'4Ż\jPTכ84PNQ kLz&4̀gfp X\.N^ ݶri8[S͋>c̈́:tEu`IXF"_'S7nU4 \/c{z7=6k4 -A4%hao@RUJ%DɊ׊R͡t"]N -x[D0}z˗\(.Q'UsjV qDofQ&bl6lZTXeh$2 :̓39E4{ި^ _B?"KO&'{3K R37b.Y*i6=Qk48q._G\~/Wqcr^g;Q4܍DĽ$tp IYtƠ뒐?ZzD/'Y[)׀DVJ*ByN`lX|^F0b[{w6,vQEH&u`nէSR_||7!E;fOQE\*IoWe*UjZm44[i+צk5/bF2]%IbZ=%hO baXnXҟ|E/[teV,^Hʞ%j24^]Zug&Tվvdܳ^NܦU2c;;p%6. od;D fԚZ*QBdwֶ0 y/8]NgԮVK zByv0]R"\01#|rǻ^Dlڙ?lxKK|g#;:W^PZB[p2-5uU̺WlCek\%(˅{|4 wrי-g ˭fUɚYsfBJh%MF25'"&&rW8.-m^w 1ޘ>&ٝfw9R4XAdPߣ433Xɩ7ËA/1*$Id *P*Z -Ϛow겛oMO+/ dW+Iy`㷖$ܱ6݃ך)G2P?~|= 뉥 _\ٙP^Po231eq{٠0j17և_Q]GQj].uHkb#ޱ) eٌgT3iTs}P7JiR(X||5Vu%q9\97[IJȮVUX - F Cb陙Xz~v.ޞ/ޞ$aC>hFDKFah$č8Gqŭ]> +lA5L:iʁ@9̺zDkbF0B,c3-Dt&{Ol;$<[`/VNY>;.;.nsz5==+'?8IArrD9*7dƔp11d'՘f你zzgL 4[ - ?`e))$` ZQ\-b\9`oH\7eKWEƿSӳNPJ1W3q b(2a"{fԟnwY9s5_9|+=w ܅+rEk[#&{˯0>wC|lʼn7šgVsTYq6NYk5m{tF<쁈3R3%!2yZr[2I|jpd?` :\xiLˁˆfLH'kMg߹hݐjvg2rn{+1iZ9-<"6Վ ,kQ5BJHIGǷmVh.L-XZ-I4Z W0#%@J^OEJQjITl Fi*CUEPUX -,4h @H =jo7#M5_l=ƒ d]^&^3wykȧݮ4Po`=9k l '``UM#5]=ruzs,z-k(V!bIޤcW;[\j~$ F .H-6\{zH&q^6Yν$ -޶l69jFzoy+?&$~ ncml^;ks^1 Fcx?{tC&O443&cb|qPAeVOL9ޜ$s\k^nYYF3Ѽf^o,mM(T֠#nPtCrAy 2@-̏2ژ -e_lE8?kI6fݲ@״ g -|[fY{&?o8|):⩨))f2gwK1'o(FLSTV )RjSV\)KO&y:R*TfMvoO:`mH%Tx97]|VϨ0.KT%iyLuĩN%q@%N\VLERqfeHdV۪iղa3j4z/8z<ɉIBP& -A`8Ay.,=L'p [nU<]HO@rD > k1| zݿz76s4[-T-| )G|Xhcg~`ђؑN@z*pҷ ӡI )٩eeRĉadll:]vۃmh+mm;e&lĉ'̈́Ÿ݉xceu:]EL֚F$gY\4oWw$ Xx,*EgxFE"D*Ae1n>&?-QEɤ/G{ޠ3WH7M57>w4v3]nf$zIƎͦkW&O.lܹc|ÚkkveAGus-Z %WssVFF f0b4n6&7ɓyIt8ɔm*3՚S=t$Zwh6&w Ê:/~Zń0{je畃k VT݀W쬞8㤈jGKDeLUn{ F1":q, 87/nd8z{ s7~K^NՍ電_nwcU{Wl *ߺ)@wM=+[|c X 3+jUղ:fi|XX1::ҮfΪE0W舮\;Q{ g,ڰHJځpRˆ03\P׃4Rc{~aҞG -8Jk9s蹻g]<(" SJTUz"9{fX苎h˵5Z^')GE3Tkj{1Vb'eZ2X-#4 A!fa2t' {1Gj;&Kj?R>$ۣQo80JcG>lŪÅ̒iURԉ -TXd#aY6 .ཱF'{3 a ˘yzr` d0vn/UOg(`;ȜR9z8qgu s[/{<߉_y>W2E-آ-㨓1t2IAxAE5z eeT.Ayu`u;pwwO=ӽ&0­fby`/+%։+DYø& 4D `2m pcӄHڠVؤ!EA3f;pi?gC7+X"LB e/Fh"1sEOlڜ'f(zхoTt1$Kv(Dm`<ǿ= za*4KI -PO '&T.K dҳw = #!4$fndmx;$#\ᮎ 5P.vG - b9M; w -۠_p9ca3' c -? CkV_j+'k!B"h6: AHk?O@) FȣP@wB^<Ͽ9]vעoz[? Q)oE -V8vFr~o=1@ OE`|]גHucg u2t F9/2I_;*{4\o/j$=>/G8"qth]wY o b:hށ:\V|܃6goFQdzʌ/@3Id@i{P^KBgaz裆 =^w F/ g^fm2`_zEޕ=P. -ԗO"2PfѶQf8AF -5{9-1W yhO?nSW-ѐ,(5b;V|}%2-s?q<ۏ 5J% $,̠‡2xcq ۰61!rHV}{Wc"ez`2T>b+J\;/A9ˎ<], +g+gye1QK!sಐ_3dqoiIIM<>ij,_ퟶ')#^IJ~ŇrrF/ GmphLx/?v%7^_f?v1=mha>)q3uqTw"<mވ풫:q#\޿ R'̆}QWuNQ6xX/rd#{G$xBGLLFȂpPV;C>%8 Aѿ0ve9'Ifyy.Ƴ\)qB8v"/'Pbff =cڷY~C*PbnĽZr/^"GC -`xe4ja>d:k!ЩZB]xGP"(u6FvEl*rtEm@+^1H =P>Pj`>0Z'v> knr11 QHG P"u#g(ja 48 xA8]9x(+`,$G5pAοuIn\ŏ z7_F~3p/'h}*\k;uY󻱞y%HW!$Ua`x3W'?E :r,q>\s>-!x?(?7Aa`\ ©S(U1}% {?"@6σR:l qx] .OB@0}!'>+2~EN+?>7JS,3 bO\kL—X/?WgdYu^8G{ !t)+?_-cJG\#ςk],Q}|c)/|)o8듈/}g=Sdp!_Aw?cW֏ ½FH !cXg :yF&:խ_1yMY>$2* įƋ[-5 -!#V#!^ĵZbD$"J5ψOOoډ1 !N p -dpp,>}o@8(yPP(&+[0/=b)\ BCGz,c"r+ؾD\qN(g`L~Ϧvrl'?4 Źa+BV%k*~:^Gʧ -4^%yi|FJq -7M}Ki^`)[|rJnN -~$ƤB%JT<J;Eޯw{[ػSM6] $A - 6hi<;AD*kHkTSԅ@<`HB0`:%"nD`6@AD] ` o..........+ \X(aLwDq?# PMT+tA':0DZhEpUnG 1}PAZzJg1>I|]jc6vo}~gN4pUo[Uo}!c!nwj{.:?ff{OaFeqOcΛT8`88=q,эxfmcDZ|ǵ+;U8oVmh-)M۫r;6W86U8|GoXueuķnDINrӰƦM"s%OqH9bNq I5x'%$aN!fGFE#lzŪ7M:>LhuqBuFzEs"6 "X >L0\y*GU&+o!H'3=]*TUrm=Vj?"1L\φە?ˉW]d}zObB5ޟ.g5,]d7>"ӛ2ٲRɮtzY\Ŀٿ;~s-!v<Ta,,pRϒg >pIԁw. P3 -endstream -endobj -89 0 obj -11582 -endobj -90 0 obj -5183 -endobj -91 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [137 183.65005 476.84229 192.65005] /Subtype /Link /Type /Annot>> -endobj -92 0 obj -<> -stream -x]K,mW:@RΌ=s|,&9~HH{.`b$O8uPnG̋> YG /5,_Ɏ2/GqHHiK*k'#gWoΔL-2׶S=>ϩ8X6bm[-^_RCmG rb d:gߐ*s z9a/3[^%F&b3 )<; - Ϻć}<5/n +?^R{7Sxůe4z{2ߙlXC<̼LaR}j( Zf\uW`H%g0U G 婒rIJB[5%=#kvo}j&LIⰈq-s|Fs!v*+?:rH2}vi^g|I&̤h+k sC+jޝk7bs-{C!5κwZ<?w9{l |go:Ȍf6Q sNXWbYH6Qe'\WYwr>U-u2 yn󇎍kakp0+7m5,3-{ߙ^R{ HYEF;s/3[oS8?=W&;xf1Ek N0+Gmq&~h)_զ$ȥz3wfÏ4{01:^s}op.+ Z,YYisW^6d܍Z2k Ь* Ơ˓8{ٺUf^ 6}Zyˮ:[-j`zO;O8+on;rlKNɞ/L_ v;l -*#Gkws2C -1u*hi?B -N欞7T; ) nFh;EY+A[e}(`oh^\DKQ0t0F#/qxkgATx5Y}-WLLW,LA5UG'to`nDhcbkYazk6a.rW>]MMWKOtaP3X/yr~d0!L^٠9AlG.qk.s1`%Y[LW纾#R]UOc?+gr]Y)Y4ݣ qUդ),ML=Y Wd!ݑѣwdQUGu&1_&9~s6+J;o[j-wzTZz3s6xӣ{X!ANXR9gẉ;{#PB! \3sxk #bw;+yay=zeՎG xwTk,pSִޠ21@t ɯK|>`.3quDxZ䴧p:;qlsLDOldu0帰F8n;pp-F'3ܪhvw>ٰB#ƤL"`Ԇ:գ } `-BŔ_Ҋ5GZ4M$ զ{LUTV켚|ՠ21uD2g!:4񚸽3ɓBl*)q@BX61f XԲJydJ,;chygʄM6^eT9@ sS)s}Zur.5JIVnpW8'pO;-!vO;A_x+Is'? -_\ -yS"2OXCI,zVXhw_\ -+8]>ሎww(#:ٺWk;c? J9#?Js3x7aև,_kS%tԨ-ߊ)wq}Ξ0;Ak6Ǘ** -?.Oi6Z|1>u &y, QēWㆿ'?΀=(.&1tH&e@fMmdΚ{}v`e; Fi(RD`j9r<~_T.%*$Jzht(șTR*0B&>Q R56x? Qi\49VaQI|1Jz(xf'Vm&{35BU2{j;osW}Ƴ -2T\"_AC>q;H 8z}}b#0SqK+n>k)Jc$n -DYj[ 0Bri~!CbRBO -x +ž8h[ϼbOr/ -`[@;ClX&b큤;Ht(U6i\y"ʪT[Ily.~MG[a%RLҐd -i8?D v:]+Xsд9bA d8>1P`M[?-IZ+zhJe٢vPZ>`64ڎ|bK6LXm - OZ3c`Fq:ԄجH<4gn8gv[p}b"-āBͺ~1 1ы ylzcñ8ġXNWq ]`. N.Ҧe.{es.[ewvlCl^W7WZvwu8{gvÁݫ jgh᰿3|{TS;PvΐvL"q;mHZAqq "i@qqf C{'KGi@qǦp~\bŇkP;Xh (⢅A=(>\ Ň P\b;}l-q5.eM9PXf\|%mp[~.Kˡ<ώ.oJ/簥Z2vZl-^Bv) $!\[GG8I^MzIN@P߿s@ˬ2Y[Շx$K;7^.܉{flBrd b$kxk~ďŖ][9۔O9wOJY1?č'RF̴ -j+%L g{gcz h>p+I/m/i}0R:Y)qhH?6OCx. ::xʖ;{X_-[7י%&j_'wN%ADJώq(bϰ_rPKL|*~ - qvmb_RVQYŠ%BZFg>-X4$1(p8ly-^х6to`: ~T鐃nft7-Fa Ѧ00d@Å',J xk/XP SشƛZrpQZ]8MyV{3nJ -$1)z B_>^nP£[q{Z1^0VNj FU 7 I-\[P)2T9B&bqQpL #=!ǻTLC((}gX 5򇔮owgk&7CpD&ƼD3c3yӜ8 #H8F9sH^oqc+? 4㫱sH_DE|ZK%i=4'ejhs|&-U@9FY8R>q6p:`nC$H()(4#ZIҭ P-JI0ñf44=ct BGI/>'c.xW0L:jڬp֜ -!U7N\)T08? R5qβ [5֗"u3a\~j% _'cYƆT׏Cߓ cR -vSo˟!S4?a|Џ"CVDBJC ;}7Učl\YPt9ad01+V]4h@(0t=DGAAy>lxDž -a1tAM_DbݢXZw&IX~p -I<~tTr eb 48'WʟB&e+lbRb7=c`YJ(9B@DaJ1dI ">Ks;k!F0yMdWY^p }۠fF&#B6L]9\(Rl Ẏ+j X-#߬LH)FXõ&ϸਁ䄄TM2|48)K2WIk/} H*ݎ \Mem g0PX,߁6Kj#0Ko5J5M+g\qZ+VD:_0+@"L>4*VuTd8' V9\DL*UB*M3=0$6g2 DRxj% 嗊O,25Q۪:\ rՊ?bL7i!) N7+i z<֮7BxSo%P G-0LH"Ʃo}}$`y 1lʞ}f8a R i [د2"*9ňAڎnNXpW1ZJͰ4B*<ܑ|8 ]YW6(Yk_EnaB?3 -endstream -endobj -93 0 obj -7548 -endobj -94 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [145 624.90002 375.39648 633.90002] /Subtype /Link /Type /Annot>> -endobj -95 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [145 362.30017 333.26611 371.30017] /Subtype /Link /Type /Annot>> -endobj -96 0 obj -<> -stream -x[Io+ suj_Cy>@4 {XՋd; ],,vkc'Qͷu닙+!Z -ay!LB$x_3x -og8?2%d<c?|e~3Ws-n|I5nA.m<M*LYkbq.*X~_6E KЪX lc\mOB,jyUTI{fхǨ렿lG SWm]ilMQo43Qsk1MQ~{דrS.hi{emC1D3K>Űx,X.}mu@]PBϻU\Ԯc^6ac3Y3y2_D {Ltﴴp^,fܶtsms+v7VqIgZuLٜk>Ccyy 3Z 1 ٧)0>O}9bl/]ɋ'$0f$nE's ]p,l}qHcYdН9]1LxOX>@LF%yVi>S|K+Gl,G/N ̹L gIcnf&.[NBR -yf&ta_c?kBMcïT\ݭqB.e ycV}K[{˘'fkbJiA1/&3A|0xnTNEcxS3Z o<?*f$䤥!ڳc~z:luk(RPb=<)3f.1BIcn{눸P{3APSZ[sWcg3LAbYBC%)Y_j{vkW*EfZVzutJHVݼ1" g7C<\w[yZKVVlJXֿ<5![55TRaKIVJVp11H{ -[ bb/[cxAv墘r4co^AB6PmM},[+;q6lc*m>RNYk:kI5Jز띶ˆzx禮-9,JJ!t|N4Uwvk9aCF?uJEH蝌~rI̪AISESFjTdjdr;)t/_;ZViF*]d#:l}tD>:?=Oj;6xxѽMyM!/qC]odXd_7koufv>@ F>m.%.hCaaeZA;j.ҩ.Z3>CsOY-+$͸"k>xak=&硝.7,CKFwluM^5r|{7/ ;"ahM/(;loec.A&sǂ4=-JvVKK\x7wQ 1dJڥA-f.nߊKqL\*WRlEX 6oW>Dr>=4e|̬/,۹֋ -rzc#Ґ= w-da/LH41ϫ9x wA\ߘRco٢ksw/ ^-r4}q8ћ`˞=Y@%:^7svkXsb`Xfk⤐BΦ~<8.YqYqߑZ {K` -mrKP}JʣTǧ7{t |(4SGf(CًiGN%Vq:6,~^*)Z{ݹ& dV䗃I{5cO zo?8;3FH -S"9 ?5/\ V6fN%࿘ඎNSx~QJj3(Nm^ NY#'⃈[zN%(t;y`PtXҋ%"PeXvz'- IhB%[Sڴp)F+ؑކ鶭I:83y8=ʄ&'[tMt Px&e뒦 F4$09NbjSf@Fpp.X$;XmPQϥ@&܊-Ru#wq"D6x悄I!C1j&탆mtC٭P{JX(?5`B[)yn7R~ظqD4<F*/t+nsRFޢq`ߟpP<1G{qhƎ-n[Kr0vXpXC޸_r2n{oj`iE1. -k^&ɛg-{?YvSOȎ3 -endstream -endobj -97 0 obj -3891 -endobj -98 0 obj -<> -stream -x\I$ȳhoOafX$eHLӥ(-/2gתW/k٬_Jk4kNH~h_7OӬiJټ~y~Rڙ~\K+AE.-5'FIT! -/U~{ hx_NBׅHk +߹d/B84v^7(6cqiXQ7+ -4S\MTy{| ';XGPEmk}ƓbG!aKX?qZySxe >~q]y(ore'j&ĝ|HvzcL{ -jŭfᬫx cP*lD~ -"qAaNd5c߯)PE>qgwHe`v=(E"v ƘM4OiTsm=xè[1T=3i$gL2=Ty. }%y"SudaezEIV"6*j+~(A*Q1ln$-pI"REf\u\ĐdovT+ϋv(Zvn f& l<`oUaj5^Gpy1)m!r)iኹub#C]Tq -u^9j&HoG+ -%Ϯ:|1O)t&͍4yz0# Gٖ wHjo MfV\8= YםK?t6/pv5OPhϒnQ&ob4E5%Cw]wX{w͢EQu-*&sv"*"xD:k̹LZه1::{1RmT5G7&quC `vS)ƨi?LcKR^dZXxɣ8۹6WR~Å5 ~ý8_ 6w"GfϵLWNlNZ}# -۲-Npx=9 V\W!3(Z.wd$pT30k-opnl}(Wwc|bi.Ve\Ouaӻo:'qt<{NSu߭ {Od|+Jh,NG@ycJnD]}ٶ:r=tѶg -1pPFZjv#P -xx=to-[O'R/v?.ZX<(Pz<&w)3.qKDa:/JL-wRzϩ- y?Ͽg:N Bᐅw>nrS|M/} rBYogz|}!*ÞgǏAwiB{L&w]}lw5={޳uo -Y[=v}=}Pk.B}{u%WvEmo֟=콠3~%ֺ͞@mCyghsBm\<|N/!&s†-8!ْџiDݿbBJNn  Wxw^'| FmZ[ i)ͽFY|EsVR%.hz83dLqAE,;F6m -s -#dZm σsQasp`9e+o:BFi $ -BJPb?&tpjg1š '|4s^n$YPT0& 2MMC Nf1jH*hm -53k1h"Hӓ`Q8Iu@aK!$[Q6vl(z@W|$ bQxfSYS/^Όh*W[ᗸ+)3BwBˀ,"gd$aKo*jk_S ?~B,zo uTIq"Zʸ#ezm28i2JYP9ֱ\bq8| lA$uI҂#8lҴZWcR _)_eQ7 U!]v)>m13GףD]0đ -Rp7mh6TԢά -7`8=@]АɄ!:kd4FC+6Rk"YԄW(Р7K :!(ho_k)|k7Jϑ0, -YXLYj -[ dI"젌2guaJBv|F -nӁֵ{֖UH&# J܂.%m+Qcȣ6Qʓ%)Ec !rX)xs L#!|Ibtu?-"Ђ r{ ɦİˑ F&62UD ڶh[u2TQg~H[(bH'FK7HM;R!n ^&'$ԏqSVmĀSM(cs.)I:HG! Z@[M2ݴώXyomnH;%aRHJl+&Lmמ[iâ !4Rdư/CCF L,@!WA.t倅@ I~\ ( -/ aٹ)w|R%G&콶*>.¾/GfCH+zH-O_r\v%Ƃ| ܞ;?Y\{׵0s0e-L[ZFēN7Ӻ2V ed8:Fp=2R]uY.NE+HPoyTu;4o'a[QI('lˬBuY[^. թP> -stream -xڵ\YsǑ~_я u#M&j( 2e3=df*';3+ʺz(G}ƫ۱М b^Y;~|;!#D0`j1~SxȪ"@xDDScԙ'g#3E" t6tq6OJf5Q&Lt13f%f**3~.=5jo69Q5>]p~2x;= ,X9`⨭x -,ލ7s|} i69HQ(FiRuXSIVx5;T{d.̺qp/V]KǠ ĥvA@Vsai#d pL޸ĻlxН.І]bkH{9TeB"*1K!R sҎ`mARmСX/X ~b3TXQ4RK#Qv=˞)b(Ffu5̅hZfAqom'$ḷ ̶CyS ?˵!`5<HU6vmWD!"kvS+u~)UIA:>!Lێ ,AYJߙuB/615%'Ȉ7tl"*@P.|,M*paI0%_Eȹހ(D4dnfUJP=9t@XUDѨٳ -@إBX!4dj܎ޑ7ȶxEBT_֐DF'S9Y >{I7o~k1L^]Jp(+ׇ9o壝EQ:Re:҄^Q{|PI-`&GdvLaߥLWFSǩ]Easժn$!7 /K6u:a0-L)Ա`Q`qRlX M(0ђD@TKV7ϓDC/Q9uLue}2W$k@o|$x5&Sǥ0?j!&dZ>lׄ(lO TJk q;y:z O ~ - G3{[JqH16ҊV!XΌ~+ũ'8RF1QaxDDȇ9bإ&_}G_TYN=%h a%$G*҂a¥~\ԧ|yer@i'0 Bm?j*6?-MA=sJ翻ˣM\"+~D\WYN=>(kdX(fCG|~wzvIx7VmJIQX?'+ڨhu,GsF;;4[PZ+rSOWF)XS"ټBܫͷtz&MsNX ?ͧwB4a9֞bSg-|^Hctu}~s/=WSOsq'hf'NsS;N|Q7@,%<УR{Ni F&;tw:<c;Oc]hQs{imc&m1'qrv;ŤK }G2|\+:jȫ<1DRfJW_WM5̺Zg%N)?yZdSG٘6ԥ!aSsj>4@ڵP|u|,g5)iLH^Vz|AФz(I>9Q<_TQr"̴#MP2Ѻ@'.K<zɩ|ӿ>%IoԳvu7##1iRik+#  -?[#cٝ`GhN=N,9k*$fŸ o?~5oZ- -g%o#Ɛ%xP:E('z󥔩R̻k՚z*c%t -H旲=}͞(㛻_V}7 ;yvws*>n1hoӨ7VZq 4RBgcy}S N=02':9>b]Xϯ[X娲GqBĺCVK8G?-bUV2mW#V69%bo=bt"6^žᾀ,f~ު]^gWM.7R`R]FY0]eJ[/7lt']Qan%#^qSN=qMhA MYםtџz|SAu -O_PXL=NtM2m)q¤1zNM&ZGtP Fp)v=G0*:EA>0.W|f;~C𤎕~6Sχo[x+2]8;ۚ޼L#'7$qka=KLipb퐾MT-krU~iLž_ OBxWnM)Lq}++NV6+mCJ6AJƥr~if,ʱ"g%P  'Ҿ<hcC]hg碗=iZ1˫%DHHA: tՉ]bj 47w9ʼnl /WN Gm3Hs>`fWNkBOgZ0םDr>?޴%)R^LyZߒ@ڲL8,L1?Y! brf/ξgYtr۳ cjaߗM;j~d"ܵ8ME5}YnW^P`Y?HxRe);tdo;˽{yAТM<eՈVǯD -w3K8*;P3NrYq,b7S욻XhŮ+aEPЫ(wP6a32eÓ2SX| ))M.m|R1‹Zu鬆ktr2XR5+oɰE=5gvFe]"<2)FWG{LbvuYl"E{v-2@vhuSYa"}zpnӅ|~H3yм ٌ;ܥטbY%ʭ !SJwl`~Yd9D\.bj{PnFes1Ni:>ho%Z@AGy$YȄff&ʛK jڧEE&g%Bz O~邭5||^2GR8煲--i#9F2SA#x|2³n{@G"ɠ#ˌ @7IyrO@:/I!̺̬%_33׊H|57%?j<Fg -t8Vp|݉n]XԁQ1%i ă*C-HHZpj!nWվ;b]Zl^Cw"`HW2lH}YDL\FG軎d\xǡH{2. *XEx#It45*cNGb-h At!hۇxmvI#FF:q -n+gN5= -WL+d txslI @և2C7FA;JM-yQ&&\>?Wd= %MMK5#(M\ϼGQllJxp5j>{ {TYbe!HI˘L!NHNQޣD91 -2pXۼ#$ -(UYP4tmw6?@Gj_BՖצ0~ ޒ5 ҵYֆ`ᫌ -[PHЬT\rj*C̛nȓ![v% Q:, W\λ{1r^zX0t=mLѨKcM2l -A\ dUQTBV:S%9PvIh3 M -IX6i&,dRpNSʵe fb/+Izjgo5yO'Ϻu<ױ{%eI䗥 +x T 2ײW֗Z .Hn9uK,t^ͮf v!(I(e/w~1X#q -Akܶ{ tO|W94*/m]e Ѧ.>fZв/Vޔ -endstream -endobj -101 0 obj -<> /FirstChar 32 - /FontDescriptor 102 0 R /LastChar 128 /Subtype /Type1 /ToUnicode - 103 0 R /Type /Font /Widths - [157 0 0 0 0 0 0 0 253 253 0 0 194 279 194 281 385 385 385 385 385 385 - 385 385 385 385 194 0 0 596 0 0 0 435 416 373 445 354 345 436 463 199 - 265 404 344 599 465 446 399 446 409 361 354 457 421 654 392 0 0 0 0 0 - 0 0 0 364 399 302 399 363 228 399 405 184 0 354 191 620 405 383 399 0 - 248 289 255 398 347 566 340 346 0 0 0 0 0 0 280]>> -endobj -102 0 obj -<> -endobj -103 0 obj -<> -stream -xUQn0 +|lC ,H]V8n  E*! - tb;95vdlqo.r`R4v8pll7s+<w-7ߢlDϋs8 )-v4EW="}A$[g zm{)2%Lҙ/Yj2L)(%x, [_6GJIIDdhM>W򡊔%25<<Jh[-׏~^0dQ2=YM,^M.>:ˇ -endstream -endobj -104 0 obj -278 -endobj -105 0 obj -<> -stream -x}XyXWªX&t`W Ѹ; 4"5Ȏ(;QU(."H7j&q2c^bN3yg{uv{Y?R!#b]_-=4(FQa4W" XH2وQc'\è}2AB|wM^.#d2wYOBE#fS;\[ȗ.rNᢈR)^+xrPY||$W[Hwl ?w4j@ԏ/V xڒEϥڃ:N'St%}K1LsbYT~&Rh;sI#"r3sol-/dP,D ZDؽ ->A$πs˰vz -YZVcEv699wnΘɰdLdH|2 -}qs狤t7 -}|6x '{QXR}V>Wt Tj)Ƚ1!6;0;شh5ۺDDk>,[҈"]ih1}Gp S,iES6d={ǃ̳rΈHq - _}Iݑ:x|FD$Vkf圐v8 -L0Tel=EKʚ;nXMݧU_%{D[һ·gڭشuO9(k)R:wNUvٶ("*==N)1lYQML;/o<'M`؊rpɵ+ȞI߽-Һ+﫯T]_W}B0Qy4k(JLL/,Xtߝ++ؔ8ָ`yi:]ŴB9U} ϼfM o/=jAN m gn L]nF\tWzيn?[}ZpczVʐnl⯞X(yVxI.\k#*̠NeJ-yk7zT j RL\7i[Zו4T>{?t&#|7H<+}`wʔƆo.?l[@jco*J+L:t,35SӎIMvxl?$%Sbq+ۄl`}lu6ճșC|:zA!,V>>]7Tڮ jn^,?-?=Wsh:s'ZZ)%~c+mNЄU 32 V2Y%8!W> íivKіpD=A+kԀfo額*L+H4gWf;m=t&\ɭ˭KhЄ(1ڨdAowذm-s؆mb!Sa̐o)gUL@CF'S6t_!Pwav޹o -GgP |ۑ9WİVped5XP?c &d#HNɾLDmee2يaA()+%dm{K&&_bLd%D)QE\  M.|\-\>F>V)OM -R+)ՊR䕓ʽ@ae2GYPRV9,S\'8"UiLtJ 5d&Ó3X#<qhg9h%Zh֎0K}(ˆ0^`8;\Ņ"& ZiwV4Ml[3 rx>dŌ8Ff?ex;NdЏj/jX -@HĄ\9ma&h9Lg `&&~M@<&Xi֭p6p`y=XUDUc10b~%@2(V=CΠ/rS.iQ -t3|jO- *vIB~-ϣ`6rI㠪~pTIT5Y錪)n<5y]^tLxUd@sJR5evG)ϒ{o2񅍇_`)Jl(?g/:ʭ,kw A)9;%'Wmebj 0KjA[aT[cm3T̫VcOvQapsaJg0h׻{O'&`ؕF^?/78Yjfzozcc r AiAĦ3^kzK_ ?\l`b2sdU-a'c#[9!1F ܭ ($,4ZYj/y\ #*a4QuH UGtB9 o1u(%2)Js QC}G/5kJj|\_uf,NI̫ &Z]]Zyɸɻd60GXȹ֣Kj -U[a&T<虹p6b,G'Qq?F"k);d,jx/ϝ`|<.IlƬ,1{޶;(ڼt&- )ݭѷ6C>I=zcp=9yĚ]BYfƪ͡lP뢬 - ݡ/C\ kK?e% ;שoI*d~9ӄz>Pp>aMx㋤]dv,/[txnĶcr>kj??]d-j9mKI:S} ÍZ-Wbf՛1/L+M޺Xm2M:VurPh;;L -nE6_`b}oJ7ةW{l_Wx@îRK.l9Ly(8됍9 pSDE)R -fj[CBCSnM7Wtَ6àY*%7'5_h8utឺ5iw5B;aI<|bEݪɮnK$ͥVX݅qNVb -')$h;?M&+,Y Q~_o& ҢŘ 7y$ FhsHoww;:añ.϶- 1W>r.M5F|mU'Z޽%SgOVV<(qR4m^603ôjK~7_=k]>EGVP:Fd>6.e`ZQS@pḃtW賡Xˈ\x(C0dI$F r+rOTNs 9EA2Р#QccGe&""bo0Vug7l1k@ߎ>zc/g )q ޚ#ݺ fy:wNjSp'QM!]x\8>%m4}Nj˩het=^as1U0U#op`ᨴX 1vh/rÍ sH5lա5(3l2}1|WtBdfz\[[[$ePl:2vۥΥ{΃!daiEQpnך+K#)EB7wB^/4lղg$$#Wڂ66m j5 -B0l%*!PQ yl?0#&w- x]tbaO+1scvv֬PR"qa=i9d )5#\fړTJE5{˗aC.vctpj]yZib؊ь4vCBmg9Diyi%ai?Ld,߶ZT i\`V=֧ -endstream -endobj -106 0 obj -5572 -endobj -107 0 obj -6329 -endobj -108 0 obj -<> -stream -xܛA`Tj><+TRÂ:Hz/\5B7_&:V6<K~:Ё0C? L uo=?>2σS`@<6@é-{s,i9dw_ ~=p-w#\l WAWţF? -VW]'0k6Oh ŽpMxJk9N$-i{$\}lKz* pP[x̓ubVYBi%XcVp!MMi~`K~E;V1( c:kYIIu ^F4,ͿJ=司 a`%- -*=U"߶@Hχ4Zj`zYn5 E+z0Ld2;'t~\(5X0T^㳉!!M ֡# C})IneIYpo&oBVN ֲk౻6HӮ֪AQ;u D*hww -j~qaSP"Tx+B#H^Om!wRؘU^& B8!{/wq2ۆ>R~gg -n11˘(8C #+ʻ1 S7"PjKŜ{kfs鈌][Ԙ`3|nzC AXuư*eJ1Pz)bzC~vh'4@PhBYP;A_c(S(PEc`m>;{soGR_}EAA59p+H"P D0!-Zo׹nuD} |#Ou=sLn!YvuK6e t cj2S<-ZҢ)(;'+9(B2qy<+=PZBdSE),+,>MP"%!ʁa.69~t{=x 8k7`3 ~k>]` ; U} YG;~{l/HgHfs‚ak -;%G}L~YH lj@LrI1y\AڣLBM!d7D!g(aI1@mߨϵ@`8`dg iaOwsUЄYKxa8'En-αjM}L%UɾֵKգ֥nW镺^-Wjy$RW镺^-Wjy,RwW镺/ZNԵup2n3N)-+aEյԊ؏t8$U kB܇zdnےm@ Bϡ:WpYjd'R#e]V%!;ڪ5jBO>˴@p5U\ w;}u0c٭*agPeMae1HwZMsîuU%n?+] l V}=hʱfHAn֕p e B}MB!5q`oGW.|ow Lk`JPyVOգH6cLt?Γ5:!fr%TNxfRGfkq7qGXX1x<>@i-_ hW&q S=ף;烹?buab?]{9Cu2;Pfg8+yz9F<`r(/}mTUKp]=+}j/ -{ƯՐeeE2=h$vy-[uL û].9USSd}:~w4)42n[ Htm6a}.ʂ* *Y3ۊeT.!Dzz&O  OZV\wiKF -hhk=83b{7֭.\^7GAqהZv\-hUH琨YwkhA1YCZ:%- D8j1 C#,$Iu|v1i:aSպ%#"7c]9[ TT]`F0cq ]fI}1 k-Ucl}vPn|Yl*D}0}ށa0l}ÖE{ Pԫp/|Aϳ8 (rNp:ncK p,gcQY#C^f)~p7ܺՔuLb&] -䞍7c]9g9BGh@ë֘S -;:Btj`ѭ4O-=p+Y! KA#&JZYDVD%A}" ІYxɥ yMc4TTw WLN2xWbVe04xE!p?VBg~̚7M}DB>B+:C{"mM%.]'Ȃw ˈ@:*CQZ^mY_4Bl=!C =Y !mq]Y/|P0M\,鳃D$p;$?ʀ!8@A;u30M~K-P3 -Cml$ 5$_! U+֦e.P #m`e 6* {`FpbxgZ<ϪJ|ljt6 %aJ1KbZ.(!I\EQ!+^ #3Qf - `,AHҭem#}Ya]gy>tL8["1N,jV[  -a6P~aQ ALh[դE-* Hp=QΑV@adeTbP7XҥAQ I5mDxBN@'Gc~(>vLqu}eN_SD0=2t>Qw| I\R-Ov}?Ģ5/-:UӺpct<a\ʢ~qXDwūdNٯ}l\%3DݮdzUb3LKaYLE!rOU ~g<72C&M}$(Zګڥ#0 -endstream -endobj -109 0 obj -5236 -endobj -110 0 obj -<> -stream -x=ˎ$9nw}EȰRj m cè20{7I(2#LNE -E¿6/(-"FY!sM<_TS9m fEJcGMJct>ݹsI|B$ {J*T~WDsj,ӢӲw 7(kR۞X~w~KU p }{oό;Mxc9gS?]![pen'X)τrԥAEp\c=UQy E[[1ʰ\Rs_4 Kgl{ZX;چ emQEä%[DEz%5[^Y5U+sosE*̜)1f!To>2,.:6Gaڄ,ҮSJgW#se|4)Kӷвmr٥@8J` קX3^XbJd$͸'{Dz"n?5 +N7N_:*#Je>^@qꛬhlW&o\ Ġ7ar rn:Ck= m7kG$P#0S4QM 5Cj៾#}F]w*>{boEtg1ԉWm|o0|4=3M>t#XptdԖj`Wm'sS-uv]6"YmmbZ1zI91?xV(.=AVhoVĉGAß>"2a#OF~70#jbVh-84ײk Ҽ1ͯ}im )` )ںRW[?6cN|SjБ[q%AE,Bʔ-`mx:G<w-'kq.hJ]$J&P1oK -V&-@JԐγ<XKhuie`5ʲ3O.Yc'Irao-C l!Ni\0aL wܧLҐ79.cr:&nN)oɐPLk s^G+"sv(0!G Fї짮"~7?$].e.Bg2!.ʽF'kHbNCymܭ -S>~nŞӖk\d]W yC9$+? 1ybwgGus-4j ?DQroe4{b~~fEڢ咔U}2jz -칔Fß#zxkuRtOxU n7He=Adfp{R?\?P!-Obi:@ة'hmqߖfwgu`2A/=DaaOU *t07^mw'1rc8Ygaa;<]K'EHqZ?yx W~/;Oj6$fFM1A#Vhð$iڡ?}TPlj_3mw/O6䀕,x͛ yc#kEVPm@ -)˯ h4 ߧ0i;+u6plQ LG$2 Nh+rD!mq[ Z**IR7Q~-b}[hgD >+D7ʮkd'\ʗe˨pgL6FThX!UJjwjX5FZ8jCmLYwB![2!>DFuX7L@.0'FBGK7eµ$#:Vě&(Hpـ,b@}#Yksg ͒N%.QUHt -Kh*NQ0 ,Ky@=փs7;nz΅;w[)h(`{k=B*h [ȹfќ;#wT9(r>=S 8FQY]eUmU!U!MUUΩN&$Y`md8*z }]qbpAwAeQS]PjEQ́ XOVHC6~y` rӮe͹e/$Rf`V1Zq`&[*_7v{Ewמ˳ - u11]3.Ak1|K('򸁂zO.;csoGmR-/F[;<5rzջ,h,r9uۥGx*=h'}_n€ڨA~5I?Pp~ך ~7h} `Xv`8 Fz4U=8|~os+|>q -r -p 7ĸ7]L n0l/)A#aA6,kI{(*@6' M#cAU1Wl&n1B8j -W# m LOM $pY_0 -qgPP5@vb5y Pp~ 1[iAEt'VS;}1Bnikl -c>aʗŬ7Hq;Cn`܆ V׭آLjE\܄<^P.BX{CBRa\*V70w+$̍´5L QvԈCi&Q q= ƥ‡]].@ w|)s\uB pj"LKe`E>eE$-D6|U5 \'}tNؽr4%D'] 8/IōP/n& 8}(r|1K|1K|'$3;ϋ~OO&g^7?.Ms'ͷ@kIŰN~}6nmv hůj>w BPi98:piqvkT خ[|ZO0Uw -;ǘ̀Îi_i{`:R32XDo3 =-{^g06\]=]n!Fwq-Y sn.ܵ,C|]8׽B/9M/<. -JnSʻ -q]%ER[}<3sл.6 Ew]Ԍ} sm[c$MKˡ3l3j?"x{%@I$ma{=-U+eS${*,j,wUuԈ.;'\߉{/zqLƵ]q=: CK-Fˁ[7a(cA5-uT:]&g+֛4IvIΉkfӷ5:xn::0y˥jv4v~˵ - ڽk~Oυ`)Kz¦,΢ )K3zeVΖ.Ûra IY JMnQ+ta>nG0ܸ`~E&FvHwޓ_xݟ)ҵ#uCbe~3DPY!(:^NGgzl^FEԶٖrU=`_#6LYIrMY?4Aio4tq5BK.-kp!/- 0@i\\;TYηᝬzBnbE%_^Km 82>'w+.rq%DPY~ĥЎMpWolk 7xvOhy]2@j;^Mt`p.P -(HFLZѝa2uwCoVh 7`{ցB$~B6ghGtb6  -p"i䦫."7$"O> -stream -x}];E>$LfBRٚ=Ӟ ?hRi~I2x%yq u3``0ɬw_LbzzOZLǎ"U~k-~{~e:ׄe/RM_^/8e}7ˢvQ~/rY -?O2=n -~=%L`r*_+ieR8'܇o,f{ϣ<;~x}?uuX`j8mj3\B @3e 3 h,ZF9ZԊ"gko Y@7u~FQNgr17pߌvĬISQ7W6cɜ |׶˘{ddbMx:3%he٧>o_;WZ(KmkձLۿ?Z,]j ,˼ׇBoJL?~#%>[poӿ3|ZM?h˴N_A?!no9x$cRI]PDNP/RРY0s8mz%TSKb`/u7+x1w5u_/FsVB勻ԧX>Nb`^uRq=iduࣱ45tDs12$Zu"*rmexLм5Y߹"hrk f gpԐ}V A7`j;{ 3:5&v﩮NnK M񢄩,6I JL]%fpCq@ X[.)C>&I쳆sR>J3tʠab40~d5B6Ua×ΕL0zB*6[){ <-.U.LC>Sbu&[(VpAL9$ kX!V"&} EQt]F1E@߻a>ˏm޷H]:XyW([`%R6,c`\cvg1\·!96)"X60'ks_ R(Zb ~vp("uV۬!q-# 8 )c!{|c4HzυJx- ؈JC*/ǦɖFL^M–M^N/=&dBgf%eYrfᓟf^4™.eXanYdbinpvY<1vcS;=`Θc3f;Ȓ3 nJ$|T+|YY 2Lcm׌M`ɘ[^DCnDݺpfa7ڽ@4M5SWOIOe|<7z9,R^P~[z[0bg F9,F9L0 c9[7ս n{:,iuX03D<+tgC8QБȘG#5Sː33mr Ls EaX,b o+(Z-C,aG OQH-eG`rvA\Ҏ< 7X֎zf'^XOZA)gwJό |@8 |@9A: ):{Gk ;}X^fPD,r[#W{Z`X}Aa:ՙ:+>L%\u,uBG-e{\z;|2kӬEG,a{XmeZvlݵ: kT JJ-@_GPgCWe焍Z8% =XnfE\&p'23h O`FX֍l i@Ս'#غQcMndp׏$HDXYF WXallPz;,;,wX2F[pHWwGWD呗Ⱥ"v$׍Wxf$r3c#;q.ۉT8c_?7qGD&9c1;vHLю#p,#b0e"0c$anxɈ}Z, ^ƃ"*:UG沂7:Orug1\Glbؚ cc%|mY.bS Lj d5qGmȢp#c XGmXC8r`q$a>n`$6aBn(ۥNW Qb$hq.8b3eɈf݈s!&$bovo kDG&׏}}VX۠# -kw'uY -c7>'F0d#JW8XI*Fp۱dSuZa -gKV"FjWJˢNjgJVXY -xٹ^N4YgF"rxfljyu42Nj6G 0cEd{T?\\ϟ0dVDV8DV8V3 c?KF"T<,yX2R3<4?ӸR~Hnĵsf$6$6ϟc/&`~<,`$`ϟG%#?!Kn<+.#AdϟG%#?! N*N"+hM'g~2 -w#3cw? +Ɇp_?.'f~AdI'~hOF#+dG'Nb?0go!X—Dޤ -\|e_|E-z鵍kqWwCl{kOi.ڰ- a) <62# cS;]\—S X6#L0zj&aW")G>2å|IHv)c |kUN-]Z|I|q̗>aXaLlpmh5 k ZaM".A@V8C܍$:8V𥑷F dE493g-d3}™~7VcHIb0Ay ZaM"3A@V8Y̥g,@Y -k-Մg9}c9&Xa8^&|ma~CRo}?P2]/7wo~UWӶi^~t~+}O(o_g^K)`۪ h>4u,03Aq*kPiPc%QiaVO38yY)*>Uy0Yn+5Gd'[ -.>}իI߽ނSCn2S*Z|O?MЃ?g3ΌoTOTR˾hq?w؛h9?A~u}*RӓK z@M/3fOuՋCsW%L3Y $锦-'`6ҜǛ@/9M"}XM"8`tsׁsi+!|K&O -+4V(l<\` x^u~ H9cpwXSa%DB~cr<; ('YTimϵ}[}0@Kx#:\q'U' -R3hR/63á.hO,IuC:rs}s;`L - U4>/F <7if KC;MUZU$zՖv MCuVo'LkbxrQ,/AV"ooƎ8cY#(C u}(ա҇4sP 兛K؇v1+ zL>|ѧQp* 侮fq̅V1#ӂHv'o!WJLcG7v;vч/~vvTDshl#Pu%[Ў-P|--LTi4I\󛾂i0arYKiQ -3;VVᰆdt6}< kX -lC3 l^d^0x -L=E<)hjr6@E1Ѩ!s5 ji\l\ӟ+O]PڶyYHfSëɮzNb qMdC7p?/G`v2 4[99զAun2`H|auXG0˨ NRPⅸ@Ȃ*O Zˠ7S2!`$0'xrFi+z"[q$ Q >L=\ 6JkJ ^K!q)(|rsV-|JTd:Y#SZ۵?cס'?xLo{>d%\"7Tb(A6=o{[q^!0n-ɞr lˆJgWsOXq !r+Z_0/,awp(zY`^H|.8X\+ ?Y)+S=HWGm2;}YƑ+}8Ĭ{=[> 8鹹o}@U{e8괾sao!mS_G%MNC}E~yW',G(TT 9(a|<痸8{KF5uN  \I+oI*,nt|Vyڬ仴L$ehc8 `z= cksoq aVB4jz`?7wKwlS9ڏ·T4;L.Y3"0QZ #rCاFT~0;<6I Ka:jF -` -Nf]>ĹTeMlHɶ:eTlnRcqFxxa @q;tY" -FБS(}0 -iowK"׭WԖ#ĘU>㊏wuKVy.c^ M_{YN6pP<ԕph-l\SrTſn`kz%zim9~Fs -\In:Tu:WNx4&<__PCxd {[j4p5.ՔIT M*.6':Q$t/.۵tr2_{kUn҇8dqn^\_bρ,]MBoz9˓=Bf,YvHf7:4v668o 9r(=o(/sCU=5=aDO`-OY:p`#{t8ts09۝cD`&>9L4Y~ka$,:CD|bH*2B ,[vrDHGJ;8\{/"O w**YUls0 gDɓr%N셳aCff0pat'6gsrf㹃l0s}L.XΨdQőn>aAw#KfF*rI)66 -&eg'1,{;#\E_a1k(=)oosU0. pU% -|sW#R5N>,_MǾN/FZmx]Ga[~AҼd^E 22?yPtsn/GAʅo2O4x+F(z" Ŭvu9 {>1ٗķ/N3jgjm*N{+6M"Gyѐ*W9  :*"(X:౭&~%as3Y״Ow]LX/ZbJH>!?c]8֣EMWe<'xb{"''9"!jceqXS6y @Б '3[*C/ېU;%fVXBYtWO̾h]L@?Š[%}lVc i]CA| n°\vi h'p);!Aݔݼb )^ץ#Iȸ⌺5,#y]QEy-|wݶpwK;9Kw /cr"_ݷRht1&ku/hoU]-նLZTKT4[9IhL+BE'ɰj[af.?C_ -ӧ -endstream -endobj -113 0 obj -10267 -endobj -114 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [145 504.34995 337.38818 513.34998] /Subtype /Link /Type /Annot>> -endobj -115 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [145 292.69998 337.38818 301.69998] /Subtype /Link /Type /Annot>> -endobj -116 0 obj -<> -stream -x=Mo,w:/еV 0 N@n<`<`r$EK[("Y5/;Ⱦ Q|o/'mf\P!4tΈ8K%KԚ)s:PVz]Y1 x_R>yC}G߿汊ᎏB=侅p?N=}%3ljbd9@VRSpSO 3Idύ d`f$-,YqҘ@EE-85ȨnNlÀi fF]PC8mt_Y[􉅈S nYHG]?+-s4zR,Zp.B3_̲B6 g$+hoTCpo?=C })4Svb'Ϛ7w`}NB_;ZC\g\ {]m-a/HaF>l.iI{<)&jHw)5M+de+!аmZgZr책nfDCf1`7EЊ[HZ`@oZ=;5+rtnVޮ6fyFqG X{g'\eD .U}qW8d*@tƝoкtiϗڷ>g?c:6}a`x2SaIhCD4 _6&H!q/<@RT a "KAf` k@AR8q+ܙbA)n`m3[`B46@F{4 vasP#{`h4\24 SnOkh{n%oN%΍u$$F,rt`;(^dNA/uEdcY ȼn’`Ɛh`#aZ4ҕK@)x׏X=hvaJ5뉽 D mA$!i<+x75u9ihav+IJ tUq ^$I3| GtG Ch|b֑#Pi QmFTcT n@?#FUb7Ol۰OAqG4z̎LCR+(ڞ7 $-`٧W ߱)h0~K%}mtGkHmT8 ,~bE #u;t -f Ր]Xm 2P\MK Ps}SyEh#gB60+s.w.V\aYfkVognנvh ;!es iU >X{f8fVҢ*<"Y35N3N AĢmTpl''DljVB_|p@5ij sE smLG=)Iq%[s&\8(+0\]@lW 6\Y =xXNw t;kwHa!<Yšyc7fac(4m8y 1G{j0*lܹy4C,4ň/4v ]5gB-vLsu{?L40'SSu3Gir^lG=ggN&k@bLn47|oӥ;=%:zjJ}}-ԳNV|svG|]|}N;V|1-wSvssv:v 6(lv:`ōv:`mv:`Y;;$Kg]]!c5rinÍ5]0h ώbjjyZ︫a|s#E݃Ǭל8|p;]vMq]cnT;,v$ٮ`Y )xF MӺ9'o7@y])o]/3]oI;H&Cx1rn=+ -wh+:; 9 A;qJgK@! -fØLs`>튓 7~0K|`R4l)\2 -rӥU8y" Uvjj]R{b!Mn+%jq\{VB/ CėBUT! IFf25Z/l w$_UmP7Ъ@ٵ+ -Њc<yJGuY.CPSU؀fEyK:4^=6t.pȭ-鄁i0Pj[5b]90́Oa^Xqm1UB=]Wʮ50'jx߳NTH\g:ײ9@ u;Pid%`1`ivUz?RP;nبr/GR)n:QrrM˭Zxg|#06J/e<[PzK3" `v3\M_+ڬ t) K-x8LUd?[dsZ%KW-6*Y -ĹKXOV423WkO2s+q36sـ'Vn;nkjb[ݱqb&Xa?/h-v^܎Rr+B)&B){V{|Jŗ*(~_+nIGo䪷x8tbeTtWz[ -跌0*wy=eTzbmTzQdiD&}feVeꬊB] -DҜv4㬜5%'4 yәa z8YlO -GE1E)@VFd\s5c `'[sgٞ׳p3~ֺlP[3\#s_nkh̠])_ -cZϖ2*&ђ8rZbdlޫ,^]4@ǥm }.GDK;^RSy/=c,Z 2M: ӯ|USJŢ0~`=N.x.fm<>An,/1Ow +jhyJocٶ5N5J;)Y.mjYm b'm{:.F-aeu]E+eS6o;]NV!էTW)B{wI9LD $kZq-DJ5g W `cPR+nWۆphdТ+댑-r_X"c&FslK˒l(S %HLݪ/+& wa-|7jWke:T{ڪ:IF <|ہ ?.gt4BEWZ=c:ȭKDMvGL3O+e4=Jz&ÇfShx'Lб*bzIE0y pauO`6t4.g5@Y1Ղ슳o(g -*1g`, 01i.6m,Quz3}!ҕ5`ł7N +ReQ 4u٨ts!@1Mʦ ~eg,U U埡\D$ \zRߦ| eW$:j/d`C0$Nz9W@&Z$T:]^H**`U -kHT V2,6x$)ANtYm6ZÞvTUL9]A( -02n i2` G`[ekoO Lh`6C -<1 u9o pUuPq<0/qx4JUKJMP!/ eiP1,I᤬( -ECHU -1f|29E.@h@D*Ԗ]ϖHym5 -kVΤt*)p&)5|B B:lb E+!\zȀ(E@yK$I -‰,QImLZ5()}0M%ZLMzc's#nަNp;şƃ;1܅rޝ]4t -KK>87j i .RsɪY#۾g.M]DPciZ)Rzp-wW_V+<a^s^H(3!cC֟u5eud֪w  -endstream -endobj -117 0 obj -5834 -endobj -118 0 obj -<> -stream -xڽ[Y ~_яS,؝h9dy%[ήdFb|d]3R`[XEH]?7QdU0{em=T!K1 \ o/ ^nJ!kzI@xh3.oOnbqĄ$#pUB5KHM໹Xe! \z !$xfxk4~o:]R44v$>#<djUm\; KXԮ[CmlyH֌H"2ٍJ}3]7I6GK?/ko'S~t$7BsnZ)s|P(qUw;e -Gk2}i9 %)^]5\vղ/`h|$?C[ؖn Rq^(1nPNS{uTzwfȌRR^jd KLQ{]-  -`&GDIQQ F:4FY8D+Є -n8cTT]CqwOGK%6tuHI5Lm #p*ᒤmr)CS Qb -PKY.G@Fl##xm`T!<*\P e Kc - JKQP$g`>r Q0od.'v% Q8,uW\>Q -d!kұa 5K%ԥ3Psi0AT=D -t56BH ;dOEQ&PÄD$ۯwR]*8~hA`Kqt"&v+hxlK]E⤮(7O|~Ot&y6C(Œe@ -1^y5MI_ >WM(UOpa>q"YFW -!9DT^J>LO8PHhL>Ѫ3EHitMcUnXC#MQDcE+J+%׼N{łjS{~ah.0V M^TTXmHN`|2EvB7L(ɁZK&t"S*W59vzE ww8駻;t%üH^~j}GQܥG-)~翑{fs,!eP9ʲ/v{2O&tq0G UrB]iR:<5A6}%Q::v!#6N -endstream -endobj -119 0 obj -4457 -endobj -120 0 obj -<> -stream -x[K# ׯ9+z?@3>=yY CHE3d.%#)B O+$-oҔR$e{ KRHIU*ix};Ki$>')m+ e?O2k&K 5ן?3̶<94{ge1C{v -<[7B;H2ozvdʏλõ2u/]n;֚eIhʃ\T  XYm͜YݸIKt2EhԵ5eWL[eQ\/ѢKY$(i ]6wwGS,O S|։Eӟ?RL~XvǍK@ m0%.< *-|Oyo/ݤՏ,U."VpwۋƶPu!@ձܪ,LR$E[dK{^*@ ^=ͦ=5Kb$9ѵ -p-KU3w&hF~7BDzjuCM^,2y馶)2ԣAu j%k<4ELFOt]G]t=C?-˰|GpA[u|g{+PeDќ=?CQZȫ@)].*8.QTl`&LgVvokҏ/>2:nva|-dl3  jν{(ĭ8KTrt<5Yt[~"X*zsajV;Qӵ܉ -gnv'ՉIa6e϶oionn\g{v&\\!8vWcsz K5% r{oZXP=(n'IY~KxwME__mSߧHzA/񏿈ڷPׂ66B.'k)N PEj/Z-Xؕ%YC2U WoʮQ(QxPrXt()zN) t$@RF )J+-Nig=@* ny0ZFy! 'Yda#)nՠ ZO98@>AFd:h0ʈCib<,j %z4ba>?klЇUAְOo򻐜0fD~4v1*iFPpviAԡ9&Fe=)VzU偳2^ơ40 5 vd!'"2Ixs@[}_8#O]S@-)>a=K|RԤ!ڒ-ӫLr`.|+&Yԃ$VL .!nã`߂rA]MBK ED(8HY.ʰ/W[WqО79HhJ -5R_qF\;CmkoN hiOqzAI%64ȽI;O\ؤB|`]4#xxCUF)B4/˔۲hN]K f4`ڢrFczi >slguBIXD*EC2* -?q0TIMB qhc\-lIG -( L'Ek,+k +gr8`YNfH #HlZ'^uTQh{(ר r3P(>a! Ä@ܼH%A9Q ^ aR9iaߣm*e, Ԟ2" -=&EL(5NI'n"|USK{g5mυξ1(E(S~귇irBƑ= ;"),Ja$p#4S_ze_7ٸj2XpXCѸ3͗bxP=-6ڝpPt|ƚd s<]#-aN?! ) -endstream -endobj -121 0 obj -3617 -endobj -122 0 obj -<> -stream -x=n, -=/Еҽ󖍁}b`/0_RKU}9ٳI*")2:CFS (?E>j5@$Rf2MD<Ϭ6vR++pѪIT^3&R;I]U_3)&ր V_;h i8~<|ـYOKK79TɾFhIȎ[4\0zLU 5\0zLȀcFk'?$`Õ<fEN|ҧ9Aq`[-fJ$zd/7Lj:Ungɞ~a;$^ћ5M& %ky''itI>[4B[]#K]n;¾㠺?lH[8Ra!P3c?`4u jq~XvZ  QO{= -6:Wq:?9fGQɀ yrY*.OUUI|Ңgrt<|? U>y{Wǖ`WOP >\z/XUT -?a?n!,R.X7].#yMMN:|xK)R_7'ɠ $Y^]hGrs(xƽ;wnNݣ]JuWMjuכ|0>}\f}a]>}em?(#u -9 ~iگT1_vӇTsiq.-b( T\UェMs"ƜsUWz -cw*ŠsDwϹ{3fM>BϹ{SiXCUր}N^QX`e!sیd3ɎPGw__2%K O2^>1$4[dW-DhMq-',rV$j&H OHAp>&2lL}ղeZ-Õ_s9xuxM‹̐29 "~˅B\U:ԑ5E[EB_ ҈0&iZ˴'IHI@ ڭ/[O&NK7E9éy- LXAR;f}pjt[V -@? 582pjQy`)0yȰ*+eb:P.Q `Mxl{]v,9E%Qiɛ&L5nɢ$W^6-e2cƠ\L*y xo%YbAHEgF|3#q:33gFtΌ gF ;3wfDjcܙmP?C.< 3b^3]-C1,ҪHpj]>y ]r4G3 3h/hp4.bpI~ r#{9t 79W q8䘃A;䐃A r r ru0訃A:t  :`cr088䠃A r9``+9`s0萃A8t :;#Q rb]'#n‚"{Xb4BZ'c$A:#Q r 79;Q r ǝQ r ;I(ɸ>dE1ȭNvd\b(bcNx:Q rbNXs2ƣdbDlEІ4g /a)޾j6Tlzi`H" @o6 -Ս[Pu(6Bmf?,<o-`w::::eR;7΍s#;7΍s#ƍ78CgH i!3q4ΐߐu?dPM!7j7gP jA3q5ΠƏe!ސRy )8D> l ƽ>)qTh͟@I7z%G&D"BCc"&v놄nRNĹsF(:XgbQ3u(}HvcЙs&3~uƯ:WƯvj;3qF2H8#g$HF)-g>Ιs3x8g %dyuI#e8qilR=x$lN5eM#e̬IsF0&{UG7]9pQ*"Hcj ?b]̊uИ] ktj@V;KF(׮Fhl,fUb1f:WuИU_/LVA _.p3YfW#ʘUln$fՐb1f:Wu1+1+VǬp6fي9fŬ*j:7ƬXb>4fTEUU*jW#U -F1H*U/qbИcV<@Uj`Y@jbVf7Ƭ@94N`M$1,R" ]:% }@};wG>J7#/п廒LdB?A韞}:y,۷y<$#4ߕ/u1cpyד#Ͽџ[8B#&+gFif3(G0#ɓd11@}t` 7ĢCDD&4z73C/.=Lbgw} =OEێ{wpUīCYѿK^s+-ANFM}cSnd؏$Xǎ[=Yܥm/Ɇ*!kx0qEl͗Ğtf:jWFB#N-ғ7y\/t(;wm+LGu\H->e o졻lv=r;DŽ3b&$_GO,&[ki~`Un^]\Wc>Kސ/eaLGe'[+d0L3[C~I -#2nIh?>Mf ƨeIcI{d>IOs$u^{!rygsH5}bD>Kh=%pJFLYʐ-O"[ 2"j)lC$墤2Û+Vwrz]ۙR"G b(7z}߹j;&z1]e]$)@L -uL3W,1MBzW'D$s_* h](b $sUJVuJTZnd@΅]g2^ >kpd+.bE7Z9h+M Ǚ/q$]A1WU ڴ -zЇ0(X$mjֱ߻ mWݳDLvqWcICF4&t@0Fպ <mA_`^*EzZ@2&?r'(*&xRe ͹dŬ.BKǻy1x5V$ξv̹i93^bvy.a\= -_\ʸKYr4gݞ6 luXw^LBȪʎ!P>5n^- 1;KkxH] .%B]|ZS&" ^l2q>%Z2S(-,CppӲ/4+$</2!0B"*^|s -t;ب׍2> <ߊ I Zi@LQ -mOs|9T]x5^RN .ϗ9goꌞ[otǠ rv-PJ{25QYۓ5I"<`v㎨-`',ESQI/{0B2eqV$g -"a+zGhRs⨴ix -uU:Fer0eɫ+gJ /Z@Wt}=ʬ\ Lra*U_gʧłSΙaUC,\`a_2W\Z)f6H\7'jmг0L%G98 -=eu 91&s;a5|r_5Q G{,ؤ["cKƻ{N{_8Я$8tv> 576j/V!Gf]*o3u`xmxtb N"lvq' -{*ď  7 p~jOX/E -'1O0'` II\m5pVr=*e`F&b(M(yhU%c{ /P!LW"} xfG[/*o<^ yl0p̈́^na֋&9asXs{`66K*8#fw`(تQ]^ VBHRɷoxtN? -lW8X8"azG!R`r^$W?e% !&Ȇ8OJ|C0ʏ$)[:1 v]9YM,axd%_ZKU}Uu`V] / -d$R'iV0Af>!@/32}dMja -7ϩ1=o`,yu> -stream -x]Io%9WyGP0twзI`>7 d]Zby]W-EQOA ?1L~ &eօH\9<$4Mz0 yLpq<UQ4jJc__ PQ,vXSM?eʭ4lD'Sl7hEuè/LIqΣzW|TG,= \AF2!x 2JЈRLNHln,d) -u=&U_OˊNw+)Ж1Cc߳ó<^TgGk4gAzt(+?ϺG9+O۠8g21Ƣ&?35*J[_$&4?z݅s+ϳ3BqNL]q>O'ɠ5h&h?k^3ʏϽNZ͚h7fE8Vc+\6S=e9vr"eTN,{cr8%,!j/"ыXBt43 pt%\[s\ڶ.3fƷjqxkK-m/O}P߅4vңg.`qU^-w z x%Y")VtkZ?v︅L@7RjEvn3Cot\nB} }.G:tyemL>%~jj6ܸJmO 2?gh'b)o` X?~ QBE(W<=f"P=։zJagtiU#ःZ{tEIG8CQ -t<&:yjul3eK w/DO8hsKH͔۴1Qn3Þna#Ǻn%mz#*A3 {w{.z+ة~ "SXC)Ya[<݀ o9pVWoMѷ>'%AHVt2Q @Lu-ZP4a󁛒&d16)F#bQZF;A ``_1ːL["MW.V]4u= ;X9u7Z٠eفp&We˾'P1蕣e:hYOXJӴʰ2 Z|..^~fnq];4U%V+%VN@B^ ܁ 1i㨠*}+lv+ g#JP2RR2LXhvɷSp2(*0%0URc'<&P/q10( -@%@%: -.?Vy\;'v|K̀qNNi (*@%@%: -NYJJ8'F̀qNci -N8*)p.TUx4ng -D_%F@4 N&CczR\>AC9n*PJ4@F(U 8YUn(X*xPu|r"2d%JOPUJ֋+#efYeP>꽐%x' 8fFMz T")K(_wr*Ps|սQzL+^S5ž>!Jw -W -",Ή(\y+ueW%%nHm%r+C #~aٺϿ)vu%hل,=)ƸDmVi)&k$9K?b7惥3_. W^s&3_X'ްD+MeV(DDTxBT.>I - %nCUi|T[qgNqj?]q N 쩩64$6[5u)D&̗c5]l߇wܢ[}F6&`Sڏ?r`֟ӼPlrd^WK~yn^j\|8ys`K_t_-, eoS^ $ߪ\?Gi"1R=uDބB/[ /Nikɭ*b <,'Zz:SW7hfkfݗͰ4[6ρT {uo-XŸluSTdL|EedGF%W~+YB05m;*YL{'f4lC]yPే>UN[u%Pz˟rs;Z%?.-yP7I7vidYH^%w+L)ِSӶTl0!a"9N|%K>ix͖7´S,Y4(PʾeaY2څ&QO8! m3yfg;空Z-kʳjrڡp=M -'>9!ʋ-wQ!C@aLCvH}#HUr:F yIߐQw8+6SWK;*?ӅY -qz\S=ا1H 7tm`k-6}ذj dd6_J-?j17} -=H++I]mZ2b򋕾%қBQ:dh(;ЦJCQ\xmRGiy3jvWi!&YbI1&.hڻ*Zˇ#&Ǯ5 Ud;AvێB~+2v2s3| !Ͳu@Rl*۳˩k-zٗXpu*m2ݝp<~:c4iMۚ.kNr@c</Mcta&.5N-͓\__{)r^]XƢvեz}OI W,Ӟ)?ôCȷmC˧vi;խ|yy+ `?}^x4i?ʼv{y ]L| <_ |;Sy43<%hx݆Ff~:u*]nn7t}9N-&tw-PKWjxIawAGiJ+v &T}ݲڙ:w\u޽ҶaWqȫ?;_)mֻNni[Kzx{3xmtf dhvy;nkϝG8@23aw=6x??~={ϝe?n-]w7ep>b}U({ExVyǟIş[>cttwjЬp r!=kAߏG\!3SNW$>OA,ݔ ]sN2n<\&8$O6 -9aefq2> B%GRO(:DR!M- ˸ AJ&JLaLCû|=S쮘Y35f\ٱ Z)h+&C'^B&nf) -! Ѥ"^yB7423+W%[L2EF@C9\}z2sx -SL`٘䌞iK)N*[EHKbb4ҹ|i&N#x^ǶވQˌ)5NYr).}^HfTP4]pzĒR$lDJǟxJLJ. e4+(Vؕe}b!c;~2fyQ,< F)zabsj9,Ґ+U;d MԕbJ1^Ӑ5 c64mT2Hh.uÅN"'p 3c`ѕ` W =sWuѕ`ѕJpJ0ѕ.+}c -`_Fp9+]7EW:p=1\0K0K0$.p -`  80Ycߟ]b<(#b<(#q2"L h#f<h#f<WF3sKF4]Z|F#h<"#hG4Nsv2iͥR ?O_xzg~ꅿ?/2rjG|#N:O|kӎNi5vlDA_hOXuohNW8 ڼ_#Kk=w aq8{G=w a; KSYBX]d 7nauZ7Zd 7n -au%j%#Epc,VYBىPn b5K5jz, 5c9=7:aX Ԁ[X7:PG}spkpsp V 5 V 5 VjAAjAo bq| A p *-U~ ݂X Sv>+gfxq(q(q(q(q(q(xCqő D2D2]#!{PҽdZ\F2sB+#dF2~]x_x"$A1G2L$nHh"⮑ Q J_ G#D21@(AFh\$iHh@h@k$CB@(DJ%F4ۚ p"~jЯz,LBW'i/ y]ӉGHc[$BE.tUսH(;͂>4 ]qbG2$ Ap р4>2tn_i뮾 )!E -(B+f\CEGo޳Z;Ua\9U -$uf$\4KZpV׬=BMa\:cylAN,K*avEd}qZ(in%|'"|껔(q<픡f]r, N}mBJhA/iaQN˹vbɵ,eG;QGv)_4 TWt)yҸ±d J%EɸQHҏ=-Kh",c<8Y.9gjtڃDb"whApɅѾ( W s`lR]K<ſB *P#Pr / -A,aL8GKB:QcB/$r3 ߘQ,@nm\d(S̊mMC%MkѦhI鷺֋ T|6,x^TVXעPn(*8R&t..vmn޼A7Dy)P,ci nAQk=?*%#^%P"IԃEH FחٻLk'[*lu=PJ}- V -Z_ô2#Fyao0+/npV&XJ)/F1J#\s@xYf+b -ހ8AHB8ovus2sÞvvw&/7 ] -OXp+ -?ڷir._[IrLƱ(cL;k -?2\/_*fj]el`gp|Pm=zi~*65eC'pIxwv(hky6x8U=I2c -endstream -endobj -125 0 obj -9192 -endobj -126 0 obj -<> -stream -x]K丑Wld) hP]^76SQ@eFp{939`DK?#شH#MIeF$w1ᅪ|!\q@ |3O,i y uYSwHk3񯄏2IUYK>@9^B/C9(T0/>hL~ ^C+#</#M,׆}Ȉ&*Ss -ÅfJT85k%d8A5niNj9,F xLAC1joD%ҿcQѨY0OاPxnl=fVJ]KA[k1r5؜ }??>; ].vXvGv5Lʌ+}'\_Tsj%oB=8Ҙ"k1,D kg&0b a""** ߾TYحWsV[̨\VoU9vPZhlR+\u[hblKgY-%,\+>|WBo[h1;bw#9hӲg>_aEdZ}w!ю.ʳeLKX7]]tm"tz5LZ̬z`Dw )]x@/;_2셱MqUj#FbktƾfUws1⑎=DŽ/\`5lhfzLG f,hq1$H(^*+vhIKՎ'Z+1c'%ٻӾVN@8 G)_p?_ [/7ρT' QH{$^$v[v@b7$HvDUǮ HӔ슠;e!AfC^~n쐗 H.4=b H~pY%; $~y(]@ Fe[5Mc2Vc21&1ف4:R58R`MDW2k'4h%L$r)I_aF)P%`W %^-.ZRw@KKJj3:PIN<l i<&v&ܨ~KYB;0|Hr30+P2FTPSBɪKrGTjܲ"z$WO-urZ.4H;*^U_cnL_ dk{UWolպďŶjͩ^d)5/E9Erέ701wph-gKqv6 oNﻋ ZΓxwpM5%\t{I)(uq{@'qX-{I/l4۠'i"/+>U,_+\%4IL|g:' -|ɿ9zNfZիZ-5Ep]s6tk-XF0!+5-/w,6UH'ܸ܌zhwhWoCjV=" -1J\nbM'%E~~9~˚MIk+,RmY /[Cƾ D`miceIfk>2yx2ز&/b y84)*ޒAjqmxjT6]LbkZtAڦk:ˍ8Vm(<.WݦK}GQLWpu7 t6]bZBGz).+Sڠ+Ĩ4-:>`z]`jDrD7 &zoUovv~(p oW{;k{;Y ίvzogίvv~󫽝mx;n&5-Z_4YNw1 `q1'fwOl+|&t/u}֩q0l=pvG4YwAhK3wA ֻv0 Rb> Fv'֧\wRPbujdP|S|P"vpRWcRRzǜ 's9q]Vc#TF/z -l]'{V*O(5v{2`9Eৣ^Qa賭yr-v,L+/X̨Ʀ^aY/u;4f_nNx|StrGm;/܃q-Z/-U cũ1ɽ&60=|;g:BYkXЭWŜw.+;nܦ):[J9޿TvL?1T&ˮt]Cjt) 6  X97:r.r1!vf -Mۥ-'uy.'9_G91{VͮqKqM'\cn yk3 h"jisͧ͋S'ʺyLY\{ Dj({([sk}3CCcCCCC탡W]7b~aAAЙ\aýWO.0)LRK镬f&׹U.~ @;Iy#/|ݿs}_A/'Bn}d-ݍ`CF) -*3ٙh{7/RGLNI?#RVLqSM`)O|WƱ͔ rRXspXrbA/HPvPcR.nM:4+ijQ5_V_I$­6@ M/1b!`܋[DgT fni{17,-2PDJ67e9m,:EL֢!!q,R1j\l@L7zP{ -T&Fߔs%Ȫ(4tò& 񁦯dp-[&,ݜ"fgMXJq؁Ko/'ҦJAԛ)ҺkB8 ;j^ӢtoN}SwkT$qBC:3C7n7c`Ԋg:kէh3rEmRe{^VR@STËFѩq#ˆ M _[gd]BP%"#nWnRHg G[VY&|^fK%%pR%%4:E2kÍ=gD*աԕ)$"5Hdia߃Í}su%ydioLs9\c5e^urٔoq -'.3b\ #D:Ʃ6YA "$xg&nUޒYV r]RC&Jbȓ9Qj=\_R`Mu/\os :k"ZVY!̥CDbCH!{. :W$bi - M$:DNs_amiχ_IgAHڥ0;g Z4/Š{" 0>Pf_XbL\ 3m\ -n-$ B> 0Rw[س(0tqzgI4B_S.O~[^pcxO[A,T\ )Θ"WzY(b(I7>OVfԮ){YVtH30nYXJyPd!B ȨQ%I. [Ȩ] CFXS C6h.S^o_aZ4,tZD e1Ob)kʮ^=//y%6 331 Dߎno i29ej9dJ!KNF`U -Ěk -bk&d~- Z*c5V *dJ[ȓqaMٻ{U~ŻS̈́ly8OtKބ@t%"۟KH-]3GT ^WT`ǁ?a O)vH@jwq v?>R$b?! ŏ)v H@)~H] ůRlH@]Rz ŎRCE t;bGf{N)V)~ ./Rl };0: Xq;b[)FW7)V_RꞙR>bg;;#uH+f)vjF bfN)vtF:@~ sMGRIu$ՑTGRIu$ՑTGRHjr(%WPJPJ J:PC:Pڹ4]:U[ -V驂D 'X6O8Nl}@Sz@pX~LA,Ί3&>CD[bP[V;X`;X~X޹/%>ءTRJu(աTRP*b -J;PC:PC:چR3UP -Jt(աTRJu(աTRJu(uJET݈<~) : 6A ->] fT̂-8 -PX &[7?\ -d -AL0Z ]fM'ᥟg)pN+GbgƂ`abR9#Qh;Z?iAWsfT2`3Ih5|'%4!]PG|U/i>QCnP -QF% Gg;p"XLa;p}W:!w KrrGEQlr#j66<ӄ$'NA2N^.5++͞Hvu >  123 ڤ) KUh ngLfAmXY k){3 bu#; 6밅42\SXxv!`9 c Q{0i ]@ ji -ʥ$v[q48| AR9r`ѕ!Y;RӁXv%ZI8?B"=zVzQ+[f ҵhY(A -գv`hُq;s9%jya|Tur2NܤH^&R-Vڍm|#x\!Y2%7qL,e|T%E<α!S 3An@`L i,mq.w0PDyKA w6Sbr5P.JBlNa(+Fz4j0>LsbvvlZYeފQz93sV^AQ!rn*2x<]j<p"4xY -1/fo\G$J)E =X'/ 4gY|No]GyG-L|fgemd -3̾;s (iWs.BȒTS##|W7yhg|Ծ~>3R*%3+ʆ.dWKlg^uUrX4v}KanjmjOj -endstream -endobj -127 0 obj -8398 -endobj -128 0 obj -[131 0 R] -endobj -129 0 obj -<> -stream -x\[\9n~?<D `4`N/HdA<e.ڋ n93d K,(/^z6^ZssVEm1ןZ>}^07I%mJ+>(eR~T'3R??|^뷷>19#~>h@uO;hasōۘCmϿavQicBJ[,b gb| -ƭFgิu׿[LRՖIRF.-}ѯC~G-/п}ohEV`5uz#F&?zc[ؕYFПvjRH߼_/׿~ ᄒ? -s46RjiKV{9wNKIy%6Ů/5'DEwA4͸L#=!* 9EԝQM[T U_5~@mጬ/ڴEm<#+K-tFV_2)g -:m6gz7ͥD s@[kXgGHV#ʚW! -`7-QN0%t>F\PgÄcL^9dGd_TP4iq ! aÞ߀:䉰$рdD|($:D^ a,6HW-$Bj 6!B #vDLH&;L"b$;pF5Ht'TG 8z}Bgr9u& -`WZ[{dēog -)f,M ׁ L#lu=@<@$;얢d_:K*NC갢i [CݜmZ7XUzӥ72"kX6.a5FCwF ,#9:t^)FIFeT(a/bdjy*6UT+h`k}٧EE,36si5D4$[g1Bh}ӹ<ٻN J~\a}mgvUǹ:q.oZi~m"L}JH1 -ۙSt;NHۙ:3WHbN<ɬGt`iάNǕItwǥ7MV mføW$B=KL2biՉ%̣Qhd2bԸNe9iG;OJ3_)?X Y(9ч;859,Ȕ7u˅ѨNVO`h ?~՛ֶH1ič8+8@]x}sy>weS%yI_&pIfN}ɯC!O I$ZdXS9O{iظ6E {ʒQtGYTv:} -⡈e| ^jX141ʊv&L,/j/Q5"`MQc56i~k#҉'Ӎ.'IVT&"hpQ).oʼnʃ~t2h6Q -^ %^[ -5bТ|ˋJC|YKqg(\RVz)*%QD(8xqT ԉ*y;Iaʱ@&JE#X9P; 7dk>F| /}?>w_Z;FYu( wr,֫c 1^gq:Oa 8JR -宂7u2INן ":si_bJ;_W)]ŋ$)jNWAv-K| -$VM&UGFUhù}pUґ$C˧+|ֿ|$3ŬV:ONrf>= l_+еkjmZW*q[WR1m[?UkK+zz }d0921(kbE*+݋{'>?ԹyWZ.>~JYg=w1;Hp`IBQ=ʱ!x -w[9VY?SɑwRE*R]'`v+0M] xRڲ"le#Qd,Y&k8t4}w8J1KiX|C;${%+g V@q.85!+GQKݙ<ȶ\SevX> t, ~] -նLNc40BypC; -8+4۲P6 2, KP1W&7mnx1b&:rhG1;a]=ϸf^3s~tyҡaxa.;Q+s_S>v,gaU:S@;"|*b6zJHyUṲFXeBt,/*iteg ^X]n͊me dq xqZXd!τGDSHaL\s_<,}ۦn%i{5UOJmw=Y -&W7zQK;Y̗iNsSޏcDny5E8%RY_>Pi%ܐ1ÊœaϹҟ}/!/-㔅y:]}sŗD!j %'\&aq|/z\b%<W\Wt23x*[loI>%cRn/xhSo$h[5J|/҅ IH"ol7#BdBSruӨjdH\̍A\P_l^,ujI o GTZՍD12Jx֗ec+źc55wuLN.MUuDJa割Q _m򓠌 xL5kA$`#d~\=\.R۷m9B6t}!~?]5aKYqtpb mR,Ťĸ:M_.|d[BU?+)3 -PVa_ "Fƛ%\ƥ7y_sr)hIcHB -+(g-_~GƗ{K5i+5iVIӴMpE=rhU$ϩA,uE.<END|;UC|sAd B&wƈC(X -_h}iXYO!Aco֮?sqXU;@u K#@F W}/Ȳ.c#WY鲴i>9W>By;A홷!8f)DJ.+aЋ3Q\bњe!m_j{!穃A=2u`P_ }& Cn > ʱSHE -P*W*8?|!a`׶ n|˘M6utXXI" ԰u[y[7;{[D/ZE;q !1)֝-6H x.B49UJ2P&( -QvXXԡ(hg@NTX(t8 ɔypsѸ5҄2^mEl5N5|E9OO7^ʹn3N8X_ -W<ڹƆ;\ڃcmNa<յ|5lST@%?!m T=dye.eF̋kNxq㼸o0߻DNnLblFe >Ty|8TPUZre>:ޥ'mŚH! -endstream -endobj -130 0 obj -5655 -endobj -131 0 obj -<> /Border [0 0 0] /M - (D:20180430025315-08'00') /Rect [145 389.50391 370.95801 398.50391] - /Subtype /Link /Type /Annot>> -endobj -132 0 obj -<> -stream -xڵ]8r+e#(J@ꚮX`U _7n,`d/ɓNO!S' REnwSe%?\zܥ:ɫ=adjStnݕMc _n_0e*6oR';1/nY_3sBArH̹/f ?H:9]Xs}ʺߤ]v]e׿_o?IEe??ʾevlx)yO쫍'mT=[= ;e-s¼b6 -2>@>ZCtRǻPZ @O{PS)-UtVw!u=/z?)5i9K$>ۻlTnZ,/A' @' {=A}uZ -ޜ/axEXj7q[Go-6PE>OԀ؍mwm`X-l/mzhx9s^SHS}܎xEC,m6a  ]:V%}6ob盔ACm%19PMbRqU -mD͇ eH΀pj-˼_pYYfOdͤ.i(m -}ql/klH odMmT)0=ىKzvhZ@i?˂]{) aJ8U/Hc)*yz<_m $#rW2s㱭{.5>FIq]3nۡhFC{!2?bvD4#1 -_{b̬2_;dQ - G24d}+P@qf[ 潑NCK7ͱ,{[{^cŭ:)٩Rj!>DxH&fH鱡К wXfuT:*E߆Ҧ|Vå)u*|*xZk]L/n[{z|"EcV hj5UQu5Ym!lT) `0Rzf@kE` d rzԉJ_7phJ2'rWNl|uխ!l$x.*BZM#{Qе[ѾjSA݂1k06lGhtjas͚I_vtטPl fh Y!iNJhCmNJўk"Cۍӳ B(I+'YŬZjʑ$`Y \KDv3cec+v'N'S&A'NPߍ'b;X6;TtY lMSOk,n"{y4j\V+p5/ZpyRqf5M{$|fliLR͓?3Lki"g{Y8l"7&^=B~,Ug -y&\D`hn]{TS#)h$[nz"fL`ʚjogm2`6J[6v! -:*ٔPT`+4T*X өiG4zC6;CQX!6y7n&)0y^9P#.)ݽWb)vKq`kNxC|/ɶoxx>oh|& N/Cfhk=6nA+x>'ODZ3e;'B%ZLއwMmͬ&jXM.Ț tUׄRd1!1lc;?m2`6Qև'ĞXǣ,eh}D1V}GDG<%=xhb|6Ug[l%RzGGy~q ~/"%r-\ ɧ!a!'VMt%햫UBɈZr###5=B5+{3r G5~;om@#6Rgƺ3@5Qۚʤ hd Lu ڴ D4U6K>ܶ9(C>0}+#}}uw-qGf1k%\{,?7{*F́Tkl *,eL;%2t3"ӝ@QdE  H2e@$qA1繷4՝}m^fۤA_o[ո e>v# "cj{ŵW78ic6lࢌ:{qbxBBڅ=QNM_p:_[*}'\w26H=8E-6){ -T Ai Rh24 <`PM b[d Lv_Ҥq\Ű}\*wm&Q9=p[c<#RƤndq Ԣ [0 LXBd @dQD."V)!d.29.q ɔ #ì r )@鲑ad +kaJDϠO"r1=`{ZA0lǞAI>2ي٥MfHS-1X-cLH wIAÐwLP ep)T.ėH\9=ףc\p-ⴏ'{bR }bZ,ע p-\50y4bM9s8p'Q`(!`1jz -h趨.i 0fׂ$iEfERbCs Y5 t09XӐ"otݣ"M")!4PjMN"qvIS)mu.;!U 12 X5kk.\ q$IGC}^]@c\;WX"p=p5?)M.t K3;-/ ߮'PGu|ǷeH#P0!Ejz%7رcX/#Fx{" fEwwB.U 4H75 < S냬(Q j%@v73"B| &E@Zd ڥHЪPhA)8T맨 -)}Wޅł*"!y!10"Z#H}-G}Ԣyn P.Ϟ(,duB3-AR"rrHZ+ + $8k8z0݀i}0M-1z)iMqziܑ g7&$&f ̪LKL2D{/!-nxpzrkR6' HzȬZN@h hEzx\ZEhK[@5!)qAʶed2QmՋ BVl+_ \ BV룠[WXՖ@ׄ\:9ņ<gurӯ{4\p[= rҐ=BZ’v 'l2^_IP `tK &_6=lb{@!xtl {fٔʞFǓCp6<(CFa|)*9+# PSujɦhbl40-K[}8-F6d&P9=pk1j J h"R*#>e(Ę .f 0Fd=-n=ѝ#!r}dܐ{c|"m3+]AxqC!lHHa=ܯcPL029KQ*qMD0r 6oqp<휃[zAڥn?iu6=ӞG'`c/#m:2iӭ"kA @浨 NbՆAr6:.@P6g̺R)!F2x2xYX#c~h{4g"* D'\Θ\t[gqEgږ ySFT6 cva(ǓciqV2ʑUQi4ld`mZ bޤ#bk9~\p04( Gv5@A G ٴ dZ!K":DSZiY])j *hTl-qL@b `UBAh/5ԝ( DL`<2 $Lry٦ȅd"P ͽL# , so 3=1>wf1H&_;jbm%L#c2{ `m-r1=`{+`ds X!f>fhc U.Dr" @nu Z\^A + ),#smئ PO>ڕ=9+H1 -f{DANjfǓoPvOwrN`= jʈf;ϹmW23xMhb&g8#>u rg(] -7v !Bϑ 3i[_6PҶޅڵw6^p` iC 4jgfymD6_Be0$11 -=L*6 I0ɩ Z iXA@#hǖ&)͓:41G 4K1 4K341H2ѫ\Jo\ƭXNA9J84Kk񨞎EhsYi~zǹ d&DB=`rj6GH-zȄ@ȐO*R<8&)(! -428 4K28 4K18428 4Kʑ+sʥ0'XNاߡlj9Y-RM޸dWH?1HdBDЬLLMEӘ5-k<$CvbIvz.Z } Μ)9&H9&H 9 M8q#e\HOA!pvrBzr9st  Cm횪Q-5A{$a!=rkP9W 42oPiV栀EFT모jRBe":*ׇ -l=MlKl>&Ee(PutV/OW*$Uk|ԭݤlc|{)5l9Psu> ~bPxݰw\^Zl~@`TUy)hc.`OZIf4nhDz;uv@C>= ^k4 2z^ES'34nhT!#+=Fhч孈H| Znw=d@ Z+;I~=zʻsc];.پy MR(k_^ǀ[OV?CxǻL^ۡ@Ѷ#TM; -5뻷Ee! 2Bj,iB#,+b%5gB]{Mt{cMhtǪ?e(VB?ۋscooju.еt (2 mCJ -vRU[*VuR)f6mamت쑜ۧn>Vudkv~2=q ;|r'md8N ZFڹ\R-^sW/u@&SR/oϺt~|yǿ~ۿ?LZ*\Xs[W~~zϟ~}dfv۶ɔ??4([aS>.~J}6v?,նxzDVZ5$lz7:T Mq^Btڎ7Ua#S~W%;h{g`CS{x~kSBUк9JfK3*74UaCS"<ݱ~k{K52-Ǽo-Ȓu۲kK}: 649HW<ՔăA*mڹw'M%2vokJ ^oGA~~]fP1:r~ Y@鍈So3=5ވmp%c[f#>L(o?S wؐqq]~O`KtKtDxYVƏ먌̦o MfW7K'k+fԛ*x fNƮ| `"ӌe9dNX_F.X,D_N'֜ܲ{Հ40-w5ۯG6-Z憿{-ӛr-ӷve`r oH8Zݍӛ8::Zݑԙ)}؟AR>,zfQ8S+NÉ2,_O50ٹ# -LuoR40c;fg=F9on-ӍOb}C=zC2CЉ{Du֯tdua?/ʜ$mqRחgp]k3i(oۢ\(uEm%meg]VdMP8֌e!Skz}0iM] -U~=.pӖ r쮏"Vj2rv|8w=3v2$BŠ镫rNn٤{ d0/9yȘ'%=JГiIuuax*Mr0!^G!"oť6}n]_GocI/@Tf~]1HE a#SSC>5\Z$В2K)FK(ɽeʼy ;H0eu^sT!4 (Rt)Bo'Q17KrhjeMچRE,2n*z\WCqMg*PN/lZ -dcdD><]>̤Q{ٴG"aCPI;B+Ug5\þTԗrpX¡G 6 -m`> mQ&d$M.LmFɒҎp|2/˔S4x\_4 1e59QnJIKrGe%})tz|t]e^2[>̤ú%Lg xwm|KkTsRWI線K('N{$J`(蒏b-oyXz.Fo&vThGO$c PL>,q$i \ȬxcSx^Ds$SӻMTPYeN;WΜ3]a5!sEʑ8ՙucRM٤C#ASmdVo:<{V G0 I;„7D08:r|/f{d},։dVlզDaR4ybK/YNHl'*D`A!@F)JcIgՂq{cNƢT6V"? -tVkE -&՛K1c-Gj ɡ-I͹]TsH 7ȥw+Vбjfpz$f(Rӟrqz,LLi'VO")@'ɦE !St+ꓱ w44ce;V{$!u2IGu◮V*t7`tuUM)ՒIX*VEI&#׊%g/)zK)\&1/8=A$ޮގ)é)]6LuABip.cz<DTh[֋ '&;;ia!ٮI?k>u-vS]PMsݲU~ w]mre?ȿO~:]t|+!OYo~r]6匄  ?S&?^ocgblS3>jUI^d^~_['ZVmNZn_@s,qUQRtY~̿i>YRDisZ~;sïVYCM.~H{=ۻ?<"!\FF$nEu~.COo].vyL<渲[u~upHY4?-4I -6]<^-6irۼ[dJj}yh|NT=ȏg^+jwېsSx Sm;s^-7&"T@.H&;]i{]g Es.?`G\}'Xy':Q:w5W|G=q{vÛym)Q9W;D7(;|WjkV )ɓ<_*t%'os'zvʣ?]ҟ`+xZ*k8a>lhV QG2ʤ_ -jX -TSGJQy"H[*5Le|ޓFP4.{$>,g/565ѩLf}S4XJ(bb@`^ڢT6uL5NFrW.K#\I1kf)aPL54:,tRIbiT3)? #2h^{2ݯ=G6gQar,w훡>MHsQ?XN2uT=Л8R%V+탕Qfa2t3,$en7-<0-3U_Cw^cY[#BP.67/Xhkߺ 'ckR$WڣӬ6Q;9z~5\݋FʴҒtQê5+tU2+ɧ5F}nY^s2/YTf/5#wqKW)9tbdgI&9%'^pFIRڕ3'ݡuLSsnaN+GDP'C|l-W~EߡzW춊#:s8Mְ'Uͫv9iKnoq(RN]vmy!H~%=i*R!o55b:P,iyY_ap#}9[kY -kQuGݺuR'ldZyKZAKzڄŅ{5}7bqzk(_-cGzxo5cYtgF~-1G%Um;c>-=_;T-_EFEuzM_9]/dQSǼS?)2ՠZloWޘ -ZNfɤnWh9sdu{׍#]ME" ._fz5]g3լMBVKD 3svgmsMͯ^ktK^_qDTkEtY0jPBFdt_q.Q[:*9ua bVw{eRW3Kk^F^O?_tD%=NWU*)-0iRe»y]Z2ʧaKRu/8T_W>dǙ Sd"yQjWz\ls&%t~ {^"yVFj٭)WNG]>ʥ6R+T08@<ɽT.:wfyM i@6Iw:8@F #ɞۯ8:Lk? LZQz-y)%e("քb7']rŁc -QHty2i= r@gTdfq闯Y$ׯ/.cWd2-Im,&"ѷm}?|O횢-yL)eKLMk0^~rd:\Q5H"NZbќB$Bk+w50ZIi|}!+nY*HSQ(+*̼(5LEBqzPL]y]}{]3o)+_6+S 3*T^\mJK}J֫jCږ؇H7 ӁEqˋj$a1K}ȂPE_=b)9]Ht"7x`\|k76ZR)<Ρ~T^-ʫH> -stream -x]K$W@(PUZmçZ jIzFDFdVk4r:TPI}$*z>IŸ =}L(%" B9楧\$8Tb$ 6hI,:rXQyoTdƂ~Y~ڥHFY;oo_A/յ贝4F)~GGoOߊ{\Kn:У,vښeۗ>eY&H1­Y{lWih[׶1fU3ng|u;SJ͝?CjZ?=N>$%ׁ ?M~0}ʣFQWz^idZkYKc}a_i\'s*3P3ۤxtj,81)r?iX1ZE8Hae]r 8iTDVʆ9j#hKҰ3y}fI`όV֟B"#Z!"$:o=&Xh5~gȬȺa''$62sаU9ۍ]T9;VǨ7Nབtb4ߤ[/EK !/9_rRN\$8-y&qrIaPgrŅ?wQݜ$zY!_kgk4G]N; ָ(6k\q -M)JRZ|g(qslfJ#914ԻSNݦUK܃laBOPu pVA(h d?5: |fLҶգC[C]01Mm^q_7W1;=IJ:\ƐFn% `Mvȱ#%&᝝i ]SrhUF ?'Y͡gi[sid zɃoHW4=qjưO(݅sy׏=hcxh& -x:y=Ym¤|5̖{JVqJ=I-u͹{*"KJT -fV`&ZAZ 4}-|~$GUHF_n%`NAk(qM=@ rurl<2dw\s.XQ5uK*KY -=cg32kPחB*\}6!4;Ҭo΍3 s1^,2gzzN9|g` ^69 ->i#_V"Va6rGSZ3*clZ.*;{{&tKhC !@mq}"|?d¨!l\*J͍ h@oU;nfu}yNpA nЫ+Cּ]|Ɇh d؞ 'xR+S-}(1~f\ac_.u]N*sw}?QڮN+۷ZO~ՉR%٨^"Dٕ:VUktGZE-8cư8B045aS\ʙ\FGKx1!}&S{ze>hxTމJw>'3D*4_ywO78\y"i=)$6< btל~3Ny/>1\PQ5٧[aZ,̌)9,Ċ;@1NnUEߏI+5˰ȥ^,^)2&EP.2mBRqhGP:6t$|\c-ͪ >^ؙEԋbRS:< FUZKSU>̬c}F_%!u%4ԕqJUe vGԕȧѕ2#(z"5s=CBv:WJWq,M{UǞ( i tisAY"7aüY"7a -,FL(@?>%)¼w"m:9qw _lX1@$I -zہ^9˜]8 -6]ɏtr 6:3L#8cͽJ2.MD՞rvh(ը cKY2LPq t& ` ?NV$}*Vu7RGSXMM+֛8exAMϩ 3lq1|cn4&ت*5&$.YdIFqڡҒ~,"5{.x3t<^_cH{Qv:·|Rw4tyiSԜ<i-'@&A-;cKvH֧ڥ܁됏4a1MO2128rm,>|.g&hH0,3W-K[rUR"kzdNX%^|3_IeXԱ^\*ߒ;?F+" Si mEMnPQ&߯?iXse"U-{DM #H?_*RWߦ_~xi1,qh[gpG t߁,b48-eDtbbO Km$>G1Dj2嘼Bmh8%ANrN+WWn[\U1 #@k>t%WRfl:"WSk -u[{tj佁: PTqMzAY @:N0 8@w A -B^ZN>[n˥YI{.IK?afIi76ǧWї5 h]<& 3 -78BW0fPX"EXs6X5@ -db)Ѿ- GGRD'Nq_FBf\zyL;7/%ϿW YRIC@F2 &oj>9DL6NrFjGqԶŗt[2)T١sۃhT(83 j܀-ieeH*E.:Եl\xRD(:8b'DV o44\4齒f$CIM080x=4`)ptVr!Z1D&4r gtڎgA,I =^& r1ˏ6N8y82C,HH p/(La EqE~dZq!56S%?Yi8°Md{YP֥[lݦM0 %(P--  7eHӐr,ŷ@G\BU"zB,KILJ|HkhB˝#FQoiQS|쟱\N,si CL'ea%T -R~2L\hM elm!;4H`8@*@=0-1T> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145 546.75 436.49365 555.75] /Subtype /Link /Type /Annot>> -endobj -138 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [144.99997 323.80008 530.38281 332.80008] /Subtype /Link /Type /Annot>> -endobj -139 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [144.99997 313.00009 250.38962 322.00009] /Subtype /Link /Type /Annot>> -endobj -140 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [474.6767 381.80081 481.35199 387.05081] /Subtype /Link /Type /Annot>> -endobj -141 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [474.6767 365.90082 481.35199 371.15082] /Subtype /Link /Type /Annot>> -endobj -142 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [137 668.29999 240.59229 677.29999] /Subtype /Link /Type /Annot>> -endobj -143 0 obj -<> -stream -x=]|\jҩJڳ|%wq=8yXVf%Y?͞rUce3C &I2b48z (JIZ5=yKF=}b1jzO8~x1%)ƴMed1q 0e>ֽNp;,ԃ X# i&2:P.d)Pz@gBY=M:"°<nxU\#3V Q37jZ@P?gw 9@TPI * ee6+"(G$f&&($% -o;FF(N~|wҐ1>6`Xͬ1 ݨy2?SUQD:yҾG<~0A rM6d:PwI*sY@N :;e`)0~ P%Ҕ{?cCă?A%|H[ʁߠZ9h& 85QWPT?R)䡳9r$A}Ц** ɫ|+WwOf~(XAH#d gh񄪫޼{C&|CSiN{: @pv@+ nn}ϻ #/OX"S -]CaJ 1 .UO2ή%))FNw/қ#<4D*L@pun QCLaWHE '> TMtePZ2 "ǡ¹ gV X0Gi~uPe9o!^Yj=> Tt 埾|NmO&bAsvl9h$O+`jI!߿~z;q_{Jy܀rWwwoo電GWB0raPIthHk>}~]aTF'# ]!3 -cPz Q)h@*כ~N%YbHE{l_2>TC놴zM5WjFX}D?B" !-.LdB9OKZ0]NƲkTS#ИK`Ҁc)X4`^Ĵz\72.нX?O_aByGi^&~X՗ s-kuOPdB忛w8)"y{xa^b!=,KWKC_OŁu*JbLa.Kz7~Slէ0=8C -.% ɀr%L.nѿrOd- NR-koNmע Nc\YtҚIA@ gm[%?{X=dwog L9.gB$1lAױLVʹLV3tLRf8gۍE]l1vpGxFF3u=[H68Ohn'ԉE  \yy.d}Z0?IS~N [TYv`@wtUWtca(l`z O듞dZ=F.;܍8|xϒnk&0Nuf5=jm\}Abis>uV2e]×uW䶬7ZFn'fե$Wn'5lbcUi>OV\p7{/OНûBSg2_̘~=mƵkUJIVwV@OWH_c IXɈBot& r體ks.vY+s.9Eɪ^u+ l Ԕԟ{IuFgD@/9O -j`֟70?@"`nަwC}{x-$[L q0Q|5s8;x\_}_wݞ}BO|w|rk]K ѻ74=;8:=߸`zS/^$`+9W-1**erxuaףRGj*w0>+ -n> y|&ҏ@î ܍1 v\9.=M.v s2ұFәr<QLnNgi"wA@rjљ)xd*6;nD yHT<]|ȬwQjo&GNW -M9U!ެZ'o+xB+O&]bk{='>i^rq~}/RKʮ%Cm[5Q!hxw8yɋ-,ޯ(-Q_mckO7L=Aoۼ%ݒ1c<힌η"ny>V M9)|#+T2s@T  >,V7Pw-kPv0w kAރ#Jm+m>\̴%-?؇cf{3|muk~8'`v!R=} /$*0S5Lpֱ 2SMg.M[ E'uhv*0HXӀo%*M>ҲĝHۄ>KY -nh8Tgܔ?o݌? |.%Rg?XC/uOXzO5piJ:nð=e ,Ըޤìȇy- -33uj*t>WiJEiK:+NmTK8= -tIw(@zW,yZq6Q]i]ѓ=%{Z iճE ?H$S5}+6a6Uѩ*Dr%aY0:$=h stb"=&<"ʘ9@E3.t`}D1gp=e&Y곊lC׎C>}ZGf 1G(4S)+3B)}N#(pTu5$|ǯW< ->2ۮԋt̋fM-}i ,h$ *.|y߲_[G::Ott:3fX|'en%tBR7%l6L>k2ݥsxxRjoAZ@*ӂ$ CsmnB$GtO#O+_[gue5ltY@FtzM7Ax/s̮9]Ho4U_\;C5qQTkݼWH^lJ7, !ci|~ht!-GOitOVJ^] m'On{@d<ـG288rLs'L:d`c2̤ ~*2}^; X)3tX!= 4kK*$uz_|"c}ESnPjo S,_0vflVC% -F\ד:ψxZϧ -!c``#)qčcý)y]ՓEtҎ%g벞zl6b"#܍C)α#S~gJyF`F09xW-,w@QYNév~H5AIyp :el7RA\9+OVhQ!|66vR%Ut\@ɃH-^;p.1IpFbiez7 } -{!ga=k!QT 2/^ߢ'*kSC~FWH1ZЧVfPaI^ q;ܡ{dMy@x^ p(HaA* tpD 4-=h*LIhIyrqgО r -1pcbx9 eoTk9`mYܛWGL1a̔[lZM% oK0p&,XGR'08 - -7r*\xt:tKz0 ۸Qt8ίX$0LnK?ϵBۙPF8ZZ/ g棗5 &񥎋a^洤i;F!,IU<^;> -stream -x=ˎ$q - toffCeØ67|UMz]Z&Id2#/L0?n%`3gLaҦ?3--e Rb" -Hu7AVMs.+pգ[&3y ^̤7'0bRot@$FrCy=q⢲ -\TgQxQ -XT84Ik%44?wߐߊR0zrV0O*.O+97<j`fŏN`J!17aC AF@MwZDRiFb8¬1rrPn5To=bEXk h*NW)'&S[VNxD]% _#6-̆ܦl:>_Q VW9R9LWGf]ְAaQK`F}y Ey?J FseD#hY{6)/6-{I;'mc3^KX}RN0+E:4?ŤIbW?`'alODMnhe“ˌL 3y7~jx^7Ĕ -"c~Uqxe$.=6p7EjD[Q 5M &3>!_4B,pQr&="rg{~8ԗPѶ}g_f:ۗ/O~;q; o*o˿Fmg&Mt&C&a[/SCr:/8Zt! 84H&c/g cs)M-m<ۦq7$EhIbgqpl1j9}dl);<)>)Gq@w7W2} S0"Sq(tx-xE;i-ޛn] ,iez[zQGGCR;;v'?;- eGjynZw\LSNIYK=d57rzPz*'?1:O/xa(mf& [>pDhB1CPx(dC3tPc5Ȩ {.Xqk4R@!`@v}`A*0hX{Y8ܙ~0i[8y&uDde^ЪXLkq1=Pbz@߼SwkzlPD@;6OB(BӤ -u6+)nje|B7j3hdDRx -~"d?g@b;aZxP&&D"g6A)4{d,~/$li^&ٳB(Ԭ'q wcd~ {cmbu2fH[z - -DOh jg.m[གn:&@!']hL  0̿T4.1#`qYL -Oe] ulq(^2VHQ# ꯦ1 ycj<-^EkM5(W75UQdQ~+=RPC{oh xUʷf5׿N>UjW)o3$1Z~ - -$R};e}@Z&-Vz -W-|9MYy.ʭȍ<]phLrxِBie;5!lVՙVv´!NV8fZ1y1jǴcþis2pƴULjL+;`ZahZ7i<¡NVv9V8oZٶiӦ2pδCNVv̴¾i}sӴΘV8bZy -4pM+;oZaǴӦM+;oZQk Dim.V؍ZVxLZ1QkmZDz̴…ikZΨV}gڛV7jV3jV'jIQv;r)}#"Ƽc"Ƽ#"ƼC"׵y"Fȵ5\oݹc -\+£"וyDC -wDc -wGXum^uh^u`^um^!ke^ak Dyy<>#g`3}F"oXG> 1Wux#p St*%'DMi:it=F"/'^YOZa瀫:nÎhɶòmshϳ +[gC- x4:"\x8#<_p?_p?_p?_p?_p -/|o^=xVjk݃xt5Qưhr( Kؽ{ؽɏ[ؽrsݳN~\ubCcj?c#gw^#NO?A?A?A?A?A?A|}$------3nz~ư>cg a/Űi/Dbe^EF^cb^ZG!U o]+7b؉j9rEǝ6f-#TvW쮸s6?X̗VV4,Z;pf5ƅ2j(VvWka4F̀*]-F@mws[@kl1vZ]bewŭ]alՄ5v`w#Ruג{tvU:&N RKR!)5Z:R-cNFÔu]7eO_'nlSTٜCY_?N-"Zf})^45]UU^ĚbC\ٗŕIuf*=3;+BveADRtJoz.o>?W䃮/WUJ&Z/+_o7CX3Jۧzm6di' -$:o2H|uUnoi<ù 3b&g&t0 TZ<>`kr.[a'`ij;}']g5య‡e2*B T~TiKH}\ZE`3|1Z -o]UeMCdϕޫ.PVu}NC-ì1p(.;( ~}y57BjP)-w}wh% ɟeA= ¾Q5ʻc"EGq!3:O:^F1Ӣ6(#OjnC^>B~t^NV5ڔnn +|h \|p fzbߌ)(qA1?gi>@pр'p8~,+G+8V04x"~BGY3XEмȪ~Ekkrj4U%<$XN#HC= hzOjin29%@.d 5-]-,ӽozNG~<8Ϻj!ܮZ}6U- z"Zj10ocU -mL - Kc'ɗ,?*:D - - -:+tL![{8aiSFzA9PG)969S?VdMJh9$-uJ8[c|JU]lWFF%i5eeSg˜,VLb0Ayg]RLڈ*Y_ SqpJ5dO:,dt"JJ1 -P չ 'yJ:Y:?B!bu}Bg1)zS ѝ^U2dU[:M᝽D(hutO -V@E߁>Wc4fA-Pc僆l - f 4 poMC>e!>H!0Rc_3tF+${1W@ -NfÀͭz/p9V4'z>e(\#Hб@}jj&H\$=U )XAv*#3PĹsP1[VsG>nUwW]NTN+]+JLP3$ XU Tr`U:w;ϝNs' HGO-E -?d&fM} :!` A|6ҕ vIy4/XҎ}oZpbF@=-}tͰ -.!4a{Kq߰q<'M7s js#X\( Z"{X9#\t mѹ&Z[qPp_F#%@v;}an;~S*TEps }{?U&@r-B|ލ5*:c6%FH!eur=}AZV8:->Q.G[dN`nLcBJE0Wƥb;|Vs]0Ӎ]CZ{4^cg&zHgza+c^vwL^"tY,_R[9hs1PhuJ -.krڹ> c^Α1@O$ ^,l$ ksba1#'28j2>~f^%[gH90sv4 ^Ҽqզ̩Lfou3=X4Y {}f*sgX6sl}yDKVʔ|6iӧn;jdJ*+QsWJl80Qj0/e[l ]JW^"Y%K43ax3=H6bt~-:h JpATj*[{~MIsMWY҈![iբmEMJN_SVuݵ}Kr=06Um/T,~m'4mp}m9tlÇ>WY5}boH/pC'lRuUx$gb夹n}(ǣT%EMAAV,7X~**#1{jΠ\e=M*5/었{[wHR\\fE&֦6>lo}_9\8__1j欁 oS29%T1k# XDӽ)wɎx,sa^}3j5B2l?ite Ev)/L[ȭI%dơ7+Pqod'*c糱xͼA]S߃%Fd7[2; ;[wz#])ki$h| AzBIsm.gsbJ20A HROR Sf'jnE 1a| -BW= 铺~hU>gj"+u| >Jpe ! & dz`HoKg|Ƨ<O7_LҾ"uɸ0EMHI)h~}elG[c!C$j*H%!BV8!7g.oVV@iGJbPzJ >OS07"5_jFLPQY8q!t=wkJ:3i+"$8|!lբiN%RiehPťrdkЮ7E3bFlu3//1qWUƆjp1OEF 2d}ی'~ ёj"yL[ZhO>\oQ:Ѕ4"oPh۪Avkp\O -#VԢ&H#Z|Kv{[D@z?A*^PgZszt=QT[&(x5y )bvE -Ld"KԜX] 3Y*Za:[HsUͿYU97Ďg CP@Y1Hs?7/O =1T1)^ڜ6C./2[HJ>S+:esi^tDcwBj,Rx",DqkiUINTc%%N - ړJ4" abexCVoޘ ./ӏ%%$hՎDRTU6I# 34ށ tEbi1  -f7>F2/2U 'K!b D BP8A(7?f]b# !Sh|ӧ2rDn$ȏ$Yzg~Cht\4, j-hW9ߞs7ູgTjKH?PL ZS^- -`ۡZ\a y"B\/h% MF?|NSW3E0"B(tS-nlhwAG-:@h gDb=%k+I/Hk Z;;n*BDz -W<!8ysiBFB[lZ֕Xd:<(鍫I t'^<`!.siҚ(j? rD^mo+m{?f0KdqCsLè_{M}ZHUj=W_7_)Μick--޲a^Yr6-lXr,l4\܆ĬےN/+ ^$7mVCmUuם+~jz/?Q -endstream -endobj -147 0 obj -7696 -endobj -148 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145 467.50003 436.49365 476.50003] /Subtype /Link /Type /Annot>> -endobj -149 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [430.53674 557.55078 433.87439 562.80078] /Subtype /Link /Type /Annot>> -endobj -150 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [504.7034 557.55078 508.04105 562.80078] /Subtype /Link /Type /Annot>> -endobj -151 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [137 583.89996 240.59229 592.89996] /Subtype /Link /Type /Annot>> -endobj -152 0 obj -<> -stream -x]msq>b>RZd_R -(x9NHNRe萢N|>` pWq١e.z~z{{ r>JSK$ w  9,^s#XɒYpK4#^ /*}@~Y 0*\Vur }B=SQ@ ,Lj1;rj˄[4q|M\=XGWkul -o6*WvetœlŸ^3\cOh{NP=^>ASE´dE>[ikeetcMcbL@?`(XRf[UHו@SLgDo -pᒝz0b"R74-6{. _N#%:G|N7c?1J_bN_V_Hh-E5`;؝`x!+z B` f*)@ *7$!+<?I1G5T(JE_vl'ncg.DoBEIWt_GO ' 9p˄ F{.D̟Aiez*$v-_^!?S0 /s8$x - - ]䞾D5w1IpU/P_zHx5p*p>'zӕBFyeNP+ކ&e $ W -?D:s6<Q3:AY(] - -+ 쵄Vw>(`}%t)RÇ HFk_ǑFEaEZCqߍSykl2>Crj-on&12^*=lodقV峃"p%[)I<[&1t\iؐBU"H8fa`pv gw߽`t:<'pΡq@t2Z>^Pu۷o\GԷ߄/𻂳kB} 8 O7y{gA~ŝ=A$2)*03F`=Wxz)8#`X\BY%G`(2 Uh#|Atj"](/0f "$jZ"4TABkY #ZP>b {׀W i]H^u7__IxwIak8w`LwPO획 F@)啒`zXdwCg?{wB8D(1ǿ5!okV }{J[ :6*=|>93n앸.ݠ:<+[gb:2]˯$fN՚4û<)Psw 4iVcf0p?~mz)n9npm~sMv}nӅ*nsf5n+n FnӓY0u++66-l;6]l'@q>T6IUݦ m6])@ -ajۘ}nnӃ*njtۜYtl|{Q;C7MWqqíBx@*MűAycJ-lPĠȶ6 (n~q$.}l3lpncMcy. ` 16{%츦TQ6=vb'=7kyD08 Rlh,Y@1|1 cg ZcS,Xnu /g#[Iry$ V=IO*C z . 8z?.} =(8?KCGM9?{+8ԞE- -L`ٜR H䚖nW4|3#&_d6}b ({=z\[otQ֣w>=z=?J? 3CHom+Ԯ kҨ' PéyХt:OF -%7H6gGIS,rP{-3 - X7wGf"-kn 8٥u>Nq#S]s'CمKX cᄫhߕͮ<[e%!oA<,lP`!0[Pzp3>!rȶ6 (v.Υzx%o!ug0.E?yc ]çA1WRmDav#u:"B[ؘVL9f_wh4(F (*l(qe;Nqmݡt=J7t.{S&v:Aak4(zND;5-xhv`f05b_?h4 ݂K JP.JqRA%{zp rs<C@ tbN7o{.];NWZ V*>z_^|Oɐ}pc#~HS ߯ -®IA\ְ Rr{ -|V%Ü᫱m\ڰkW h!O@Ǒm _;W4M }ՠ? -9~{fuzބdH `N4sI/d,T8 -{g_v}wg<3[I; _8pBx|GAoi齷kT=T|œ[ftz/`˲"AK}y{|pj/܀qr;9uQj[z}#~[ ȌR_&xǠ$]fp7 Xltf4i AkYyfDB'w+]˩yPlQgKao` h2Z0JwGNqt&gF}gD&&a"N H2m9Pa7[ԱFF/6͋ʨ:[e_>|[/VgNp&oBI Ulڗ~C:{U_j`z ?WZKJ#O#V8?~mH?~ԕMIF/w(0>{)_RB˝%?.Y}~dK)M-m&Y^jI*$EsG|S~yv7ŝ 駼x\jO߿-/|{d,'Ӑ) fI;. w#5tq|aMn~~͘g g݄ӹT,­>9 - 'L'Lw1-+'EgvUgf BfU^6Lzj|D'ɍ7{/e-K€G6]pq#+kk &oA-8In3'Ai+Ig$F('dUPI:yBN'{gdzLVA;aޣP~}:~p+M}"+Mo%`'[i,Ӭ| R -Z=.C8kyINp^c^ [: '47^S\kbI{c4⛗ pY@;䚉i񺐽%W)eWqg";J!u\MdD9>ԑB o1f =+0q8x|>!3qM8˾OP+qTyE΋2Y:/>yɰteCe/gdqMc]sTXX\Dɱ^7Rg.wU¹"|X7]T~`lPBv`n{X=&3:+ }zguU?x`xu -uP'@u:u..'V9Iw::r/aL5[Vo6twt'(|uB$IثSvyĥ X{n}pyW]\-ǧE8ōJ]~78g^]ٿ) coqO[|UV}LJ+H>$Pp`L4E+|HrRƞ<>9(Op@ -/)` )KH<*qd$R(C5ojD9.p._M% - +V=5.^eq51:}x'^_ yFΆ -I3$nk%k p᧤J+WJ5Qx"yh(c?ƂWGyh :B> - 1!Tu64fZ6oCibm)=>-JgURV7njR+2LZ<ZOiVV9KrZ,ҕuY䧮 GV2OJJ#S+Vzlj%JLZ1wmK)zmKj%R+ݜZJVr0ͩItKj%kR+ݔZɪJקV.ͩ3jVrĨZJ7V:թ9jVrԨZR+]ZJWVruZѣYj%ǏZ'f:KYj%GZgNO+95q=57#6p -G#W|\G#׿5'S8^Gup)ѓB8#<%*|THa×vGfWVb`mx a] }ԓw+q5cr,MyAQinOf5 \ìE@60o<0۽ao<"xEwsӞ@Pc9=_!xKybĮϷǟo?=9e&G/>q8\bچ$K?^dɖgk,Y y@y ȮY #Y>I'q7I6H61]dH,dIF|d&&EbyHY$'%Gdl$gIt$֌F0ΧwFXl"#oHv*#Y>K|6'r=Q-HVNM:M6~kFifO#Y+;I6H6N9aLlΦ(CݟňX';o};.ª -GXɦqeJ x|m  kרf[5uW6hnV Ӎ[,ӋH2DweoХRԳFq(|\`-ӖjP2l6SMA'|M:6g0J䄌"-uHR'4w06OƒILU'/ =f|$ ev/A'aC\@%œBブw '!\0dႥZ tna(pQK!+Y%Zf0.*eb9h7pb!.Jӥ8xGü jH  1daѠ7{*79v]͘$`hR*h;< =I!)zPp{t{:ȇ<\rF(bV`KN-PJ8A5S7ZDpXHRɤ7m~k1!YԲM˼I8ٸP{驰AyKCg9 UoTK I(6ZK VbpL@6_HQ3n|j6Q6 }!, AEKka"D*h>Ԅ>6)8<=+SJǕRXTf#jB!ᱍdǮL aFCn +Gn 2)Z~D*ZZnt49Ӫ'$7F2y[8pb#%"s2T@6i|t;8hXn?| qZ Cb0KJW;xUͱ+ Q+lb! E=P&HL*p1:2^@с2ϐ\Lr"> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145.00003 327.14999 436.49368 336.14999] /Subtype /Link /Type /Annot>> -endobj -155 0 obj -<> -stream -x]K丑Wl e- |0|Y1Z⿿|Rl4L~)1`<(~ t ?a0:`f8 - Ө5r:\6 ϫG3M O9M$_+|BYE`Y!L^~z%i`f oJ#T LjhǁZZ2'}J -JV -_Oh%^(iw=&Mf~T7~g3O>0L߆?Ry1 I7+P9p55T@ȭNn-$<#ʈVamFٹ8E>L)yCӻ@Y;8|-]`zkj1k xuq·N`NjT}|gwyK&Gpwp&V%id-|{&Pw}8GI ^qu';}8G+<$Wuu'wԅwf'xfI8K|$<ƠoECKcə`"mWLdZEi\Yi}ea7NI,}KqU* ,tGqq̨>}|Fe eưsV)bEnbMb?5u3]fYC[f#Qg#W3Ѧ~IC:.ő}6 ( YSH6n(C~BQHk/^>BДdKSߏdΉ^[7US gϳ8$}>ذ~V=̜l:,̻ӃM˿Zz/'M3>/^&wNlܬ]^ɗ쩕S&,5 ~9ij]7]q6Vvϳڹ鰑!⼺Hs84}O'>O{OOѧrK[uy4Og/}Q}z[mP( Z7uNI>6.{wGeI.k]aAoOnK\;˻:M!N5ɦ7Qd٠Y~\̶;-wf۲`gM]+ϑBG~OP:|dr_oI~/|ɦ"u(.?j-9yj^">1)Kv VhD 4TI7khYrh;/n˷Cf\w*XpF7˗ Tn,q7KÃnjfyf,Y/[,Ypãnucnnn6x%]7(ᖃvfnlsf7K6a%͒Mnvff7;ludf7;sdqdYf,Yr#nlpCn,17Kf%͒nvflv%َ%{Ylv͒GY4_f,9V,lfl'ϣlףم9m䌌upFۺZr,Zr8m]-9Vц> e3reWF{eWF{esuaM.T<,#.|@lRjF0Ly2`k2=+98#eACrc`b@h)-_G{'>R,;bҮ9OG(҉j -sMtԀfM>w@N -hhrB@ӝ; 9tBM3w@4r(cMghs`@ӝ; 36@rT}]S]`EK.H)t] 9<}ޙP?<}޺@rpɡ $Lw2 $GHO7.2}޸@rxqb)sHN>ϳS)]p͡_s5~͡_s9-Qfp;.mNrvsMr[Fvwه$Nk .9:ǻa}vn'~n'uv;]6v -?b ]pY< t{2+ý2+ݖ.FXd#BL/2$ujVzOT*GLdAOF 8Kl:(Ħ3C]з>Ch* tqٖXnxaWU.HN2dFk\st%[n ih<3+7v,cpEwKo [ A -K CDl82Js? - 6hQK7~6 fxF%FHTM߯O$fbe"&0 -e z<:^ -#<I'_Xߞ) - ? wᙳzƥqP~K,glg<IO$\L~}'O[@j6dg5(o`wTFJ/ԥKmo$-gcN^+} M &1g;L/wJ M'T<z^նxNszv' -F)i;lj I{RWQ+H) iD83OAו:k7x^&بtХjb+5g/Nk۲b"fiHCè-3"ېz.atN}{t@1/Fæ#` א)aD[o lsfUf&339 cA#p}g&+7y;xXL/xVS;.::%z;:h0؞mG0B#y5[HYx{gVyn./h:5waAÆ= 64iN6D8!uv&_cqnn؈>rNFY h @':S8af -mA׆J$n0J6p BaS'0F*QNQ4B ֶd&UeT90im6EG*;ssVZK 2'4ղRyd^<~U8' q\ *’K>ZУj}8tTzőuw>Y 2ZJVEVZX{|68eXOX0SD'5w_m?~ZU^:ڻ{=Liql 1q,sswk\C?ylEHG&5LaNQz/1\vqylf84l5l&ӧCgO;O>P~7[-QdؔaNBͱ:|: w|e<^#bMxqw2q-mʫsU͑C7Pmዊ 9TTEO9,( g|5Mú& -kʴa'8E![N0+|[AZ )/)*[V_׬1Tw>WPsI %=O2EȚڥu[:N -F25Z̭*u15e1pHcku-qUA4fNy -Z׀Y&[W! =JgFdx(Ok^jnl[IN[ׄ^H;(.ķ͕n r] ~ՄG5!^KV83KWR&VMv P)~ @ bgu櫜CoRUlP}uCH֫~.(k'ҩ0WF0b 9L!4L5"q'P+b츔bhUZ:jaOG3*ȬϨ?"mC gTԬ*f+I3Zdma}ErUij;`ܿL +5R6R|F$̉w% vmĭD'*0^ vH%vH44:P_^߸7'ޕldV[fËTDoב|4vz;R۰']zBH b򙏓&& wEDQ+,ACE)\D68דlTo n{ES -Z:AK;hN)U,ž/|Aq!l%a6δ㜁I=\?&otG&D+!bn7~r0D 6D$'C"!Є8k ݾCc:< c 6?"34qp!Pq腈@8tBD!""v0 &D$Cġ"C!Іh؜^C8.n=Dz!*qqĠ07p4L켝XxCab f+L+L+L+L"9oFwn*^*^*^*^*B&BŸ2GsŪl%NaZ/qMj JD1`HNw[E_Slx1[W-\Xchz$fZ2z=a:4{Kf[Lс<8hv\q힄_؀ 8ד/iޒjI2E1 @ k`@٥v6.H!̴ ʴ1#IY+*/iT!$iB޺/1c`omJ 2qb[!^$߳AYgTȝrX !S#<U0zĩ -z$3ۯ}3$3pK~{Mu>sN;&R6WYeH28 Ȑ$tWK*U`;1̞+O{/pKx'BN -=JkqeK7|$ 5p}!$BA5f[ACy̸{ݞs@gAn H%QJk -ZI%~3Եf3%Lq*9նbMaN.hyq FGHފ0(7y(ZIge<ꋜCW[dϑd۪nIJs> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [137 583.89996 240.59229 592.89996] /Subtype /Link /Type /Annot>> -endobj -158 0 obj -<> -stream -x][s6r~Q5QFe9؎73uoߓ?]mX!n0JAߒ_P5R |೥S3p{HPqra}Ao/ 2_eʅ{ $ۆk)O Ċ񳊟c*V6QѤoccYh`2e|?쁞&#//EL2)j ]lX+#^oyQ67E?z/M,$]Eb[q.٧.u͒*GWAS=xZfzyd4{Y4s$Y?S;S%cx:ƚ{72()r -'Eb˵YCMAQ1(m`}}^p5hbdRd8_THq4*ȧdSnQ"FuM zS̛~Q"ZZj$z#\@Jp Mbvh.}rUuIBx?I(XA$UVg&1?1Ṛ8U7RUP"uF!Fm{6Kjwv\cbe>Cso Vodu]f`4}ҹzb2Y2u8].JQ7TFNƜҎqNG)f̼kg099g1,q6)Uې17Ţy 24bتL*3تUjiJ֑SuGEHU7]ɏqL_(v-dm؃i -d`N Ԗ:h+"| ?A r9(?:h߿?(;0;T߿7cn% ;wDB4,s7 Tu)M?$?@ZfS%|ϰR.db`$\B i [jUO,qj$V0 'cPĪ ְP(h_( -Eu2g " yp#w|זrY7E΅ڀƒSX*|V2Ew[@ Ι܌ k#e Е%Ua0S & DJ%:p`ļoKsޜAhf߾rxAk+hVFpaU Fuz\:$Xr>1.qb uS-`;35L@߇Y@<) -jrw'Dbw 0n?!Vr(cNJK0&IL-sBzM2^~W@Y eXVP\.Z?/ S Pwi+WXsh_((} Spz7z>`I ܠwO7w03xZ])&`p0sӷg$U&Yt_n@C2(&5_:ė=p[1ؠ헢C u;%2tVĺG<]|U?wC  @SG5qtBnHn>\oɲzI tmH/;T>_/Qe50PP̪{lXI^?~9r1`Jm >bfPdlI29뺱ݟo>˻krts=tnڵl[+O6iJ@yD ]-ҏ-1I Y Mb(nj3B3:ߚc.JnWrM"zs $!-6[p̀,UjCDmBH}__w焘ݯ' $Ʌ0֮w?R3| `B^܀ą&FQĈZ|;bϫR&d=$|`EmvR -J" H -P%rfZmjY  ү2mi$7Y_SnO3 Yfc#Jܔ -ʫYcT*`-QԠEjq2,Rs'Q)ld.mV>K7e>`P0]\"*I->lZCa28kOŇ&NPy>4USc,/bFDri7`4 0ť1c)m @Ä5B(GlFm>,"^\ : }c(0M%,t9prͪv帝YJ_TЫ%Pτ)%/µ_kMD\%Wr**ۂIL%׊M(s}̠ ݫRĴQ2CףUԯO&, > Lk@ڸ0JlYߝ-u"f4X0ـF 1&F߯iFZ!g8q{t_|ۯ-= 0Y8Eh[NW l9Uh E2P@U6;Q*9 a`dqx S|d T}xxOtr܈< Ooo"@rc's;!7`X?٩*_%q}-Y|5lHŴQ#L*n@i,f^Xʶd1m׃7w{Se=D.. 솮zCJNAq`H&əbZB`ނsL"glJ6mO3#٠6U2@?F^ɗj=wOXs.LD -| 1=O.o'].?nf㙭 vǺAU[vL&q + TgxyS^-A;YK:Y3S:Nɝu:Y'w0iktwb=^~9;V &]a \vOE++Yb?~W2|-u{gU9Tf|@Y Z$c,ĩ_n؄tXNfZ&fI3H0.@qxCj,fA}- *و;j3;(Bm@s$ $McFc6/sa6aqj8e +4kq-0?\Y}k!`7;ǖ/M%/E (eC 7(fBlJFQ C&y#\kG}#ښgmMNaܪgr#VlAY`E#s +(ɝlJfE%{m -BͬhV0!٭E;SKb+@YDɬx]S -+Z(Qv{hVjD#eXQ :f%V412+6,YVP -+֣+{Ah4vo3T%`Ai~$! -@46D!m70# ?{U+&ـds~ah棝[Jk;㣉[,RԚJ|"Xi%ڪ4H+؂ڨ1"6@,дVd0c,,sQ [U_YX*v jU ;ޝg|~޾~Jw= eY6ۯhlNq۽]^/w 'k\oIx-@@"|ܿN/DWU+xUƿ`g/zvSGI 274f9s8r0Zd938Q6uGg&SqBkW_[)K>g|` v9@:$+x9.kKTCwBǃfS!]ȝჱvB#G] 控"ohPš0h)&`{<0 W~@exfs-M 5Ts vleH=F p PJ[*Kj*.âo<+Mvǘs ϱ2c=Z"T!ł+h/N -N3_]A0\jh!fi vd߅! -G!t]LT!mD7Kl}VGAFw -qBD}@|E .'U 0]Dҵk +\S+Qqҁ;\ra0j 3;ߝā0&Z+t}D=uhq^0 GuДwǐ% ;?0F?x\\Ԅ½S TUUe͞ȃ ?`aJ;@=C|}q f  3?HOA qU*@&WWAnLYt8Saߠ8L:ADSfK A8U}5T xB.)SjC{|'}̟AdJ!T9xl\ID!E1͢ћJmxma0k/}P 0 S_Uc _4ܨЎ*è# hX*C]:}h;#ul Y& ._q.G_RDBS2p -I -īpO]|\kQ-J5v+%B_Q @!W}wUSuBb΃U}p_ &r.LbU2T} +m -'U "H'ã,̺-/K]Ϯu2NcKk p>9Zsa~ yXeO '3}| | '.48P&w|[6eS`PWpJ3 =5#H#'OKo!nƷ,eNnvgZ<ۑI'☊gJflѥ>W,fdj=پkTT#C& -endstream -endobj -159 0 obj -5922 -endobj -160 0 obj -[163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R] -endobj -161 0 obj -<> -stream -x=M츍w -hDz$K3@n<`AN],x_]e$qWb$EQ$}=?arp rkCRrtM' v[4ɦg##`8Шv6f߆? ~Ӵx Y5iR^i2  qߒCҺur2vg`b 6Җ 3Lc= * ^f,{1\[ *S>^y=$7nYθ,VÛ@yM8U" 1e@"8wc_C$_c'R'l!o"z>/̨ C[|6I-^aM7cRD[` -@-Ed`( | (.MwMG#p ;I2AXYfȖ,kK#K) r^^0dYeqH,[i߲K5M#5QÈ -e]LLt}%!{ >w& C' $eIk-YFȎHQ^E=G48B9 SGpE(`y裛F0EXerՅ[nQqSN_t.R$`0pK= ԎPKPH:d&ǧmz"6¬9[ku -w5iŁWpF4srݟ*b](Y(mGTZ*Qy]eMteYe*dYV/[l-pXDžE[p - ; -Ǘ X["lh#^ywlr"Jj&۹3sg;c]3:r+l];]0 ArZ1m@}}WSU-VE\?a梺Eݝ:33szMP\p*•!b+X re>qj4DmS"Sdkm5u[]qVhѭ9vS33J~;{Ԕvs蕧2[W8XjK/W0ܫ6nެI|3MvsY79]2P˲Ԗe|w,m2u^ۥF y^7D߂:xXN ( - xO-°ߪa_۲|5"]&khRIjָa}9}&m\ oT}_yW앿<K(N%oSG|̴]Pߗ< Q&ѤE!}~&tp יt ;>AdS!2\ckhf|m7$y*yb4m<8Ps0xbBO{)pcrBzp U2F.ۭvrģ,sqj^FHVTqxxY&eN>4fz k~SOʰ`<Œԣ_o)@}v)st)JnZp5@tQI% qdA=ZQ?p_jx". [Ơg<r`8Ah̄$!KҊ"l*R( -iƉ~pvg= 4N,O"-f&)j׍gb|Ob3 xjâsl9naSw2u yZuYe FMP 9C6O aszl1=H\?R':jtCΣ(L8o;z \v ŭUZ[4I}ҵ2sgO.xȮ ;(ОCvq%2lqlry*j`γM[¦d3wX-rrgԼfqvMF37+g&۵O[bx ze~9Au{y} +Ϳϋ&ܷ*}챡^a!꟭1،ֵsh,/˲|h3[-7?c+ LѱM-HKofUbX4z^CVfJ2g?:_WΨ_\O }'^BR{_^ w>`.. ' z\r6oZ]^bW[Z.rwpE< -XӪ).ET6Xmv?j`(NPT%<0Cʹk_wHw̉`R(@z/jtHBq?Ȱ+\R_+1\ -||B 7YLRV9ӊpZF+PcdCJKor0WT)K[j1%邶_PFlGϺLez\`[LsJK"rFr9/wev;" &1-`+ )sj#xY3X Hgpk~{K]ƻ - dZ q) C7 g5@},n㞟 (^s)i^׶dl1F,#C=.Hd@0qFmWە cܛ f0q%5 W97ez0|'3<3sls45&Y|VJQM=^)'p*ApxZaAH_[T_b*wa\zd|iѯ\ _ctUJ \QKFWuay7)/~GaoS`x?ĠmJ Tg`>ȠQEgYY>^JTυa xSjM5|\x0})L\yT.OM_OϟUXՁ(3*@eNЙ*PۅkO0m0۶-Vj?gY}=Ų KgC-KUW*Q$8C甘4WVQd%{Punاc{<[-gy˳Y,oy<[-gy˳Y,oy<[-gy˳Y,oy<[-gy˳Y,oy<[-gy˳Y,oy<[-gy˳Y,oy<[-gy˳Y,oy<[-1[Ve,"DzVZΣ^&p]+_OOܶ2ckJ-ÕcgK-05xH~/|[kS(酅 㢉 -+;:tdkaT -E>0%( 4ϡag{gЉXn,dϴn#/nྀ\0v TTDQJ?B(^GȉPM!I(L"ZXHS8efID?3?D,By#zr]eŤ -} lř/Ĉ ,LviL{;Әocmݴb?j >إ/q%fLSl+$>JVt-)͓WbѤ`$B! -k>} -'6&6ZLxuų -~s8I\s4c>S&_W}lpaCعȣ~b}UqC7"R9ؒ+An09q/M;ir_vR^փ44ڤQ7F[l`u*v2.Zv٥ly -@d9ށ%H zk%,<8Q|hwxŚoj<"1`X9fk!r\#y1F,,WoS5y?p8'bFc, $I* #{$SfaYH| /0 6%=3̈́a NLX^\9:+.jꐽ MGlS$ɄtwICa/yD=|(1~k-JY9bEui} FD88yI*g5i(sC*- -Se1%,jxp%/b3Z$'[it[p^J|;9g[F%9hjS!aa[aϋ2Ud^KmHkS\ 6AA9P%I 0 {3#IV-k$Dv E!=)/(5m o)G[L j ^ -e5d]AX]dFFJ,5#鵲hجB% FW: ! QiڈWnbG& 3/cQ`DcbKL $ Ք%U(n D99lb<斠 -3>ё<CBHaI%Nʨ`P -rQQRW.*4Dl1:h.C`=a$ "}p!00@GLmX.3M[dHPy5J5K1Gam vR@3bҳּ[jȂ{(l|PVH #^P`'̄!bIKL- {`D0bzQG "<:nb 3QbCA 1XGy++SD[4 uB)YA2ՓѴ6dRa0]&XUzBx_=0OD|@6U%M -A#,',~Fs;-on -؀/X%,-}&(24frk]n#5O>ϠXyM߁ '-ii$ؖ=cX)Ѿ2*3#h4_U,b- {1GuA,OFV:[=($jg" pB̅t5cu9{Rb6!?>TvvcظTQ:[[B~S3N[YQN?h4!Pn;AZo V{)N%] T_VtӠe{.nBvPQwJj`4-k &m3<$ru0\8exJ-w<䃅b]uWg\w~Ћ^X?aQ?!& -endstream -endobj -162 0 obj -7915 -endobj -163 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145 578.54999 436.49365 587.54999] /Subtype /Link /Type /Annot>> -endobj -164 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145.00003 263.85001 530.38281 272.85001] /Subtype /Link /Type /Annot>> -endobj -165 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145.00003 253.05002 250.38968 262.05002] /Subtype /Link /Type /Annot>> -endobj -166 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [319.28677 321.85071 322.62442 327.10071] /Subtype /Link /Type /Annot>> -endobj -167 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [418.17566 321.85071 421.51331 327.10071] /Subtype /Link /Type /Annot>> -endobj -168 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [319.28677 305.95071 322.62442 311.20071] /Subtype /Link /Type /Annot>> -endobj -169 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [420.40076 305.95071 423.7384 311.20071] /Subtype /Link /Type /Annot>> -endobj -170 0 obj -<> - /Border [0 0 0] /M (D:20180430025315-08'00') /Rect - [519.28961 305.95071 522.62726 311.20071] /Subtype /Link /Type /Annot>> -endobj -171 0 obj -<> -stream -x][ܶ~ǯ(g;Αf-nه8h$OG%9V&&&gYMWPSvA(=M2NCJIZ5<{A9וꆑ191 ->5=u p|jx!qG&Jdc kq*S?_^Eȝd81h*` cJAH5T878[?oQgSRKQdb/@ٗ@(lLhN=3U+*r~Wp"m%I/2ʅ^ ` -*3羒qƂ=%\%5DpQ&?Eh5X\'UR>K?[hAEPB -ߋ }%XƠPox- -D¹E" {! _R6tKY`RDOYYɂ hB 1:3X#z)j)X& D!0pM_d UNWDG<_g>t > IR_gzgmFUW@$~`8} -

ݽ}0> s -ϦInmGA()w7 dͻZu#p_F!+N5 v }reϩI&׫!,Ӂ.C&X}6կ` %Y@Ⴣ<9HԲ!MJԴQT;ك1;__{~Zȳ"ImRn,0lS3MAK#W3(:UǝuКmV؂&$9%JZJ |⫗A/߾F7#C -v;'.tC {(Y1{~:p|V -^}I}&-m 5CЪ dNЬfҎEj(0(]v@0秛FF ˆ-jEvpڊ.66a!Y@qʝYfA_3,k߽ېZ㦬 _X1s++*EsVtQXʊ&JfYEXDɬ؎qX?-Z9ab\aEgFNr,; H<Mx7ZyC+Wb.TfZF˛մQ YJۃEd5 (r`RK~fYqc_Td$jic=8Z{ҨDR3Nv䃚6JYj()d略DcV"H1SOWU4F|=h(ϵМn{\{Fz%3)Vm^j,vcH+IM%e5mRF1+Qob9=pbKgn%F;@V#D!@Y|%켲ȷQb:@ƕ71RFJ+5lћ(9d(oW6JY+o%TԠT*Eӊύ6]8 5Y1b;pZ Hzp#k.Oֳ3ͷ0Z7c6rQ*8 -#Uq`Aiܱj(Lhvq_$Y@lg%Y@o>)9| z-[D+lF[gK-eFlF҆-|W\_W꛳R5b >VOUWZ['pmmLK"p-mKW Z؂E{ZdG -e tWuEnu6 -}FD*2}$-l;}IuXkn-M–nu2[.Q-m̖n4q4A [aϴ_UZl[gKm-m̖KbK-mS/Y6m/H*m8Jc55$] Տx&+[҃K(kcqwOWxr s7w/۫G -x.nFAo-wP}ɿl*u KEԃqRQ`^O(8:c傸@vY^]']}Vw*uaVIښ`` Uէ $?~Qk6hjuxjB*MTUPz{M8QNTX֐E sȉ:uƣ5KVVa2ZU&j"wCV6VU՗&Vr/)#10ݧ"ֺӴG[ԞYuG库*m*|vke){}d̅p\`ĐNG^ljޕjue'2-$NUˋn|t& -S -Õ5o|~HgW)^lia4.^c^wh|gYKrޝUy)`i\^ݻiO^Z~e4fcNZ m)8Пevo"o?ҏoo^W x#V4LոVۖkx=@?~>]Io?};*] X$ViԨ@?0r6',,h~Bu\薾/wY޾i9=a- X5) tOcdxXE=} -/Twdk<4#R1jCŀ0A~hr/;G0q&.t:a?zł FXniϧ16YAI7.ry{W٬$S#5UwqQ%{q6%s%>KȲt.k\*6-k[-z1gʺrv5n핳u{,hvuwkvKuvuvkWCߊ9l@G+:̡H|0򂝞.?›sq%%qSkh]ppji' 6c.ڈPNӖǜ2ׄggNUf&^&n+8czlK%onb ݑ9ڳˆ|h*i Ӟp aO<G(8N-x+mX1JS^X)3g-Y9XƟ;G3tzfNlȼYd|Hۜm׮s肃ʿ;LJv1.vl:#c"K.%ʳHnl6i4Ձmon18bce3DRěC|0r-/ˈq?yЕ 0|+^ȉkۅԥFZ*/^=#?*&E%t+` -YB;iф_&d^inKu!?%{cT̼Wz`+.3iB,,kh3+GnKO $,emtmپA];yc2m7~qVFc}c1ʾe&-!er× @Sq~6إ3)!Tw94>GMFɾH>x:~H@ ]>32(5fj?䠼|.$7XU$YƂ%||GsR%2 .M>1OƣBJio@ƽ%+F;VKz5GD$௦0{+!7EFfm"M3 wh:U6$_Q~ǵ"Yr$M:~~Z=|wH8&R_W=x(9V79s!x[ 1#+s&jkƳ +}O&њJR/%/$':eVM}Y ۄ1s_faeuVq[/$Gִ|atF[7XmZϽV C*At9ZϵM6Iw/zS&=MIt%i1IKNs!E9(%I^$M.9͑|yiMsTYBu~$I\hc`,Y|0KiTiWӽp>N{R9oKE+ٱ -uOV8 -3[<uC8@-)YoCNPA^&⯗T=4qM?Q3crYEHw9]NFgdKz?n\pҦ M̒%M3Y3&mff̪_\h1s`.?vvC& jrGU&\Qy&=LGU⣣gu穚שn?rV9E_өnjrNYF&uR5YH^\HBNU׬L:\W:—U#.pz2}Ы~U?^krC+<{pG٘,/00000NzlXdBR=[F LP!i=T.OauHS`n% Fi"$__j¼ي%ͥ! k```^"2POg*2cAq劤. -kbPytRkONRi Od9yi*aqeCSX^ ;+}<7N(wˡ:i#)b03K+aqisϤ 7K~^iH>yJTj'-9>*fV,ʴqhJXJ\ #H6_9ں׎-Zvq`+?uP7Iy|@CX^*#Tʫ[u*4vkwU#69|PERޢ{MMߝ5ؤI1hD\彭PWBkT:"(|&7P鯴`E6 -舕m+f]fP0ޑ$/^%SYi٭f)~iz`#":EX˟ʻtKE1*&zR X=4NNRȸ700#˺i3ԍovexh*k5q=_<YGcqJfVn"Txڸbߑf|+ '/f!+ - ՐCFqytwIuMwI*T-BE.Mopxf7t SlJl9!㾡k7`Vhܔɫ6/a7:ɊC$q?Ӊ\Jops tq8nKkĭe#)$ oqد -4 U^B- !_/ W+I]pAtI|D >+ 4[ ذF=dpT 4Xzv/fxR*(;H_Pnp#W;?NڗKO#ͻ)"؅.q#0a䢒PV;j"_=Zĥd(Q(d;>0(#c #hls]WRzW꣩*Zmx6,ldW0/Úl2_9]|`+a]aHkpM&",i-h_D0d* uQB3M{`wNZN- ->ŽsE`O e*@p -~3$҈rr ݦ5D=] y;dxk sZ& | BIॺj-0 3:d~2tHxQpC`$#>qdlӊBLjca1ig`=HYƟWaHb:=hnj2ZrI4sc:8yQH1_6/Z6~Dΐ -ө;(f \B(Nq8 Ԙa(٣ğa0&&/SbW8 ,q 4ү=jEBm*H>{LHHpls"PPxԆ"TUfQIb fMJ'IhAXdUs 7!`5/ {&g@wF;H{7dqg -.$(荇 7^S^ p'3liXz#V= G!Hb8MKkV؁1Po6w2A=nI}Yv{l Ath,tЂoԆ7s *]>9596 O/0z -D!*oRdC娛pZרxTf .ί %6 YɎcg\*=Sqm+@f:&E7#.w ɟ~9%>KBn1kVZjZuu]Vy5[e -W-={;06rγ4 -#)\L-H:; (>&;xAqb'\s)PC)DS-ٕ\𯽒:(gZG@iĿ?WDys\<%eL[a* –h"4']Ɏ}$/.-}> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [144.99997 562.90002 436.49362 571.90002] /Subtype /Link /Type /Annot>> -endobj -174 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [144.99997 126.3999 248.59225 135.3999] /Subtype /Link /Type /Annot>> -endobj -175 0 obj -<> -stream -x]Ɏ:rWpm e5 -]z0@ӕ(xWR0pB{M"`RV<?L?fr䭆%C2,K54aQ/&p"qx ?dDdD8("4L,/2o΅?a68j>hP%~'l&]_wŔlo!K5 zY ZZ 2V0zߠ=kZ>P)WJݩ&RGCΕ=vҗjjKZY+<԰:5ҫKVi`qYJ-X{OèQZ6jOO"'Kņm[RĿ^ޅ6|*nVz9KWcږOޱ/ӄ⿋q*Ţ -=B$&'Z_j_vɺɱDVaqlvx wNj䪲|߰!|zUWXiץ\%*%f<}qžwU)\WT{Lʪ̯i=wuk=zJkwHyLEoUAX9\ŷ?UWſU*ސTuFBh?lERE -$I߉ƶ{?#5s$@?4*y!VŀsyG@B?* T2Z -YSF`Mh:!5@, eR5 \.c%AuUC2JS*&8FSF_SRͦX]LZ! t~ImD^7Ǣ6V%@`"өф_4zj^ LH'OˋP|?+Cֱ _#֣:J<})QI'M%3[?8!7uV^D@X: FiwR䢰x4_5781 ]Zֶ $^2kyy/CbO;:*Ã"۰)m 寂 injk G6Ҁu(島3:8sfX3@@oc؜ßkm44kŃ"ؽ @SMDFLij FM[YX Z0f] rlD^jTiSFE캠 vFam&/~vXW Jb`@bNtچ >69Z20LWw'ɴҸ4#+GV|IS8]?'7_NӸ:#+GVS8S82™b -@LU0'ȧp>"KS8qH'\옒y><2m$rFWUz;jM] @v<@nwꡟM(KpZBL>߲C3g!Fa#켽=y2xT$˘5f'V4MZo,3H8|̾O^1n89<~HT:2M6>H|}̇լ|(#Jc6<}UBu8MAZ/ZrmI|a٢ Y-Zַ~IaK&-#,V ;gw)@UU[T67,h5oGm褶,/>ԟ%JvZ1iHO1.JN~9*̮7X3 i~)T -.(_9*j[jX>W&S=̛y(=gy -I -Vܓ&?L(/1b!_?,uO18"U:3ma(r{jB{)tJIckyhyBV )5'g_Г]~uȊ;C==v\iN}5mA>7]>kfl{ub}XoJΔ~]eWu_{#.l}ua.Յ_х < sAshG}BIH^KWn^__ktGzz c;$8i8=<a2}6uv/^e]BA1c)9jzI;Lr8`NB Aoc0vYde9L[=eԉ:yK'Q xGf#ʈxWmYXQPgm}0 2laPMlic`(̃J*e ->?iLӋZcy=Qi8Pd-᰺$dG=lF$ -8̣Tq<نeYQ˜r=#S.DqUȵ" j-172{J}TZ1{%-Nq]0عl'breޚڝԅr_qɣk䔾Úk M)&' ,&ڔi֣M($-Ж?ک Vf-rh -b#b_φ*]X#tǞ6k9СN[?b]֤պiayi]xpԦJ#hMX۪쟠_݉1?~Ԗ }~2-|O%A)Sv9lOD ;{ -eg tR6)9\QjSIv}+Zvق,!#NOl\8G:Lv_WvNgg>[ܩ-gYLJJ=2P9չmWntDګuC%W"s#9=.U"A2Vi5 @\m9cqM !5 ,"EX -}muHOd. KpL;Y^GXJ2+o]g:_1|9 KС_z.Q*c z3fyaiJm4r5Pf䆍i䂝 >I"465 Z:򃶚竅F{ L6j3 /)h0 :e:g~+F<(ã!`(<;٩wֶ|`8 -6f"+N^坧ӱHSz(Zx3{ތİ>+F(6r -2|mſs $挎ttc}$GY^QL((YҺQω _E='Jp Ex%K$%@r^Ѽ-$<$<YWkS杧fN#fK{шDW(j\mPgmL$ 5< $XWiS3|t A@|lq VS+T*Jyr2sj2hJB!94|GK>:]Ij$tq'ɪY2PYNn3ϧpf1âaE,cpuV Δ"뒠딠!A-שt A>. :$∠y. :#袏C?AEmM'袃G5tE A.tA$ANtAAz!AN~pQ\!buSA.i]tJChtt|&AߏСDAz %p' p.g ":#袃CZL>"袃9.::\ †i.:#袃).::s5I$]t@.I$]tBIg^aS$*:\&buppﯢy~WH*:\%]!b%~Y$jť@"@p?8uS$ins lD్ }|'\eL<@%ps |y as&=h8ZG >U*|fb °K˙;䈑MolaF >U*<3O{ ukXsx"99tv4#lDqOQSR0xZj+` G˹y>'fehO}1y -\\j5UO{ܣGP1Cr\Ş{GRt?+[{~ʮʲFkΤJKj5*̺qJm΋?ŵOӦJ5ʾZev.mP̲mZ~waC(u(')3'3,+M*HrJ.D^Z/]fiºOQG]-#17@F±yJTE+r"tmP.8z[8yp,9@6e ŦHK{1DKV\ѐ_x16EtRsb i̻yz3Ħ`y)Py!PF-Pm;g_1iOoȱ!ρ:FN)}@":OmǦ` :liEYiq;9bۿKb9Ge`Qsh(P>^&8E>ON~r0i0Y籲!,n4 >M.[sep ? . .pq[E4 ".I\qm׉%.pڦEA\CCkp@\q]A\qNA\qA\茸$.6u+EN\H5"v \".ԝ'.bU"F\D茸ph3E4~pȆ#爋&.K\)Et8A\Dqsĥ{sdI" #/␼i" %/]wu%/☼9" &/.pt9rKϪ #/ݫ.pt- -$/␼%r|SyWUF^W]y]ukcΑU%/Iҳ'KϪ #/}.pҳ'KϪ "/=.p": #/A^Z.p4W]yi=h{wh?Z}'ù\}s8O`xW_)%vT/p<\}7kؕmcgW_6W_^^rۘ~Ҷ1ݽmL6vn;C`^^0rkkkkkkkkkkkk_(dpDғ [}_|;WӨK=WjTw߹*r*$s>'99/Y8CkҖ趮+_얣x"ҏ4Rh28X k$&EkJ5[qˑ4|Hn\ z+qq'њg5sx"ş. jUa`~9蓧fa#=Zݸ#FݐỈYOk`q6(\OlT2vX= @5%p֔l p<^C=%72h82GWk}T.1FkJ)9doӚhxIe\:&vo=@5eJ6Kb]KabIeI'٥?N~~%O 7j;)MB`ܞx=InF˞LzbIPã 핔ՓAQ2(evӌ5}#/87wQ D;wWL6FԳcOPtp6 M~LƄg%k7;aAfs9AhnjGշOߍ=L|b6o|{}kB&6;3 JW͉bߤK/Mʗ.V_;gw?ݷ؋I7XtM`B:^*'J&F2QzJUNШ),s'jZn,$Åk^=kڒ&0ب/uS;^ &%4 % n~'[W}gn f>߂8@B+~mQ49w/v.&pe Npɑ -'@z,cvF_mv.wUz1 -ye['xS;yMAKN79â b*)? 4Jlb{ e&Dλnɩ|n'0##!|-252QŌpj߰"_#j&J^t+BYc#GH&4,~[L_m]Z+?Zig,M_ђzIJi3ۤ#4ђHq6 £N$%e%({Ӵ58K4W҆oP=,-hM׋R}#+ 2ſ!1ՠùѾRuTbl4քiX \h-d ~DvD-fc&U3QbHU ?Ecn{́^5"RRꛕѮ2ڙHiNWK`^ԬEuX)g)G=QK:(## BJyI?%UL$@NRB[}&˸|GΣG*Qrgwo^?7VPFQvo2& !7=q?ߡaj,Y(i% OzhԞ_]jL~Oeً=nﯓyM~lJ)Lydd9 WĩW %39&<ǫ}g{Ȟ\Vl]DIQ\ |tsT놝ݛب<@< -endstream -endobj -176 0 obj -11553 -endobj -177 0 obj -<> -stream -x}m6vw -|n\&ݍɭx4N2-#y9$A6ݳuնD98x<AD|8ӔƨYLNJ$|ÕOz}epes -%|{p2K2d7C( Eb4WľĐyE#eSS@O?_Tܜc ud z/c=?.(iI/۱iW7b91LJ^._# ?9J4Ww?;-53LQD2JpEJ#O*T.pEKHH):NCpVsB9pFܒ(dg|Ĭ* pc|!IIc&Y\ 0ցyҟ( LcnBr:?* .corc-\*@Eϲ;P؅D`JA)W= -ٗ$ ax'U$U"1 6$lf:13\ۗ4i;y׻i䇠 ecb%j!o:?@%/mbt/P"\no!?e̒ %0 dJY?xun02s`\*c/Ș%Jin`ء\z -sux ݉oX{ub` C-ݰbX鴱*%'yAw w_40}`As~Ўr h[_~r/1+xDFe]Z\zj;8ݩF\ -ήjTn^G{(oһejB rG \]{W` -Hc8T6쎠wGiьCA0 Z>zeb9Xz\ fW+`*%atkw^آpGQɦw3ҝs92T1UoI?w˃AZ>βaI4}|p#s B|{xei8Am٪}B?=/z-+ӧwJc zww&be<oߋ.CB3`%AuDLQ ɓ̴Q> -6Я3=ddX#LƓ0WXH64mÝQz)=&]9) H ^o*?Dnä{ldJjmph75SL'@q}i)pOMW<Ц;cŚȿY`ge'4[DMYH:)-\R1=-~m߄Q3pZ߽-1jC"oBiTheCt*-64Zdfƀ5 Q~PW 0|~d=Ђ -iOyo;uk_.mhR[Pʿ -n RQR\MhmXU\u +l++*CSVl@YbE#b"+(eRXXavV +8eV%VT؀Ċ&FfEV4Q2+NJaE b= -X -$>н\C DДPhȴH&JiY)hZG1mE ??hp~N5j)m*c8mjlEDžf;V#RJ+kc}Қ d[3PH%k,2V!)`r;TX+fE^RQ#_MT/ڥRH#]/2h/6C-M\yJEy|^4RYnR hV,KȼJH7 x9 -mj"kc܌ȋ6V*s𢉕r3^EbY zXyEkmTWE+f(viŲjfF?jib܌ȋ6V*s𢉕r3 hB9U\U#NiS -̀ƁR=lm ԩ1Gu94M>S޲4-Unx?1hКϕd捐S_ARrkySkf32oh7іyF˼9G*4 -on=kZef#>:ede‚{Siڎ՚0XM Oy%jVΞޣ7?z•Dcq?ϟ?= ;.Bl[Ҟ%6\#3% P8~ÔqÔ\76Yww7S/"C>Ub0;j,1Č;ajUw"UtͮUu@ Ɏß|_W/xad$J!p( pOZ;ٸNU$X=)_BeqAu6v >+H+xOx -.=~uЄh#8}s 9i%eQ9 pA*aq^|Kpf/EZwER,&[l>層h\t(\x,O{8Wt`dxZPx_'3Ѐ=`$D|%"1'FI]%Uԃeޗ"H$1kI7N$9%^},}uTLU*i$2owbʄCn#697eO䢔*E`PIdP/, V)Fh/=G#HY NT9"XLYϟXGO˴4e'#2W:.Ԛ*gK=N LtO!-I)5 AL!Z&+dmeIִIm3vXw8dR܌c*R~WbSRRDU)8㮑r()>o5 -b\%Tᴸg@L$PY;cԛ FeE!7kYMJȜ*Дr?jy0_|ոFCS#L8nj]*1J(&MfL`DAns"`kqJ)WhjI:I)1~xɘbHNj\_%T1.}So -@!FJ揫n-ufAg&LJ⹨Q}6[q'V& "jpq mo#ZJD+x3a4}~K"8Ҳbe@˖.]EJJӔdgIT>ZΎ:AH %桂TILUWlɩNzSYϤ|٧/u:)lIElH,&D-gH.r3bjy0Hΐrn3dg@Έ 9T[F>3d "g -9CrF匨 ]!gHS,F>$g -9CBΐurF L !+r>c ]3x9$u3t^ΐ ]389C 9^,Dt3(9CWQrl3t![ ]-gz9CUrl3t!șrY>NE9C31&Gər!zHΐc ]389btl3GgZ9CQά!̚Mά![̚Q!șrY!GəҖ3/-А3I%dAҬi4rI3!g4SCN4rNҽ9$t,i#4Wiy*iVfiK1*r,W"<:,N|F4`#}n R0-5ȉNE4YDMANEԐ,NE4YDANE4YD#A3h"5fM9yDjRcŊBDDDDDDDDӉ֬vTtTty6ty6ty6ty6ty6ty6{R0d~_ӡ!G -/_g~y>G/LN^%zDOCҐ%t.iFc5\&9I~HHHYZI&M$ ;aCI/&&$iuf߮aI&UҰn$i|Pպ*/󆤉$Л1ƑM$ HvVIÆF CM$MNL&' %MNēKI64l"iY% JG&&cI CI4ś\`/iDҰag4l(iIPuK;04:I3fk46$ML,&&S 0ƒV+?~Z?AkH8hUy5)~YNnEžm.B]i0 w>Jqbb_pj6nUǠT¦Dn9/q0Fc3QMSb"E(heJyvyY/;8C<"(\>72Qٯ2O[Ψ?Pl5d~۟ўVxNVƹ+3I޷0W*B<[ҼMv ]sonDlޤoYD|tTֈߔ} ӯY~Wt m2 Nͅ>qsl -&%$0fO᏾|Z#opKs&z M!!PmBQGXFS6!/=Td\Y -j jo@R*4TcmOB4h.&!LS?.T|s1E L8 -9xn7%cA%\Aw$ކ+E>x{_x,t5Ak'p0t8?Vl047,K o ? -2:%| wEkнh WsHȎV?+^@"Ҩ#pOxgx1UІ{a.vbptzsKvm"V|Tqg7(FHWIxD匇y'cU U3%xa{/F% QgTW4ퟮeWac[{ - ^L#V)(/o]!¸#)i 6jafYSX $ͱ݃&Zym`EU1Sy tLU!m>DKE! Vm!W!c:whd#??^J·жhha(czxB -ձbLV2l`1!R}g5/`LgiLʧ0>8Ҧ\@#@dwj|MJ9 n: O Ӈ}xUql|r4vQ8J$e&dn~9{=ޔY9œv_Sl? -endstream -endobj -178 0 obj -9985 -endobj -179 0 obj -<> - /Border [0 0 0] /M (D:20180430025313-08'00') /Rect - [145 668.29999 436.49365 677.29999] /Subtype /Link /Type /Annot>> -endobj -180 0 obj -<> - /Border [0 0 0] /M (D:20180430025314-08'00') /Rect - [145.00003 363.25 248.59232 372.25] /Subtype /Link /Type /Annot>> -endobj -181 0 obj -<> -stream -x]M丑ǯy/Qt7𩼶aT_oD0%)STbǛ=.W% C|JT?+FBB4CeLyTq&sV;o?^*erC!F5W?>{݌?)юr>.~G:%~Տ?"5EEI}QQ T`P\1,{'q]1DŽITvDH9_/JJ"5%GԑFԏ8\ -E-ll\fE粜ǣ'[4J:3əy<Mk縳Ny66_ZW礸V59HuG٤.@Ϯ汱MILg"5'/ENQ}#>:_rnvΩ΋@{7 e6`?,]֐r^T0tppumxCܨ^1mԾ;'OWEE&pcr4CR&(إ9pӠE8MNJ9ya1"&m۴9nQFYe&9xIV#}RE΋c/ӥ23Ay [f139YY!Mxwx4` kNJ=}5gx&go2m6I`_Hy̿$pTXӿԤ;9>5~?yNϘIq+Lmv3 lomYy:>y3U4}~&a5N;NB~Hb*f;tw2!\Ak]`-E.BfU]jaWYRr0є0cשf((j4.ݰ남$' dG>@)AHZ B3tusn[ؕQߙKN% [3\cH7HҪACW˻#_%+҉y Ў4vdKSuaT8\h#d 26N m IC`aE+ij/ B(fgoiS /H#f{ٲ% -ڐ9 -*PG\.mL:捼Y 5v7vf*cJ͠j׀PJu r] +zNeL}Êq."/ً }F B4ÎvLHmnٰ_u@_h{m5zX@FA]A\ʚjȽɣ.NMpJ}$-vF`S-s]siUKk&Wd76lXʯƑzc!m,X:M qj&fZ7yƘv@`A`]$"$6 ȌX-io.YW?Zp)ʺ{ˠY˸72]M&fRjFePh@ -ԡvׅN/ᐐ)͑Ҩ,̆n;E4+644.})&F2 pc)AqsUE]Y_+@Kq/rl% Oq/4,#5vԱPdB]h{n&k ]dep`}0mpp,,t%+Jf{J{\[UD-:dҫhY6H՝}B6ձ+c;S=[UbFv}-㸒 -TwVƑAh|\~ٰfcB؎BTR{\[U$5r˦ KK -!jc+Wv(D񅎍]-m4/+*kKb8,w6ښ~ۮzvū'Yʇ]ݵ4.խrGJʒ (^@Z^7b%_ˋ-Gng)Yv^6v M\mpqQ&.G>⢎YK\.qbnx#.jCE".qQ#.0qE%.p'qQ I\u=E .qQ I\wu}E .qQ G\u=A\q3Em8E\Ԛ9⢮&.X5} "/a ȋF^arp5ysE &/+'jN.pl rk&/v]$yY9zN $/.p\#]zΒ%/ALC / |y'ծ |yue{N :sw]$yuSec> -&/]8K^V.pv]4yu3ʮ 6|lccƞ={>6{ll]zG ̕x\ف3f{N8C`v`4YI-g ̍?z,w`̍G LI`'y'y'y'y^8 -m5 )"A_ZnP_uHh_Z>[Z~DWbD`(4fLkr2$}u7fR4ښ)kX!R.fQGٗigv}4Ќb}&ޯ@*'zKV6 <[|d@xM_^K-2`bk)Z`!Ó^ָyЁOUk {VZb6yZG -Yh͒ ҤO R| ;WW R, zgeγeuy+#,8`ْJ>n^EVټlq|Mf-peeȜ$-0;#D8قqՕ<!^,bUݟ*ʴoNOˉ|#k8GpT~9[OmK|.O}L=td7/4c賜,[zvE\E U>{φ6la+xGR[;AGʁ`ScXNZ,_f$'O-#@xȎ6Uˍo9E/@[GBj"!%Ј/,GkѺ17!C -+re^k27<'.M\9?0NФ?;<#\DXSCw"ݬԅ7|%fR`r h|NIzދ\ 2.aCq1.5gnll\w -L[b4ßpQN6\yZ|\=H5ӨS-32Zݱ?<g<5#NhDh~#;2B˯-2GjD8-26?5Y48bKhQz&w9h=ɢ)||d@M-WD\ƤkLL7|s~W$?'dEMIFwφ%K qҁ:D 6hPzˎ@G" g);Lˮ!\@z\w򲝱;VbѠ޶?_0ܤ%b4RCXMƎLl]B]Pkpb+?Nn Ƚ,>>Vp>fUKyn>[%-> -stream -x}[ܸ;~KsNs${<`TRJ%=;II&zv (7pVmNn~Y4LU}vdAw7(tak5%הϏհ,R9\STr,3feNIc.>x9)1(ߓMH|`XP˺"Om'雷lǪU2_߼rK}5%::].= ?9JkiH7;'PVt)p7GY'TT0z; 1|tsUK1uOL%2f %8L+PJi_@N|vO{&tbs߱;C#6|2n@R" 5F>^?\% ú>:q$ χp!211?A'IKB:A`d5m kЏ'd$iH6M|C[?B6 dv~SG5~Di~sT) Zl HéIM"kR@j ^H҄_-@ 9>ҟrWߢ"m$.q}5)C>><`/`K7%+ sjM\,Y+=5Y%}&&Y&Hf%6A"e$k"Yo>7y2W8u֬Wgd -( J&*zvI1fiq'eM$ O7kkcAja,wlemM,ޣ@@($e;ohcqFV*EmihYOBe&)5])޼d=m'ZLM`ݿ} #?^g\Yi^iGd(홲$U=~DʬB2w?ˤh-Ds䨰) aBUDVZUXS)`lǘPZj , xgV -U06OS1ili&oZ@Ǹz[Sm`j-FvkLb1OR -u\L#Ij v[Pzf`T3t=mTe W~ٺu3LUpb -rSa 2@2T THZyʔpӚ9ˍCA-@hT؂L6Pľ ՔhJl҆DRAקq1~`KUM) hMRp)1Jrg*Jrnx1SPuf~+Zle4Y45ȹf Pلܕ-B 0  w^.2ȄJU -[ЂȰg mL}*&)L %;vk٢%Wl1خU5h-[pܗMB-@ŠlTQw*U JlZD eJ2%eDPb ЪwS1v]'9T -U˜m0 e=30Ri AgNK;7IOjlַMX7]}wav. ^i-dB;sjx׫n:ι -9y':T*$Ӊ+o}O_Q!#*\mti -J2ȼ~`շKդWh!=A9~bi%'k42?yCi!80 *':8#7_iC4}ǤպVXҰ?^k ͝?4Ž[$]:SU;+4ۡZJP⛡K*,ʕY -:y~j0{pj`δjC4ivLV s{\vM|K܈"Cj r5*}-81!EJ_c[khiuΛ+u9<$*S\ۓ98<&>S޲8!;N*5 -푾y{xOOef=sExyRĀ=솼#L]}3*>~7}F͏_1q#,*KـN)&8--GnYnj AC?,Ppvh(-@5 k:urN>e3r5Y>D'I[__5;{ -#q6NX#f28j=nբg*doh,[dE3@g]z8C #pzqQ4a:8PLXi6aeU^M#j>xXc;@H\6zaЫOg C7&ҍղi8D|p] >) 5H6F5"i~+ʴzf`dd=mKmAÙBzpg6>P1f3ÌD޳ג9sB.04a&6A2s6,1 33ML-0@63]df5.FZFiJ-0KhjlAYF&Sc_f*j` -565Nfejpd_%jTDHEj4a25eF Pc P~;7e! JB)7,qReM̍}т)=΍e6 7W>W)WO}|s5 ?3f^MUwv6y'Yx' -)L|&>?e|,\_7X=J~]e!8#8Y´CS)&ܙYz^ٜIV*x£"P5]npAO-a1Om ն<ybԴ4N@GVӥ-u0v)^V:]J(OǛxQ:x-EtQ6V^Mtԩ摣sflUz@gWg Xϱ~UɾI]TwǶCގ] -ceW6ڤA3Tx/^%&xA@IN|?qjJj5P#&&aME^~_3. -Mg4 Ylf/f3~?3"MPކhOˆڰraP#}sWCTUR]%o5ktUT\"9$YPmflP=ꇳUm6(ZuV3tiH&xdax1Ѱüo&ʺwvs\gusshs nT݋{z:ڈVycuSP7WOUJӬ~$z*bߦ^=Q5mU`Ӥ2̗2+E\i(yyidX?|ǐ!_βW%sq,h^[u\Hb64;L')vsCfQޖVD\q5 KWgǦڧ -OV'lhtuB.ifk8u:-^yAuvS_tR+sy=g^<wg^n5ѕYcs8Exgfljn<]k\qz' zֹ,tXgHZ$?:e:|!'aHBZ UIUGME_wqCVx9[4o®@֡B=Le;|ӹ obֹhP) T' v"jy;2eH{4T ?naAT (9JDSԁ>XJ3dL$K C.TEP" gWfR*o @X.FB!7'Ui ڀ`*y^=T,\Etːe9"hČ=x2Lr5t>Mr*zEɲ}>e0b-ed/!d][<HNx4nڜHuyTCc%I"9?t+r6бfm2o}#&2Fc_mA,,w 45$S[6k59W {` n/"(ެ.n7k&jf@fXxLq)-IɒrWXkyCR|ܶeXvG1WY@*wr,Ѷ0wV!{k&j]EV -+w[&gI_+K-s=ctD`,݉% rF_ ;+}Ǜ*q*!)?{oAP Ro3lIu]8Fua7SU΃S;#-qO|R5 XVLbY;$)^HR:$=IÆ<ւD -RBUWtOFwh3eIql.R<ጘ3H83 ^H3Ùh@?i8C3tΐ5ጘ3bI8CV3@v3tΐ|9p&8'3QˆL5Y NgBRB3pF -g8!ggh+!; -gȞprprp#p&/dzlc8C' I8Cv3tΐ m3dO8Cgrj8C3p.3p ά!.!Ù53dc8fvl gΐ-̚rB8fvl gpl -gΐm̚rJ8CW3d[8Cׄ3pfyv,'33p 9-Y!3 ,&CiCv4/iА!tiF34l!M*r&XF.!%4\B_&Y~R35h>R ¿*f{[]'/d$٫ȎnKHs+r:&&{wQbO 7Q͚"s{6G5ykS'MQꊉ75J]1V6vޔplWȑ^k^ۛDd^#r$#9^#Nܽ7޵IHvM"GriHvM#Gsm9k{sk#ٻ7]۫;κwdMr_HβW{mmo&Hܿ0 9r#2աa`Cvhlllll/. KHs i.!%4MBק;%+N/x4NrH_u9u9u9u9u9u9u9u9u5\|L9 Rwq7h5xw‹†2ȴߓ1wQGL@oI^Øۿ5\t|ƙ+\,t2g8l8^ΠC(ISy z@)9yz,~H*Q3rȤ5ßdCIX4ﶈ .5~sET',}sVI-}W*M&bzgJ7E:rg :YdLa8.{ K. '1OR }(YPTj`ѳ0 AP/a^5YD|v+aC`NC <)ŋ衈 0HE yhz^}IƃA 5>I>O% NlyA#U|p@Αp+4i3$0a%*Tpy`ukTBIॺ>Vqlߺ39ޅŏm=zTj *4xQpKD$ *ߺ@S(F0,6kz<4hOWahLu}GL2e -i%X*r/AMBl --#pybw!KRI .`B_qkhMB胑c*$f48履/f "h}ЂTW?MN_&v,urЪzw n!D| Zʴԫu:FPtL`>V8[mʺ)2{@}7A`My*)7h=3>·1dؾjD+kSSuYAhTn%#s<$Jx@9YQ9 +m 4 nJ:}$/(V0v5?*rX͟7or諫 \-FOB7%!$>2rZl{Tx^gl.ec(:Hf|A i]a2+GjNBԔfE -endstream -endobj -184 0 obj -9233 -endobj -185 0 obj -<> - /Border [0 0 0] /M (D:20180430025313-08'00') /Rect - [145 224.60004 248.59229 233.60004] /Subtype /Link /Type /Annot>> -endobj -186 0 obj -<> -stream -x=n,9rw~E T: @301 \ `.UY4𺡮d$`ldӯ?1}0=e A^??rقBݲ,zUՏq6@Y7FQߧӟaҬ4wb0#qUB#^긍Y`?ns^yl7q_2.lO?.<ZKZLEM`K#^9qFR|:.8e0 s{Lk,'C³}il - 4}cB鹗1g~=N/Jc҆G3RTV&ĈQeRk}c>if ">.>ߊ=!hiK{9 z/i?*:I \фAlj}'GEWٝ<s>6,|Eq"]*@9:RbXόbAtV+͈e_T-ZGyTA 8)з2HI5HD&M-$9cUU<4?h_.d_DZXp59/WzX(ٖMT&JvOf-ؖ?kcpI)":`fD˜fB D߁]gE;sh} Ӯ ]JI&OMaOgZxi!d69k7d3N7BlvP+rPZ@l&IznW -򴳀+Q'vT/!U/4-,'qر+ @3P%?%ܧ}j^tC R9eTVCeFv qT[,ThFdJD]xT9Ǯ>isWU$rbqjn$^Y-un,] 5[hl峰¡1kNus#Lw0\Pc待C[_ħjOrU;&xbΰ`TaiiKSV;=#yS^PU y]-'g-tiw6F?+иO} - Efzõ(Cl!O*[ /PO+8^ߦ?&)tߧn:0*$1!5>BE(+޹J:29n`Vp o}kQEu蓱|9pRRogf[cIeQP#Tp(IЃ <@/|gTℝܖ6(WctPfm$(с>X.6:#tʠ$8OcZCʉ Ap -\ -]pj2$NbWlXή$9ysTlvlծ٢y|dz&dQ1& 4(Wm;戴 - )PUQ4=Z´=h*0ԩ E'+dD-SJ0vr]CT R@bR)̑>U%YJ3(z5q07kvjcjeʒՇfMjeT+e 7D%?GI:s^AT6(KM(*Yؗ1Ek Йcn&>FT]JQ] i3 ܸk"bAwN}Ӗ[ټYDw';{sFxp+E/ڸd(T=?t}/uM,_'W{xSl 6AK~ \Ш;0Zʲ![04p>X/$\V}ߝTx. -)fa -fkWgE֙ד]6Q߷k l3H$0`B)GXT.XF_vc\n갫ƀiW}qȻ"`M9Ԙ-ʦ=RwmZ]nPe}cdAp* " -]dE$U1x7ln5e^o sfӮvv1{)w:DfJx&4D a ?BOy.A'|ǭInzreD#֖€k""U]1r{WՁppkRA󒓶pzf3[̈́qz/BN2wl NJ.0e}=~|=[Ç'~Ȣb\!4fHiC"*N:t|)Ne讅(CRXnre\1N_W-UqpCq_Wc|8HgjO_WC||\mӧj'>}.6qqpu38ƛÞHcկ V"yp}63*DB -fC[6)peԡϪpPt2G.͎CweScۥs8xvi>Hw!W-,`BgJMP]u@S7xu;t}&_$j|^խ{^ݓSm|sw :S -btҵm}W=>W{S?W;f&CN{ -2&/KZ홖3[S~fos{j*`'T|$-D9SQXmiɺ+?azz6?=l .#/G3ՍJž{%8ƻSr4:1=քz*Yx+ sO/=j^eڐ%/(5S;E >YONlٷ~gÍ3'/k$l3yz6 88oQ2dyeާd̑\-H^9>J`m)(1E$zNU"hn0uD} ;{)&:qpQ:ă{;dQ9ly9ZׄGE/oe*'\ -fy-Z&Z|zrеJJrY 0! PN㭒`!RbNWᵘC{l=X3zzc;Zfp7_Ï$Ns -Ӡt+;F:(0ӵ]MOo }t әѧa&8Ŗ,}24^c-O600:Η|MA8W0: ncK 0N8=dX5Z)6Bߩ+U"]Jrkځ1h ؿ yh둢.By6xR[|6x=.vC4jQdѬyM?vLج@UPIEQ~`ZWR+;^K:Nd=x,WՒZKhò -. 2r=.[@%a?HR`H s ]FZy - !TtBsX^6ؿ&.ʂ`"03SB4(xܳxǒ[ y&w˞xb Y/bY] 魃İh$?jR?ؐBaqV<эY/v92Y4z&Θ[[@B>LЮ"ֆR㖦{? K/X:zo(l^<˪ >J[!%a>9H@mSV5, !8cma7 1hzq~MaȨQ9@qd7מ*cfa|@Q6-huwzGONilJ[nYZ?J1fuZR%@GAZ R2ɻgPGw`I#J+` ^{RE9 - $FUD. ޒh<+F,2GRZLBVEbo0C'-~ݦ( /cSIJzm} E(!.V]3[fuF-ջ|;>wLZOm|ΪUh*ֈ/Jy -endstream -endobj -187 0 obj -5283 -endobj -188 0 obj -<> -stream -x=n8r{~X`v̮"ʙ нOUH)JGvOqbX,֓i}=0=E3m+8;g1?O -7F/sX?x\ůoI_`ؖMHpkkx^=) x͖/r>|xs*f)ZgAOzi LO=㿟;#Nu.qqa?7xSe󷀴6& -ӂ3}=h3 XV`vbzRp,z92fU~{DUígxD~0"qaljtgQrBDT'LӗS7_ LJ5¤0M_"L#`ι c?/RDҧNe kCfi]=Dl8!?u#1Ӹ*9ǣ~xnF]?:l*U -i9Nq$\k~.yܓIJc%S!RW_lO^pb`#0#^ -˧9O'ɣ?~6H33c&F~+Ґ,A>՚b$IȠHY8oƲ 0p2 `?PLg'E!{Y1)H!+3&NxcZK'^bF՟[H2:%lkʓ:m#E&cK:|1ju٬ч^jCs{Gc? }" /ᒥ r+5֔Ap0o:-M(/BQhZOϪfsj.z;цܺNH#D[rI?ήˈEL}`:y-赺T)΍;~Nu$޽͟Y\mt}ϡMooX9hR^Y+R|qҥ[>RVYZF95#y׉ F҄0)I.7J4kM5Q@<%Y@Cm[=fFV@f}#n4e2\^{8Ug34X~CKG/ݎbE24{#>M,(vf<;Ml+YQĮl1eOv%4Qr{Jw/! aN]l(}Eh[i8*}uRy~ެnf fY+ h%6q;YYH+S?y!ۇlN-Nnn3YЗt:ObôQ盫RcN;-Lt= Urބٴ9YFM؞w:'Ëi˙땶Gwhev=5{Kmm4'lŪ~lE&-Vߊ˞mQT<#Q$.ʖde5>@s`1J5HͷOՄܹ]s[j(k¯ňbӖ΋8"*" ϩY.Y| +EslirV̋87Cv &GuI4V|}24u#[Ӻ1Oeس5n\ 9YF/gCꪴKw~3~^As~";;Z0=:}4O|kTWrĦn]\'rfn~ CLAٖ2?T8 gBWo -uD -__uczL&+@17aU=>"E(ejf] -t\XL-3@QDS Da_tav%U&':M{ēSE+qԬ|͇I-Z!S^2BL3Pݯ*!G[m4:%?ŵ5i=@`4(lRP' V4 3\7dS~} -POLJuAjru<2Lj -qȐMܶmj#ČpV52XzWsOT ;x=OJpUH!բߊi^f'DjqRPqߙN][)S%RwUY-8_1Sg>VW.,܈fqVL!](It|8?Jr(AyYij L\>Qw'<;콈_\X|~c>7o}EֳIκOb-=|?ng=Af=!g=Aq>?f>U`O4r'|,|YOhOr}YOYS_y1 a i>17I Pvċ u#[^_nl}~cw:PDt[|#pm}GQuom} UA]u#[=鼺[mR'"~#[~1aJ)ީFH`@$ϝ|M@Ԝ;h"ـh"逨_|@4"h:g8 R :2A]}hyqR1XR!tvYԠ} -:@ 6hYF;WR~]Ӧm^*s^h2M[ feOGֲ&NEKZXnUN!(ov]B$¢;;F`O/_QQ?M4f!nI TՒR~JE<F ,i]P,HZ6x|U.kπ^;"n2^_"_ę߈-_?Q.Ƨ)6ԤiT$$}wMor)bUZ_KacThxɒ,g Oޥ.͙*p9~nIkH}WKs,!)eógZ[\ ;:87|:E˼>Rӳ L;Dn` D5?HFGEZEl~ZB"\V,.v[I/HMg"@7$%dEL-ײ?ߦiD >n Gu~]iׂL"."XAaV /~C̆>pѥӬKБZFJUřX -x!hmEDA? kPU[U,R[D.[|_C"̣ZH:虾f0qdMģ٦l7cZo7Fĭm4AiEe@4Yrv!/PfC⒌ Ʀ'! m2X0I] !1KV)n[y"Si{` BKoyvm$&=Wf l8@*H#d%bR}e67xnˉ^J `@X `D6I1S-IkD9R$F2JmRBI2NroAN3T*5tbYqu5ESC̦V=T[Ko|5Az0k_ntfNG7[MK5[_99ګCC/V4%!͉6$.|ۿw/p KwÛ utWV9"=w~Yʼ]mnXCfyf9G>wd⸊=,2? x -endstream -endobj -189 0 obj -6800 -endobj -190 0 obj -<> - /Border [0 0 0] /M (D:20180430025313-08'00') /Rect - [137 503.50003 333.10596 512.5] /Subtype /Link /Type /Annot>> -endobj -191 0 obj -<> - /Border [0 0 0] /M (D:20180430025313-08'00') /Rect - [491.02362 85.89999 505.76874 92.89999] /Subtype /Link /Type /Annot>> -endobj -192 0 obj -<> - /Border [0 0 0] /M (D:20180430025313-08'00') /Rect - [491.02362 77.49998 533.65253 84.49998] /Subtype /Link /Type /Annot>> -endobj -193 0 obj -<> - /Border [0 0 0] /M (D:20180430025313-08'00') /Rect - [491.02362 69.09999 533.44745 76.09999] /Subtype /Link /Type /Annot>> -endobj -194 0 obj -<> -stream -xڵ{o̽uYD4YdW؊.6all$(iH]a^qH&iV|tmA\fb^Zd:s|VTR!3Oޮ:0tm=z5V/OX:XdEhKG?և`;NS~SDgCxU1*E oۗ~* {=lsS~U⾩ $4mث@NGY8$[D6ZM6Q -O+Il&=#'BωJ -8Ʋ/=W=[YUFQ7RTN"3H2.v`PV!}7;Ts|d3_ N)ɜVSt~}36` ȳyތ,(ٍZ϶)/zdn6G9"K֛%H4$Cg4/ok,a5-&y?uVr2pO˄Jl0f|0! Ja]f(+ x޸CG 1|?~p|t:ņ罍0-ց {he250x mqGͣt,)z=C0PMkjG>(&~\qYzEr7/!3:bXIYpgqOŴ IpkN9gzĪR%'/ +a7gI>ZNn'J% k,^y[C!'jԩf5Ca pm#Gc9+o75_h< XA&'dž=ev5ϣNl &i; )Zm)@ԴOȃT ` ;`o+Os~Ae52 <؍db^- e!j|`rHo-ۚ*\KphEԐ@ݳ/Vњ\3W4oѦdP>c۵G4ҏXLh߮Y{7ch-քRc~ټ.qBc"d랾y>NH&9[p֞;~Bk[Ud5-DGAzJPEq]o$(f}(p8e{HPV¹E?m FVhw܀^E k¡/5X޵~T!}3IѷFXlϏ;1sXBr& օOa6=xJF}}Sج2Nop/~E8N-b*>s eӄoRnQhČŌu`wWzӜ9Ejz9꺦LO߾6io' G5uROg ,|}?M#H%hih9,;SOHtKBWNYػ յ Vj6 ]hƍ$:5>Vc[nLbnN3ϬgDptSKOWKhT^˷V>xT8}^,mt A/Сv[(|c?dX_;I>n!Ghf; g \RBA˫]c+A0PV^L@DuU O!H|N #F'GL&-9Qؤ<ԲR!mFkGAP zJMU p'+{ȵAuaݞj(>,UR*} :4K͸0zxFZGÄI D? wДb8SM)*=,U&W鐱`E -4WdZNǎW`ngĮ@\XΈC=q+&mĂm4b痤xvqq$q1M[;#V{tňS2io5fS_fT<}(0e0r\vn}Zp**`4! ^lӹuTu~~O_64MLѤ?h4zhh4y4,(M%<(h⧌f!nvh}3uFh LF&vF상Sф<>/'?t{i6i#SO{ Nl…% GSpOpP ]ȱr};f8ܼ3fp 34! bz"vye4X,X B[3=M` |lAЇd%Qq7;$wm+G1kq7,I P ,pqX!CMMqte -U35P1C]XshfSUscK3Ei[BflV,+;zK/g(uĐ`HH_f`4^ -i7>ob!tFy<5!׶ -dVNIA`M'ixI:h[|9ܩI rlc/@<W*cZ=xM`Uj[-w?~~l-؍t e2!.勵NBߋ_M> -stream -x\IoWl1/ @F|s" 8F 0|Ul-z,YplAb/֋8~ߎ~lXizfi 9~hp0Kߍ6 -u2A)ori~z|a6ɨd'y̓њq\?& -b.Т&O9G"vJÿD5\] 8II/2t)˛ HR(zMtuLfe҆˧6 W(W5AA"A+a =7_("㋊q 7]ABR^h9k5KGPXik!:747M3C -Ȍb1n3AtMK![26?)y0ԸkE~SVh&Ϸ#+~wNM̟r* ?Wk[dKF6+Seot"^ktzQk(Ӆb3.ϸk%o,U1x0}Y/ U^6gH,+]"}+ɬ #-e?ll!ݙ_p]E6nۮ5k7?:g=A~lni39xs6x㮌kHÂ:EcZiZ8wQw ADd<o[|@;V} 5JؽװsL|mM/s#ԋ=E_ot6GΧ(۲oOWe*#X}^h?o ۞ĵzyFf,{m7-} %w{^o&ܮ粯˼Nqʂ0jN8g0f?`eSEg jLSU욪jhGoGe?y7=eRrk wptk< +ThƝ|RƯתkLeS+#0}6H?zr-_FǓwzTʕ џ|W)DM;g4W?YLڃ&-HN2Fb>J'O'c *F {GL $-fm'x^Q#0M'!|h&My.M'H\y z -87!p BhlOhC]cO'-L I0#-ܧBҁn$7YHThq A< jQsSG=CpvWnRBH4qReIw$8ਨKj^MP2Ly݆UBUHYJ1i >Ԋ'_Ou0G΋+=R(p&60;sԢ{ ){pі -\ MN$$4YY^KHJ,0s(_h0=\rZ gRTrxaI(d\&, -$Y* -UPF38zJY5RB[w@a{ڰU% B20Ma-s)R$IwKAmr"BH6ZʱDj]$NEc+aYSJ ˙)HN< I uH}CW4Zf}71+Vg<K^6VjŬ[񆿜k/mo]9#b]h1")ax{kĢs(}T_EE)ľJ DzA* DBaB$9(fZPpq;f#dx$V,a6VT=I!sKnM2ʰ""+`3O2?'~zg6Z[3K&|%;K8ur1(5U޽9Ԯ]QA= -endstream -endobj -198 0 obj -3093 -endobj -199 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [72 642.29999 532 651.29999] /Subtype /Link /Type /Annot>> -endobj -200 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect [102 628.5 532 637.5] - /Subtype /Link /Type /Annot>> -endobj -201 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 616.70001 532 625.70001] /Subtype /Link /Type /Annot>> -endobj -202 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 604.89996 532 613.89996] /Subtype /Link /Type /Annot>> -endobj -203 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 593.09998 532 602.09998] /Subtype /Link /Type /Annot>> -endobj -204 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 581.29999 532 590.29999] /Subtype /Link /Type /Annot>> -endobj -205 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect [132 569.5 532 578.5] - /Subtype /Link /Type /Annot>> -endobj -206 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 557.69995 532 566.69995] /Subtype /Link /Type /Annot>> -endobj -207 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 545.90002 532 554.90002] /Subtype /Link /Type /Annot>> -endobj -208 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 534.09998 532 543.09998] /Subtype /Link /Type /Annot>> -endobj -209 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 522.30005 532 531.30005] /Subtype /Link /Type /Annot>> -endobj -210 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect [102 510.50003 532 519.5] - /Subtype /Link /Type /Annot>> -endobj -211 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 498.70004 532 507.70004] /Subtype /Link /Type /Annot>> -endobj -212 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 486.90005 532 495.90005] /Subtype /Link /Type /Annot>> -endobj -213 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 475.10007 532 484.10007] /Subtype /Link /Type /Annot>> -endobj -214 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 463.30008 532 472.30008] /Subtype /Link /Type /Annot>> -endobj -215 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 451.50009 532 460.50009] /Subtype /Link /Type /Annot>> -endobj -216 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect [102 439.7001 532 448.7001] - /Subtype /Link /Type /Annot>> -endobj -217 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 427.90012 532 436.90012] /Subtype /Link /Type /Annot>> -endobj -218 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 416.10013 532 425.10013] /Subtype /Link /Type /Annot>> -endobj -219 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 404.30014 532 413.30014] /Subtype /Link /Type /Annot>> -endobj -220 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 392.50015 532 401.50015] /Subtype /Link /Type /Annot>> -endobj -221 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 380.70016 532 389.70016] /Subtype /Link /Type /Annot>> -endobj -222 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 368.90018 532 377.90018] /Subtype /Link /Type /Annot>> -endobj -223 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 357.10019 532 366.10019] /Subtype /Link /Type /Annot>> -endobj -224 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect [132 345.3002 532 354.3002] - /Subtype /Link /Type /Annot>> -endobj -225 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 333.50021 532 342.50021] /Subtype /Link /Type /Annot>> -endobj -226 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 321.70023 532 330.70023] /Subtype /Link /Type /Annot>> -endobj -227 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 309.90024 532 318.90024] /Subtype /Link /Type /Annot>> -endobj -228 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 298.10025 532 307.10025] /Subtype /Link /Type /Annot>> -endobj -229 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 286.30026 532 295.30026] /Subtype /Link /Type /Annot>> -endobj -230 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 274.50027 532 283.50027] /Subtype /Link /Type /Annot>> -endobj -231 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 262.70029 532 271.70029] /Subtype /Link /Type /Annot>> -endobj -232 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect [132 250.9003 532 259.9003] - /Subtype /Link /Type /Annot>> -endobj -233 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [132 239.10031 532 248.10031] /Subtype /Link /Type /Annot>> -endobj -234 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 227.30032 532 236.30032] /Subtype /Link /Type /Annot>> -endobj -235 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 215.50034 532 224.50034] /Subtype /Link /Type /Annot>> -endobj -236 0 obj -<> /Border - [0 0 0] /M (D:20180430025315-08'00') /Rect - [102 203.70035 532 212.70035] /Subtype /Link /Type /Annot>> -endobj -237 0 obj -<> - /Border [0 0 0] /M (D:20180430025310-08'00') /Rect - [80 83.46507 153.44702 99.30471] /Subtype /Link /Type /Annot>> -endobj -238 0 obj -<> - /Border [0 0 0] /M (D:20180430025310-08'00') /Rect - [80 63.29867 179.7932 81.66507] /Subtype /Link /Type /Annot>> -endobj -239 0 obj -<> - /Border [0 0 0] /M (D:20180430025310-08'00') /Rect - [481.72852 69.01653 501.64893 78.01653] /Subtype /Link /Type /Annot>> -endobj -240 0 obj -<> - /Border [0 0 0] /M (D:20180430025310-08'00') /Rect - [512.06396 69.01653 540 78.01653] /Subtype /Link /Type /Annot>> -endobj -241 0 obj -<> -stream -xڕXɮWpv8 0`%V t"}?T'$tլ"k`& ڣ;ܗ y'PD]yOܯrZ$:7WcLu=!uB"Ҋk)C=CMY=#6w.^z$d 0BƷ(~YYAK+#v]JDړ=(B*[w -BS-*`T%[ )Ɔi_+9Ad/#ճOuZF<PΑ@?#+ʞq"}jz`\} - -/$a; lMj5YL vq 2KӾuIʰ6'BS@q`h6`PL0wf a} ;t՝tiL<8@zlj sV$90k}Y[l1qu9+yVN IGЫwK3qmD?Ns(TGU}^ӲCK1ŹG7:4P ^ai){{\DVo ,DU&E70+NOx)0nێ%M){n~"PQt.lva8$,%u8 Iv'zj -ɣdGA3%g M#=Jq2LdNϚAGD7Z4 -f7ǖE+,Ả jfքAĢoYE05>h(+r[ 8v `(fYLN>6t MhñwҜ?O /1?a(,[0ohsVGMϦr޺W`Y ̓]=nogXYh,d|:BRV]:'"`PY#:JŊĸ=6Jk _ Dibe͋c4Ko$ksaZKBAn8]MZ\fN\qjZIx;>tc7gv|e["v{ow?"uD*Xܧ?ALAg#q'p8sMxe >~aӈ>}JkAyǻޡ5'"hq 9-4⎴.+.Z#mM -um/ 0{If`d2|OE"LE4Ԧ%- Ukhf:ȎyȢ?fH~[fcVa#dѩ33[wJ˦|o>.c034 ɣd|>;4'5hY+)fm#\3kYca=jվ]MQ9Tx=,y>u5"'vCO"D)[6] v? <(ʅjdN8Jv욡>q)ozvw̔$B^MlIa0dBۋg?wE^jk&kgr3stk/l -endstream -endobj -242 0 obj -2264 -endobj -243 0 obj -<> /C [0 0 0] - /First 244 0 R /Last 245 0 R /Parent 4 0 R /Title - (Cyclone V Device Overview)>> -endobj -244 0 obj -<> /C [0 0 0] - /Next 272 0 R /Parent 243 0 R /Title - (Key Advantages of Cyclone V Devices)>> -endobj -245 0 obj -<> /C [0 0 0] - /Parent 243 0 R /Prev 246 0 R /Title - (Document Revision History for Cyclone V Device Overview)>> -endobj -246 0 obj -<> /C [0 0 0] - /Next 245 0 R /Parent 243 0 R /Prev 247 0 R /Title (Power Management)>> -endobj -247 0 obj -<> /C [0 0 0] - /Next 246 0 R /Parent 243 0 R /Prev 248 0 R /Title - (Enhanced Configuration and Configuration via Protocol)>> -endobj -248 0 obj -<> /C [0 0 0] - /First 249 0 R /Last 250 0 R /Next 247 0 R /Parent 243 0 R /Prev - 251 0 R /Title (Dynamic and Partial Reconfiguration)>> -endobj -249 0 obj -<> /C [0 0 0] - /Next 250 0 R /Parent 248 0 R /Title (Dynamic Reconfiguration)>> -endobj -250 0 obj -<> /C [0 0 0] - /Parent 248 0 R /Prev 249 0 R /Title (Partial Reconfiguration)>> -endobj -251 0 obj -<> /C [0 0 0] - /First 252 0 R /Last 253 0 R /Next 248 0 R /Parent 243 0 R /Prev - 254 0 R /Title (SoC with HPS)>> -endobj -252 0 obj -<> /C [0 0 0] - /First 299 0 R /Last 300 0 R /Next 298 0 R /Parent 251 0 R /Title - (HPS Features)>> -endobj -253 0 obj -<> /C [0 0 0] - /Parent 251 0 R /Prev 298 0 R /Title - (Hardware and Software Development)>> -endobj -254 0 obj -<> /C [0 0 0] - /First 255 0 R /Last 256 0 R /Next 251 0 R /Parent 243 0 R /Prev - 257 0 R /Title (Low-Power Serial Transceivers)>> -endobj -255 0 obj -<> /C [0 0 0] - /Next 297 0 R /Parent 254 0 R /Title (Transceiver Channels)>> -endobj -256 0 obj -<> /C [0 0 0] - /Parent 254 0 R /Prev 297 0 R /Title (PCS Features)>> -endobj -257 0 obj -<> /C [0 0 0] - /First 258 0 R /Last 259 0 R /Next 254 0 R /Parent 243 0 R /Prev - 260 0 R /Title (External Memory Interface)>> -endobj -258 0 obj -<> /C [0 0 0] - /Next 296 0 R /Parent 257 0 R /Title - (Hard and Soft Memory Controllers)>> -endobj -259 0 obj -<> /C [0 0 0] - /Parent 257 0 R /Prev 296 0 R /Title (HPS External Memory Performance)>> -endobj -260 0 obj -<> /C [0 0 0] - /Next 257 0 R /Parent 243 0 R /Prev 261 0 R /Title - (PCIe Gen1 and Gen2 Hard IP)>> -endobj -261 0 obj -<> /C [0 0 0] - /Next 260 0 R /Parent 243 0 R /Prev 262 0 R /Title - (FPGA General Purpose I/O)>> -endobj -262 0 obj -<> /C [0 0 0] - /Next 261 0 R /Parent 243 0 R /Prev 263 0 R /Title - (Clock Networks and PLL Clock Sources)>> -endobj -263 0 obj -<> /C [0 0 0] - /First 264 0 R /Last 265 0 R /Next 262 0 R /Parent 243 0 R /Prev - 266 0 R /Title (Embedded Memory Blocks)>> -endobj -264 0 obj -<> /C [0 0 0] - /Next 295 0 R /Parent 263 0 R /Title (Types of Embedded Memory)>> -endobj -265 0 obj -<> /C [0 0 0] - /Parent 263 0 R /Prev 295 0 R /Title (Embedded Memory Configurations)>> -endobj -266 0 obj -<> /C [0 0 0] - /Next 263 0 R /Parent 243 0 R /Prev 267 0 R /Title - (Variable-Precision DSP Block)>> -endobj -267 0 obj -<> /C [0 0 0] - /Next 266 0 R /Parent 243 0 R /Prev 268 0 R /Title - (Adaptive Logic Module)>> -endobj -268 0 obj -<> /C [0 0 0] - /Next 267 0 R /Parent 243 0 R /Prev 269 0 R /Title - (I/O Vertical Migration for Cyclone V Devices)>> -endobj -269 0 obj -<> /C [0 0 0] - /First 270 0 R /Last 271 0 R /Next 268 0 R /Parent 243 0 R /Prev - 272 0 R /Title (Cyclone V Device Variants and Packages)>> -endobj -270 0 obj -<> /C [0 0 0] - /First 292 0 R /Last 293 0 R /Next 284 0 R /Parent 269 0 R /Title - (Cyclone V E)>> -endobj -271 0 obj -<> /C [0 0 0] - /First 273 0 R /Last 274 0 R /Parent 269 0 R /Prev 275 0 R /Title - (Cyclone V ST)>> -endobj -272 0 obj -<> /C [0 0 0] - /Next 269 0 R /Parent 243 0 R /Prev 244 0 R /Title - (Summary of Cyclone V Features)>> -endobj -273 0 obj -<> /C [0 0 0] - /Next 291 0 R /Parent 271 0 R /Title (Available Options)>> -endobj -274 0 obj -<> /C [0 0 0] - /Parent 271 0 R /Prev 291 0 R /Title (Package Plan)>> -endobj -275 0 obj -<> /C [0 0 0] - /First 276 0 R /Last 277 0 R /Next 271 0 R /Parent 269 0 R /Prev - 278 0 R /Title (Cyclone V SX)>> -endobj -276 0 obj -<> /C [0 0 0] - /Next 290 0 R /Parent 275 0 R /Title (Available Options)>> -endobj -277 0 obj -<> /C [0 0 0] - /Parent 275 0 R /Prev 290 0 R /Title (Package Plan)>> -endobj -278 0 obj -<> /C [0 0 0] - /First 279 0 R /Last 280 0 R /Next 275 0 R /Parent 269 0 R /Prev - 281 0 R /Title (Cyclone V SE)>> -endobj -279 0 obj -<> /C [0 0 0] - /Next 289 0 R /Parent 278 0 R /Title (Available Options)>> -endobj -280 0 obj -<> /C [0 0 0] - /Parent 278 0 R /Prev 289 0 R /Title (Package Plan)>> -endobj -281 0 obj -<> /C [0 0 0] - /First 282 0 R /Last 283 0 R /Next 278 0 R /Parent 269 0 R /Prev - 284 0 R /Title (Cyclone V GT)>> -endobj -282 0 obj -<> /C [0 0 0] - /Next 288 0 R /Parent 281 0 R /Title (Available Options)>> -endobj -283 0 obj -<> /C [0 0 0] - /Parent 281 0 R /Prev 288 0 R /Title (Package Plan)>> -endobj -284 0 obj -<> /C [0 0 0] - /First 285 0 R /Last 286 0 R /Next 281 0 R /Parent 269 0 R /Prev - 270 0 R /Title (Cyclone V GX)>> -endobj -285 0 obj -<> /C [0 0 0] - /Next 287 0 R /Parent 284 0 R /Title (Available Options)>> -endobj -286 0 obj -<> /C [0 0 0] - /Parent 284 0 R /Prev 287 0 R /Title (Package Plan)>> -endobj -287 0 obj -<> /C [0 0 0] - /Next 286 0 R /Parent 284 0 R /Prev 285 0 R /Title (Maximum Resources)>> -endobj -288 0 obj -<> /C [0 0 0] - /Next 283 0 R /Parent 281 0 R /Prev 282 0 R /Title (Maximum Resources)>> -endobj -289 0 obj -<> /C [0 0 0] - /Next 280 0 R /Parent 278 0 R /Prev 279 0 R /Title (Maximum Resources)>> -endobj -290 0 obj -<> /C [0 0 0] - /Next 277 0 R /Parent 275 0 R /Prev 276 0 R /Title (Maximum Resources)>> -endobj -291 0 obj -<> /C [0 0 0] - /Next 274 0 R /Parent 271 0 R /Prev 273 0 R /Title (Maximum Resources)>> -endobj -292 0 obj -<> /C [0 0 0] - /Next 294 0 R /Parent 270 0 R /Title (Available Options)>> -endobj -293 0 obj -<> /C [0 0 0] - /Parent 270 0 R /Prev 294 0 R /Title (Package Plan)>> -endobj -294 0 obj -<> /C [0 0 0] - /Next 293 0 R /Parent 270 0 R /Prev 292 0 R /Title (Maximum Resources)>> -endobj -295 0 obj -<> /C [0 0 0] - /Next 265 0 R /Parent 263 0 R /Prev 264 0 R /Title - (Embedded Memory Capacity in Cyclone V Devices)>> -endobj -296 0 obj -<> /C [0 0 0] - /Next 259 0 R /Parent 257 0 R /Prev 258 0 R /Title - (External Memory Performance)>> -endobj -297 0 obj -<> /C [0 0 0] - /Next 256 0 R /Parent 254 0 R /Prev 255 0 R /Title (PMA Features)>> -endobj -298 0 obj -<> /C [0 0 0] - /Next 253 0 R /Parent 251 0 R /Prev 252 0 R /Title - (FPGA Configuration and Processor Booting)>> -endobj -299 0 obj -<> /C [0 0 0] - /Next 301 0 R /Parent 252 0 R /Title - (System Peripherals and Debug Access Port)>> -endobj -300 0 obj -<> /C [0 0 0] - /Parent 252 0 R /Prev 301 0 R /Title (HPS SDRAM Controller Subsystem)>> -endobj -301 0 obj -<> /C [0 0 0] - /Next 300 0 R /Parent 252 0 R /Prev 299 0 R /Title - (HPS\205FPGA AXI Bridges)>> -endobj -302 0 obj -<> -endobj -303 0 obj -<> -endobj -304 0 obj -<> -endobj -305 0 obj -<> -endobj -306 0 obj -<> -endobj -307 0 obj -<> -endobj -308 0 obj -<> -endobj -309 0 obj -<> -endobj -310 0 obj -<> -endobj -311 0 obj -<> -endobj -312 0 obj -<> -endobj -313 0 obj -<> -endobj -314 0 obj -<> -endobj -315 0 obj -<> -endobj -316 0 obj -<> -endobj -317 0 obj -<> -endobj -318 0 obj -<> -endobj -319 0 obj -<> -endobj -320 0 obj -<> -endobj -321 0 obj -<> -endobj -322 0 obj -<> -endobj -323 0 obj -<> -endobj -324 0 obj -<> -endobj -325 0 obj -<> -endobj -326 0 obj -<> -endobj -327 0 obj -<> -endobj -328 0 obj -<> -endobj -329 0 obj -<> -endobj -330 0 obj -<> -endobj -331 0 obj -<> -endobj -332 0 obj -<> -endobj -333 0 obj -<> -endobj -334 0 obj -<> -endobj -335 0 obj -<> -endobj -336 0 obj -<> -endobj -337 0 obj -<> -endobj -338 0 obj -<> -endobj -339 0 obj -<> -endobj -340 0 obj -<> -endobj -341 0 obj -<> -endobj -342 0 obj -<> -endobj -343 0 obj -<> -endobj -344 0 obj -<> -endobj -345 0 obj -<> -endobj -346 0 obj -<> -endobj -347 0 obj -<> -endobj -348 0 obj -<> -endobj -349 0 obj -<> -endobj -350 0 obj -<> -endobj -351 0 obj -<> -endobj -352 0 obj -<> -endobj -353 0 obj -<> -endobj -354 0 obj -<> -endobj -355 0 obj -<> -endobj -356 0 obj -<> -endobj -357 0 obj -<> -endobj -358 0 obj -<> -endobj -359 0 obj -<> -endobj -360 0 obj -<> -endobj -361 0 obj -<> -endobj -362 0 obj -<> -endobj -363 0 obj -<> -endobj -364 0 obj -<> -endobj -365 0 obj -<> -endobj -366 0 obj -<> -endobj -367 0 obj -<> -endobj -368 0 obj -<> -endobj -369 0 obj -<> -endobj -370 0 obj -<> -endobj -371 0 obj -<> -endobj -372 0 obj -<> -endobj -373 0 obj -<> -endobj -374 0 obj -<> -endobj -375 0 obj -<> -endobj -376 0 obj -<> -endobj -377 0 obj -<> -endobj -378 0 obj -<> -endobj -379 0 obj -<> -endobj -380 0 obj -<> -endobj -381 0 obj -<> -endobj -382 0 obj -<> -endobj -383 0 obj -<> -endobj -384 0 obj -<> -endobj -385 0 obj -<> -endobj -386 0 obj -<> -endobj -387 0 obj -<> -endobj -388 0 obj -<> -endobj -389 0 obj -<> -endobj -390 0 obj -<> -endobj -391 0 obj -<> -endobj -392 0 obj -<> -endobj -393 0 obj -<> -endobj -394 0 obj -<> -endobj -395 0 obj -<> -endobj -396 0 obj -<> -endobj -397 0 obj -<> -endobj -398 0 obj -<> -endobj -399 0 obj -<> -endobj -400 0 obj -<> -endobj -401 0 obj -<> -endobj -402 0 obj -<> -endobj -403 0 obj -<> -endobj -404 0 obj -<> -endobj -405 0 obj -<> -endobj -406 0 obj -<> -endobj -407 0 obj -<> -endobj -408 0 obj -<> -endobj -409 0 obj -<> -endobj -410 0 obj -<> -endobj -411 0 obj -<> -endobj -412 0 obj -<> -endobj -413 0 obj -<> -endobj -414 0 obj -<> -endobj -415 0 obj -<> -endobj -416 0 obj -<> -endobj -417 0 obj -<> -endobj -418 0 obj -<> -endobj -419 0 obj -<> -endobj -420 0 obj -<> -endobj -421 0 obj -<> -endobj -422 0 obj -<> -endobj -423 0 obj -<> -endobj -424 0 obj -<> -endobj -425 0 obj -<> -endobj -426 0 obj -<> -endobj -427 0 obj -<> -endobj -428 0 obj -<> -endobj -429 0 obj -<> -endobj -430 0 obj -<> -endobj -431 0 obj -<> -endobj -432 0 obj -<> -endobj -433 0 obj -<> -endobj -434 0 obj -<> -endobj -435 0 obj -<> -endobj -436 0 obj -<> -endobj -437 0 obj -<> -endobj -438 0 obj -<> -endobj -439 0 obj -<> -endobj -440 0 obj -<> -endobj -441 0 obj -<> -endobj -442 0 obj -<> -endobj -443 0 obj -<> -endobj -444 0 obj -<> -endobj -445 0 obj -<> -endobj -446 0 obj -<> -endobj -447 0 obj -<> -endobj -448 0 obj -<> -endobj -449 0 obj -<> -endobj -450 0 obj -<> -endobj -451 0 obj -<> -endobj -452 0 obj -<> -endobj -453 0 obj -<> -endobj -454 0 obj -<> -endobj -455 0 obj -<> -endobj -456 0 obj -<> -endobj -457 0 obj -<> -endobj -458 0 obj -<> -endobj -459 0 obj -<> -endobj -460 0 obj -<> -endobj -461 0 obj -<> -endobj -462 0 obj -<> -endobj -463 0 obj -<> -endobj -464 0 obj -<> -endobj -465 0 obj -<> -endobj -466 0 obj -<> -endobj -467 0 obj -<> -endobj -468 0 obj -<> -endobj -469 0 obj -<> -endobj -470 0 obj -<> -endobj -471 0 obj -<> -endobj -472 0 obj -<> -endobj -473 0 obj -<> -endobj -474 0 obj -<> -endobj -475 0 obj -<> -endobj -476 0 obj -<> -endobj -477 0 obj -<> -endobj -478 0 obj -<> -endobj -479 0 obj -<> -endobj -480 0 obj -<> -endobj -481 0 obj -<> -endobj -482 0 obj -<> -endobj -483 0 obj -<> -endobj -484 0 obj -<> -endobj -485 0 obj -<> -endobj -486 0 obj -<> -endobj -487 0 obj -<> -endobj -488 0 obj -<> -endobj -489 0 obj -<> -endobj -490 0 obj -<> -endobj -491 0 obj -<> -endobj -492 0 obj -<> -endobj -493 0 obj -<> -endobj -494 0 obj -<> -endobj -495 0 obj -<> -endobj -496 0 obj -<> -endobj -497 0 obj -<> -endobj -498 0 obj -<> -endobj -499 0 obj -<> -endobj -500 0 obj -<> -endobj -501 0 obj -<> -endobj -502 0 obj -<> -endobj -503 0 obj -<> -endobj -504 0 obj -<> -endobj -505 0 obj -<> -endobj -506 0 obj -<> -endobj -507 0 obj -<> -endobj -508 0 obj -<> -endobj -509 0 obj -<> -endobj -510 0 obj -<> -endobj -511 0 obj -<> -endobj -512 0 obj -<> -endobj -513 0 obj -<> -endobj -514 0 obj -<> -endobj -515 0 obj -<> -endobj -516 0 obj -<> -endobj -517 0 obj -<> -endobj -518 0 obj -<> -endobj -519 0 obj -<> -endobj -520 0 obj -<> -endobj -521 0 obj -<> -endobj -522 0 obj -<> -endobj -523 0 obj -<> -endobj -524 0 obj -<> -endobj -525 0 obj -<> -endobj -526 0 obj -<> -endobj -527 0 obj -<> -endobj -528 0 obj -<> -endobj -529 0 obj -<> -endobj -530 0 obj -<> -endobj -531 0 obj -<> -endobj -532 0 obj -<> -endobj -533 0 obj -<> -endobj -534 0 obj -<> -endobj -535 0 obj -<> -endobj -536 0 obj -<> -endobj -537 0 obj -<> -endobj -538 0 obj -<> -endobj -539 0 obj -<> -endobj -540 0 obj -<> -endobj -541 0 obj -<> -endobj -542 0 obj -<> -endobj -543 0 obj -<> -endobj -544 0 obj -<> -endobj -545 0 obj -<> -endobj -546 0 obj -<> -endobj -547 0 obj -<> -endobj -548 0 obj -<> -endobj -549 0 obj -<> -endobj -550 0 obj -<> -endobj -551 0 obj -<> -endobj -552 0 obj -<> -endobj -553 0 obj -<> -endobj -554 0 obj -<> -endobj -555 0 obj -<> -endobj -556 0 obj -<> -endobj -557 0 obj -<> -endobj -558 0 obj -<> -endobj -559 0 obj -<> -endobj -560 0 obj -<> -endobj -561 0 obj -<> -endobj -562 0 obj -<> -endobj -563 0 obj -<> -endobj -564 0 obj -<> -endobj -565 0 obj -<> -endobj -566 0 obj -<> -endobj -567 0 obj -<> -endobj -568 0 obj -<> -endobj -569 0 obj -<> -endobj -570 0 obj -<> -endobj -571 0 obj -<> -endobj -572 0 obj -<> -endobj -573 0 obj -<> -endobj -574 0 obj -<> -endobj -575 0 obj -<> -endobj -576 0 obj -<> -endobj -577 0 obj -<> -endobj -578 0 obj -<> -endobj -579 0 obj -<> -endobj -580 0 obj -<> -endobj -581 0 obj -<> -endobj -582 0 obj -<> -endobj -583 0 obj -<> -endobj -584 0 obj -<> -endobj -585 0 obj -<> -endobj -586 0 obj -<> -endobj -587 0 obj -<> -endobj -588 0 obj -<> -endobj -589 0 obj -<> -endobj -590 0 obj -<> -endobj -591 0 obj -<> -endobj -592 0 obj -<> -endobj -593 0 obj -<> -endobj -594 0 obj -<> -endobj -595 0 obj -<> -endobj -596 0 obj -<> -endobj -597 0 obj -<> -endobj -598 0 obj -<> -endobj -599 0 obj -<> -endobj -600 0 obj -<> -endobj -601 0 obj -<> -endobj -602 0 obj -<> -endobj -603 0 obj -<> -endobj -604 0 obj -<> -endobj -605 0 obj -<> -endobj -606 0 obj -<> -endobj -607 0 obj -<> -endobj -608 0 obj -<> -endobj -609 0 obj -<> -endobj -610 0 obj -<> -endobj -611 0 obj -<> -endobj -612 0 obj -<> -endobj -613 0 obj -<> -endobj -614 0 obj -<> -endobj -615 0 obj -<> -endobj -616 0 obj -<> -endobj -617 0 obj -<> -endobj -618 0 obj -<> -endobj -619 0 obj -<> -endobj -620 0 obj -<> -endobj -621 0 obj -<> -endobj -622 0 obj -<> -endobj -623 0 obj -<> -endobj -624 0 obj -<> -endobj -625 0 obj -<> -endobj -626 0 obj -<> -endobj -627 0 obj -<> -endobj -628 0 obj -<> -endobj -629 0 obj -<> -endobj -630 0 obj -<> -endobj -631 0 obj -<> -endobj -632 0 obj -<> -endobj -633 0 obj -<> -endobj -634 0 obj -<> -endobj -635 0 obj -<> -endobj -636 0 obj -<> -endobj -637 0 obj -<> -endobj -638 0 obj -<> -endobj -639 0 obj -<> -endobj -640 0 obj -<> -endobj -641 0 obj -<> -endobj -642 0 obj -<> -endobj -643 0 obj -<> -endobj -644 0 obj -<> -endobj -645 0 obj -<> -endobj -646 0 obj -<> -endobj -647 0 obj -<> -endobj -648 0 obj -<> -endobj -649 0 obj -<> -endobj -650 0 obj -<> -endobj -651 0 obj -<> -endobj -652 0 obj -<> -endobj -653 0 obj -<> -endobj -654 0 obj -<> -endobj -655 0 obj -<> -endobj -656 0 obj -<> -endobj -657 0 obj -<> -endobj -658 0 obj -<> -endobj -659 0 obj -<> -endobj -660 0 obj -<> -endobj -661 0 obj -<> -endobj -662 0 obj -<> -endobj -663 0 obj -<> -endobj -664 0 obj -<> -endobj -665 0 obj -<> -endobj -666 0 obj -<> -endobj -667 0 obj -<> -endobj -668 0 obj -<> -endobj -669 0 obj -<> -endobj -670 0 obj -<> -endobj -671 0 obj -<> -endobj -672 0 obj -<> -endobj -673 0 obj -<> -endobj -674 0 obj -<> -endobj -675 0 obj -<> -endobj -676 0 obj -<> -endobj -677 0 obj -<> -endobj -678 0 obj -<> -endobj -679 0 obj -<> -endobj -680 0 obj -<> -endobj -681 0 obj -<> -endobj -682 0 obj -<> -endobj -683 0 obj -<> -endobj -684 0 obj -<> -endobj -685 0 obj -<> -endobj -686 0 obj -<> -endobj -687 0 obj -<> -endobj -688 0 obj -<> -endobj -689 0 obj -<> -endobj -690 0 obj -<> -endobj -691 0 obj -<> -endobj -692 0 obj -<> -endobj -693 0 obj -<> -endobj -694 0 obj -<> -endobj -695 0 obj -<> -endobj -696 0 obj -<> -endobj -697 0 obj -<> -endobj -698 0 obj -<> -endobj -699 0 obj -<> -endobj -700 0 obj -<> -endobj -701 0 obj -<> -endobj -702 0 obj -<> -endobj -703 0 obj -<> -endobj -704 0 obj -<> -endobj -705 0 obj -<> -endobj -706 0 obj -<> -endobj -707 0 obj -<> -endobj -708 0 obj -<> -endobj -709 0 obj -<> -endobj -710 0 obj -<> -endobj -711 0 obj -<> -endobj -712 0 obj -<> -endobj -713 0 obj -<> -endobj -714 0 obj -<> -endobj -715 0 obj -<> -endobj -716 0 obj -<> -endobj -717 0 obj -<> -endobj -718 0 obj -<> -endobj -719 0 obj -<> -endobj -720 0 obj -<> -endobj -721 0 obj -<> -endobj -722 0 obj -<> -endobj -723 0 obj -<> -endobj -724 0 obj -<> -endobj -725 0 obj -<> -endobj -726 0 obj -<> -endobj -727 0 obj -<> -endobj -728 0 obj -<> -endobj -729 0 obj -<> -endobj -730 0 obj -<> -endobj -731 0 obj -<> -endobj -732 0 obj -<> -endobj -733 0 obj -<> -endobj -734 0 obj -<> -endobj -735 0 obj -<> -endobj -736 0 obj -<> -endobj -737 0 obj -<> -endobj -738 0 obj -<> -endobj -739 0 obj -<> -endobj -740 0 obj -<> -endobj -741 0 obj -<> -endobj -742 0 obj -<> -endobj -743 0 obj -<> -endobj -744 0 obj -<> -endobj -745 0 obj -<> -endobj -746 0 obj -<> -endobj -747 0 obj -<> -endobj -748 0 obj -<> -endobj -749 0 obj -<> -endobj -750 0 obj -<> -endobj -751 0 obj -<> -endobj -752 0 obj -<> -endobj -753 0 obj -<> -endobj -754 0 obj -<> -endobj -755 0 obj -<> -endobj -756 0 obj -<> -endobj -757 0 obj -<> -endobj -758 0 obj -<> -endobj -759 0 obj -<> -endobj -760 0 obj -<> -endobj -761 0 obj -<> -endobj -762 0 obj -<> -endobj -763 0 obj -<> -endobj -764 0 obj -<> -endobj -765 0 obj -<> -endobj -766 0 obj -<> -endobj -767 0 obj -<> -endobj -768 0 obj -<> -endobj -769 0 obj -<> -endobj -770 0 obj -<> -endobj -771 0 obj -<> -endobj -772 0 obj -<> -endobj -773 0 obj -<> -endobj -774 0 obj -<> -endobj -775 0 obj -<> -endobj -776 0 obj -<> -endobj -777 0 obj -<> -endobj -778 0 obj -<> -endobj -779 0 obj -<> -endobj -780 0 obj -<> -endobj -781 0 obj -<> -endobj -782 0 obj -<> -endobj -783 0 obj -<> -endobj -784 0 obj -<> -endobj -785 0 obj -<> -endobj -786 0 obj -<> -endobj -787 0 obj -<> -endobj -788 0 obj -<> -endobj -789 0 obj -<> -endobj -790 0 obj -<> -endobj -791 0 obj -<> -endobj -792 0 obj -<> -endobj -793 0 obj -<> -endobj -794 0 obj -<> -endobj -795 0 obj -<> -endobj -796 0 obj -<> -endobj -797 0 obj -<> -endobj -798 0 obj -<> -endobj -799 0 obj -<> -endobj -800 0 obj -<> -endobj -801 0 obj -<> -endobj -802 0 obj -<> -endobj -803 0 obj -<> -endobj -804 0 obj -<> -endobj -805 0 obj -<> -endobj -806 0 obj -<> -endobj -807 0 obj -<> -endobj -808 0 obj -<> -endobj -809 0 obj -<> -endobj -810 0 obj -<> -endobj -xref -0 811 -0000000000 65535 f -0000000015 00000 n -0000000629 00000 n -0000000765 00000 n -0000000799 00000 n -0000000872 00000 n -0000001039 00000 n -0000001369 00000 n -0000001690 00000 n -0000001994 00000 n -0000002315 00000 n -0000002604 00000 n -0000002911 00000 n -0000003214 00000 n -0000003544 00000 n -0000003847 00000 n -0000004177 00000 n -0000004480 00000 n -0000004798 00000 n -0000005130 00000 n -0000005437 00000 n -0000005769 00000 n -0000006087 00000 n -0000006408 00000 n -0000006726 00000 n -0000007040 00000 n -0000007359 00000 n -0000007648 00000 n -0000007937 00000 n -0000008239 00000 n -0000008528 00000 n -0000008831 00000 n -0000009148 00000 n -0000009451 00000 n -0000009740 00000 n -0000010029 00000 n -0000010332 00000 n -0000010620 00000 n -0000010947 00000 n -0000011252 00000 n -0000011553 00000 n -0000011841 00000 n -0000012155 00000 n -0000012443 00000 n -0000012731 00000 n -0000016657 00000 n -0000016814 00000 n -0000016966 00000 n -0000017131 00000 n -0000017471 00000 n -0000017831 00000 n -0000017851 00000 n -0000018109 00000 n -0000018203 00000 n -0000027221 00000 n -0000027242 00000 n -0000027261 00000 n -0000027879 00000 n -0000028271 00000 n -0000028291 00000 n -0000028535 00000 n -0000028636 00000 n -0000049394 00000 n -0000049416 00000 n -0000049435 00000 n -0000049938 00000 n -0000050303 00000 n -0000050323 00000 n -0000050572 00000 n -0000050670 00000 n -0000065628 00000 n -0000065650 00000 n -0000065669 00000 n -0000065690 00000 n -0000071145 00000 n -0000071166 00000 n -0000071397 00000 n -0000071638 00000 n -0000077167 00000 n -0000077188 00000 n -0000082240 00000 n -0000082261 00000 n -0000087518 00000 n -0000087677 00000 n -0000088097 00000 n -0000088483 00000 n -0000088503 00000 n -0000088757 00000 n -0000088851 00000 n -0000100522 00000 n -0000100544 00000 n -0000100565 00000 n -0000100806 00000 n -0000108428 00000 n -0000108449 00000 n -0000108716 00000 n -0000108966 00000 n -0000112931 00000 n -0000112952 00000 n -0000116996 00000 n -0000117017 00000 n -0000123422 00000 n -0000123986 00000 n -0000124453 00000 n -0000124807 00000 n -0000124828 00000 n -0000130493 00000 n -0000130515 00000 n -0000130537 00000 n -0000135849 00000 n -0000135871 00000 n -0000142351 00000 n -0000142373 00000 n -0000152716 00000 n -0000152739 00000 n -0000152985 00000 n -0000153231 00000 n -0000159141 00000 n -0000159163 00000 n -0000163696 00000 n -0000163718 00000 n -0000167411 00000 n -0000167433 00000 n -0000174971 00000 n -0000174993 00000 n -0000184261 00000 n -0000184283 00000 n -0000192757 00000 n -0000192779 00000 n -0000192806 00000 n -0000198537 00000 n -0000198559 00000 n -0000198730 00000 n -0000211207 00000 n -0000211230 00000 n -0000211289 00000 n -0000217076 00000 n -0000217098 00000 n -0000217334 00000 n -0000217582 00000 n -0000217830 00000 n -0000218075 00000 n -0000218320 00000 n -0000218546 00000 n -0000225926 00000 n -0000225948 00000 n -0000225991 00000 n -0000233763 00000 n -0000233785 00000 n -0000234027 00000 n -0000234242 00000 n -0000234456 00000 n -0000234682 00000 n -0000243470 00000 n -0000243492 00000 n -0000243740 00000 n -0000252074 00000 n -0000252096 00000 n -0000252322 00000 n -0000258320 00000 n -0000258342 00000 n -0000258425 00000 n -0000266416 00000 n -0000266438 00000 n -0000266680 00000 n -0000266928 00000 n -0000267176 00000 n -0000267422 00000 n -0000267668 00000 n -0000267914 00000 n -0000268129 00000 n -0000268345 00000 n -0000277071 00000 n -0000277093 00000 n -0000277341 00000 n -0000277571 00000 n -0000289200 00000 n -0000289223 00000 n -0000299284 00000 n -0000299306 00000 n -0000299548 00000 n -0000299774 00000 n -0000305898 00000 n -0000305920 00000 n -0000315229 00000 n -0000315251 00000 n -0000315477 00000 n -0000320836 00000 n -0000320858 00000 n -0000327734 00000 n -0000327756 00000 n -0000328012 00000 n -0000328271 00000 n -0000328530 00000 n -0000328789 00000 n -0000334620 00000 n -0000334642 00000 n -0000334973 00000 n -0000338142 00000 n -0000338164 00000 n -0000338354 00000 n -0000338537 00000 n -0000338728 00000 n -0000338919 00000 n -0000339110 00000 n -0000339301 00000 n -0000339484 00000 n -0000339675 00000 n -0000339866 00000 n -0000340057 00000 n -0000340248 00000 n -0000340435 00000 n -0000340626 00000 n -0000340818 00000 n -0000341010 00000 n -0000341202 00000 n -0000341394 00000 n -0000341584 00000 n -0000341776 00000 n -0000341968 00000 n -0000342160 00000 n -0000342352 00000 n -0000342544 00000 n -0000342736 00000 n -0000342928 00000 n -0000343118 00000 n -0000343310 00000 n -0000343502 00000 n -0000343694 00000 n -0000343886 00000 n -0000344078 00000 n -0000344270 00000 n -0000344462 00000 n -0000344652 00000 n -0000344844 00000 n -0000345036 00000 n -0000345228 00000 n -0000345420 00000 n -0000345637 00000 n -0000346058 00000 n -0000346299 00000 n -0000346520 00000 n -0000348860 00000 n -0000348882 00000 n -0000349053 00000 n -0000349221 00000 n -0000349410 00000 n -0000349572 00000 n -0000349773 00000 n -0000349985 00000 n -0000350140 00000 n -0000350295 00000 n -0000350484 00000 n -0000350659 00000 n -0000350826 00000 n -0000351032 00000 n -0000351184 00000 n -0000351328 00000 n -0000351530 00000 n -0000351696 00000 n -0000351859 00000 n -0000352033 00000 n -0000352205 00000 n -0000352389 00000 n -0000352588 00000 n -0000352744 00000 n -0000352906 00000 n -0000353081 00000 n -0000353249 00000 n -0000353440 00000 n -0000353654 00000 n -0000353827 00000 n -0000354001 00000 n -0000354177 00000 n -0000354325 00000 n -0000354468 00000 n -0000354656 00000 n -0000354804 00000 n -0000354947 00000 n -0000355135 00000 n -0000355283 00000 n -0000355426 00000 n -0000355614 00000 n -0000355762 00000 n -0000355905 00000 n -0000356093 00000 n -0000356241 00000 n -0000356384 00000 n -0000356546 00000 n -0000356708 00000 n -0000356870 00000 n -0000357032 00000 n -0000357194 00000 n -0000357342 00000 n -0000357485 00000 n -0000357647 00000 n -0000357840 00000 n -0000358015 00000 n -0000358173 00000 n -0000358361 00000 n -0000358535 00000 n -0000358697 00000 n -0000358868 00000 n -0000358961 00000 n -0000361375 00000 n -0000364772 00000 n -0000369352 00000 n -0000373132 00000 n -0000377252 00000 n -0000381248 00000 n -0000385680 00000 n -0000388917 00000 n -0000388975 00000 n -0000389033 00000 n -0000389091 00000 n -0000389143 00000 n -0000389201 00000 n -0000389255 00000 n -0000389313 00000 n -0000389371 00000 n -0000389428 00000 n -0000389486 00000 n -0000389544 00000 n -0000389601 00000 n -0000389659 00000 n -0000389717 00000 n -0000389775 00000 n -0000389833 00000 n -0000389891 00000 n -0000389943 00000 n -0000390001 00000 n -0000390059 00000 n -0000390117 00000 n -0000390173 00000 n -0000390231 00000 n -0000390289 00000 n -0000390347 00000 n -0000390405 00000 n -0000390463 00000 n -0000390521 00000 n -0000390579 00000 n -0000390637 00000 n -0000390689 00000 n -0000390747 00000 n -0000390805 00000 n -0000390863 00000 n -0000390921 00000 n -0000390979 00000 n -0000391037 00000 n -0000391091 00000 n -0000391149 00000 n -0000391207 00000 n -0000391264 00000 n -0000391322 00000 n -0000391376 00000 n -0000391434 00000 n -0000391492 00000 n -0000391550 00000 n -0000391608 00000 n -0000391666 00000 n -0000391724 00000 n -0000391776 00000 n -0000391834 00000 n -0000391891 00000 n -0000391949 00000 n -0000392007 00000 n -0000392065 00000 n -0000392123 00000 n -0000392181 00000 n -0000392239 00000 n -0000392297 00000 n -0000392355 00000 n -0000392413 00000 n -0000392468 00000 n -0000392526 00000 n -0000392584 00000 n -0000392642 00000 n -0000392700 00000 n -0000392755 00000 n -0000392813 00000 n -0000392871 00000 n -0000392929 00000 n -0000392987 00000 n -0000393045 00000 n -0000393103 00000 n -0000393161 00000 n -0000393219 00000 n -0000393277 00000 n -0000393332 00000 n -0000393390 00000 n -0000393448 00000 n -0000393506 00000 n -0000393564 00000 n -0000393622 00000 n -0000393677 00000 n -0000393735 00000 n -0000393793 00000 n -0000393851 00000 n -0000393909 00000 n -0000393967 00000 n -0000394025 00000 n -0000394080 00000 n -0000394138 00000 n -0000394196 00000 n -0000394254 00000 n -0000394306 00000 n -0000394364 00000 n -0000394422 00000 n -0000394480 00000 n -0000394538 00000 n -0000394596 00000 n -0000394654 00000 n -0000394712 00000 n -0000394770 00000 n -0000394828 00000 n -0000394886 00000 n -0000394944 00000 n -0000395002 00000 n -0000395060 00000 n -0000395118 00000 n -0000395176 00000 n -0000395233 00000 n -0000395285 00000 n -0000395343 00000 n -0000395401 00000 n -0000395459 00000 n -0000395517 00000 n -0000395569 00000 n -0000395627 00000 n -0000395685 00000 n -0000395743 00000 n -0000395801 00000 n -0000395859 00000 n -0000395917 00000 n -0000395975 00000 n -0000396033 00000 n -0000396091 00000 n -0000396149 00000 n -0000396207 00000 n -0000396265 00000 n -0000396323 00000 n -0000396381 00000 n -0000396439 00000 n -0000396497 00000 n -0000396555 00000 n -0000396613 00000 n -0000396671 00000 n -0000396729 00000 n -0000396787 00000 n -0000396845 00000 n -0000396903 00000 n -0000396961 00000 n -0000397019 00000 n -0000397077 00000 n -0000397135 00000 n -0000397193 00000 n -0000397251 00000 n -0000397309 00000 n -0000397367 00000 n -0000397425 00000 n -0000397483 00000 n -0000397541 00000 n -0000397599 00000 n -0000397657 00000 n -0000397715 00000 n -0000397773 00000 n -0000397828 00000 n -0000397886 00000 n -0000397944 00000 n -0000398002 00000 n -0000398057 00000 n -0000398115 00000 n -0000398173 00000 n -0000398231 00000 n -0000398289 00000 n -0000398347 00000 n -0000398405 00000 n -0000398463 00000 n -0000398521 00000 n -0000398579 00000 n -0000398637 00000 n -0000398695 00000 n -0000398753 00000 n -0000398811 00000 n -0000398869 00000 n -0000398921 00000 n -0000398979 00000 n -0000399034 00000 n -0000399092 00000 n -0000399150 00000 n -0000399208 00000 n -0000399266 00000 n -0000399323 00000 n -0000399380 00000 n -0000399437 00000 n -0000399494 00000 n -0000399551 00000 n -0000399608 00000 n -0000399665 00000 n -0000399723 00000 n -0000399781 00000 n -0000399839 00000 n -0000399897 00000 n -0000399949 00000 n -0000400001 00000 n -0000400059 00000 n -0000400111 00000 n -0000400169 00000 n -0000400227 00000 n -0000400285 00000 n -0000400343 00000 n -0000400401 00000 n -0000400459 00000 n -0000400517 00000 n -0000400575 00000 n -0000400633 00000 n -0000400691 00000 n -0000400749 00000 n -0000400807 00000 n -0000400859 00000 n -0000400911 00000 n -0000400963 00000 n -0000401021 00000 n -0000401079 00000 n -0000401137 00000 n -0000401195 00000 n -0000401253 00000 n -0000401311 00000 n -0000401369 00000 n -0000401427 00000 n -0000401485 00000 n -0000401543 00000 n -0000401601 00000 n -0000401659 00000 n -0000401717 00000 n -0000401775 00000 n -0000401833 00000 n -0000401891 00000 n -0000401949 00000 n -0000402007 00000 n -0000402065 00000 n -0000402120 00000 n -0000402178 00000 n -0000402236 00000 n -0000402294 00000 n -0000402349 00000 n -0000402407 00000 n -0000402465 00000 n -0000402523 00000 n -0000402581 00000 n -0000402639 00000 n -0000402697 00000 n -0000402755 00000 n -0000402813 00000 n -0000402871 00000 n -0000402929 00000 n -0000402987 00000 n -0000403045 00000 n -0000403103 00000 n -0000403161 00000 n -0000403219 00000 n -0000403277 00000 n -0000403335 00000 n -0000403393 00000 n -0000403451 00000 n -0000403509 00000 n -0000403567 00000 n -0000403622 00000 n -0000403680 00000 n -0000403738 00000 n -0000403796 00000 n -0000403854 00000 n -0000403912 00000 n -0000403970 00000 n -0000404028 00000 n -0000404086 00000 n -0000404144 00000 n -0000404202 00000 n -0000404260 00000 n -0000404318 00000 n -0000404376 00000 n -0000404434 00000 n -0000404492 00000 n -0000404547 00000 n -0000404601 00000 n -0000404659 00000 n -0000404716 00000 n -0000404774 00000 n -0000404832 00000 n -0000404890 00000 n -0000404948 00000 n -0000405006 00000 n -0000405058 00000 n -0000405110 00000 n -0000405168 00000 n -0000405220 00000 n -0000405278 00000 n -0000405336 00000 n -0000405394 00000 n -0000405452 00000 n -0000405510 00000 n -0000405568 00000 n -0000405620 00000 n -0000405672 00000 n -0000405730 00000 n -0000405782 00000 n -0000405840 00000 n -0000405898 00000 n -0000405956 00000 n -0000406013 00000 n -0000406070 00000 n -0000406127 00000 n -0000406184 00000 n -0000406241 00000 n -0000406298 00000 n -0000406355 00000 n -0000406412 00000 n -0000406469 00000 n -0000406526 00000 n -0000406583 00000 n -0000406641 00000 n -0000406699 00000 n -0000406757 00000 n -0000406812 00000 n -0000406870 00000 n -0000406928 00000 n -0000406986 00000 n -0000407044 00000 n -0000407102 00000 n -0000407160 00000 n -0000407218 00000 n -0000407276 00000 n -0000407334 00000 n -0000407392 00000 n -0000407450 00000 n -0000407508 00000 n -0000407566 00000 n -0000407624 00000 n -0000407682 00000 n -0000407740 00000 n -0000407798 00000 n -0000407856 00000 n -0000407914 00000 n -0000407972 00000 n -0000408030 00000 n -0000408085 00000 n -0000408143 00000 n -0000408201 00000 n -0000408259 00000 n -0000408316 00000 n -0000408374 00000 n -0000408429 00000 n -0000408487 00000 n -0000408545 00000 n -0000408603 00000 n -0000408661 00000 n -0000408719 00000 n -0000408776 00000 n -0000408834 00000 n -0000408891 00000 n -0000408949 00000 n -0000409004 00000 n -0000409059 00000 n -0000409117 00000 n -0000409175 00000 n -0000409233 00000 n -0000409291 00000 n -0000409349 00000 n -0000409407 00000 n -0000409465 00000 n -0000409523 00000 n -0000409581 00000 n -0000409639 00000 n -0000409694 00000 n -0000409752 00000 n -0000409810 00000 n -0000409868 00000 n -0000409926 00000 n -0000409981 00000 n -0000410039 00000 n -0000410097 00000 n -0000410155 00000 n -0000410213 00000 n -0000410271 00000 n -0000410329 00000 n -0000410381 00000 n -0000410432 00000 n -0000410489 00000 n -0000410547 00000 n -0000410605 00000 n -0000410663 00000 n -0000410715 00000 n -0000410773 00000 n -0000410831 00000 n -0000410889 00000 n -0000410941 00000 n -0000410999 00000 n -0000411057 00000 n -0000411115 00000 n -0000411167 00000 n -0000411225 00000 n -0000411283 00000 n -0000411341 00000 n -0000411399 00000 n -0000411451 00000 n -0000411509 00000 n -0000411567 00000 n -0000411625 00000 n -0000411683 00000 n -0000411741 00000 n -0000411799 00000 n -0000411857 00000 n -0000411915 00000 n -0000411973 00000 n -0000412031 00000 n -0000412089 00000 n -0000412147 00000 n -0000412198 00000 n -0000412255 00000 n -0000412313 00000 n -0000412371 00000 n -0000412429 00000 n -0000412487 00000 n -0000412545 00000 n -0000412603 00000 n -0000412661 00000 n -0000412719 00000 n -0000412777 00000 n -0000412835 00000 n -0000412893 00000 n -0000412951 00000 n -0000413009 00000 n -0000413067 00000 n -0000413125 00000 n -0000413183 00000 n -0000413241 00000 n -0000413299 00000 n -0000413357 00000 n -0000413415 00000 n -0000413473 00000 n -0000413527 00000 n -0000413585 00000 n -0000413637 00000 n -0000413695 00000 n -0000413753 00000 n -0000413811 00000 n -0000413869 00000 n -0000413927 00000 n -0000413984 00000 n -0000414041 00000 n -0000414098 00000 n -0000414155 00000 n -0000414210 00000 n -0000414268 00000 n -0000414326 00000 n -0000414381 00000 n -0000414439 00000 n -0000414497 00000 n -0000414555 00000 n -0000414610 00000 n -0000414668 00000 n -0000414726 00000 n -0000414784 00000 n -0000414842 00000 n -0000414900 00000 n -0000414958 00000 n -0000415016 00000 n -0000415073 00000 n -0000415131 00000 n -0000415189 00000 n -0000415247 00000 n -0000415305 00000 n -0000415363 00000 n -0000415421 00000 n -0000415479 00000 n -0000415537 00000 n -0000415595 00000 n -0000415653 00000 n -0000415711 00000 n -0000415769 00000 n -0000415827 00000 n -0000415885 00000 n -0000415939 00000 n -0000415997 00000 n -0000416048 00000 n -0000416099 00000 n -0000416157 00000 n -0000416212 00000 n -0000416270 00000 n -0000416328 00000 n -0000416386 00000 n -0000416443 00000 n -0000416501 00000 n -0000416559 00000 n -0000416617 00000 n -0000416675 00000 n -0000416733 00000 n -0000416791 00000 n -0000416849 00000 n -0000416907 00000 n -0000416965 00000 n -0000417023 00000 n -0000417080 00000 n -0000417138 00000 n -0000417190 00000 n -0000417247 00000 n -0000417305 00000 n -0000417363 00000 n -0000417421 00000 n -0000417479 00000 n -0000417537 00000 n -trailer - -< <3cca0fab606035251e2b439f048f9fae>] - /Info 1 0 R /Root 2 0 R /Size 811>> -startxref -417595 -%%EOF diff --git a/doc/Altera/cv_5v1.pdf b/doc/Altera/cv_5v1.pdf deleted file mode 100644 index 2fae4ba..0000000 Binary files a/doc/Altera/cv_5v1.pdf and /dev/null differ diff --git a/doc/Altera/qts_qii51007.pdf b/doc/Altera/qts_qii51007.pdf deleted file mode 100644 index a715d96..0000000 Binary files a/doc/Altera/qts_qii51007.pdf and /dev/null differ diff --git a/doc/Altera/ug_ram.pdf b/doc/Altera/ug_ram.pdf deleted file mode 100644 index feef960..0000000 Binary files a/doc/Altera/ug_ram.pdf and /dev/null differ diff --git a/doc/Altera/ug_ram_rom.pdf b/doc/Altera/ug_ram_rom.pdf deleted file mode 100644 index 4888a16..0000000 Binary files a/doc/Altera/ug_ram_rom.pdf and /dev/null differ diff --git a/doc/DDS-XTYPES_1-1.pdf b/doc/DDS-XTYPES_1-1.pdf new file mode 100644 index 0000000..ab11f87 --- /dev/null +++ b/doc/DDS-XTYPES_1-1.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f68269d0fd83d4d056e1049c1388256f2ff3fd457e8d6bd7e1d14447431dc7af +size 1545724 diff --git a/sim/modelsim.ini b/sim/modelsim.ini index ef8dd66..d35ad92 100644 --- a/sim/modelsim.ini +++ b/sim/modelsim.ini @@ -105,7 +105,7 @@ Explicit = 1 ; Inhibit range checks on all (implicit and explicit) assignments to ; scalar objects defined with subtypes. -NoRangeCheck = 1 +NoRangeCheck = 0 [vlog] diff --git a/src/ASCII.txt b/src/ASCII.txt new file mode 100644 index 0000000..043e125 --- /dev/null +++ b/src/ASCII.txt @@ -0,0 +1,12 @@ + + ++----------+ +-------------+ +-----------+ +-----------+ +-------------+ +----------+ +|DDS Writer|->|History Cache|->|RTPS Writer|<-->|RTPS Reader|->|History Cache|->|DDS Reader| ++----------+ +-------------+ +-----------+ +-----------+ +-------------+ +----------+ + ++----------+ +-----------+ +------------+ +------------+ +-----------+ +----------+ +|DDS Writer|->|RTPS Writer|<-+->|RTPS Handler|<-->|RTPS Handler|<-+->|RTPS Reader|->|DDS Reader| ++----------+ +-----------+ | +------------+ +------------+ | +-----------+ +----------+ + +---------------------+ | | +---------------------+ + |RTPS Builtin Endpoint|<-+ +->|RTPS Builtin Endpoint| + +---------------------+ +---------------------+ \ No newline at end of file diff --git a/src/FWFT_FIFO.vhd b/src/FWFT_FIFO.vhd index 7e9f4d3..aaee200 100644 --- a/src/FWFT_FIFO.vhd +++ b/src/FWFT_FIFO.vhd @@ -9,15 +9,15 @@ entity FWFT_FIFO is ); port ( - reset : in std_logic; - clk : in std_logic; - data_in : in std_logic_vector(DATA_WIDTH-1 downto 0); - write : in std_logic; - read : in std_logic; - data_out : out std_logic_vector(DATA_WIDTH-1 downto 0); - empty : out std_logic; - full : out std_logic; - free : out natural range 0 to FIFO_DEPTH + reset : in std_logic; + clk : in std_logic; + data_in : in std_logic_vector(DATA_WIDTH-1 downto 0); + write : in std_logic; + read : in std_logic; + data_out : out std_logic_vector(DATA_WIDTH-1 downto 0); + empty : out std_logic; + full : out std_logic; + free : out natural range 0 to FIFO_DEPTH ); end entity; @@ -40,21 +40,21 @@ begin sync : process(clk, reset) variable free_var : integer range 0 to FIFO_DEPTH; begin - if(rising_edge(clk)) then - if(reset = '1') then + if rising_edge(clk) then + if (reset = '1') then fifo_data <= (others => (others => '0')); free_sig <= FIFO_DEPTH; else free_var := free_sig; - if(read = '1' and free_var < FIFO_DEPTH ) then + if (read = '1' and free_var < FIFO_DEPTH ) then for i in 1 to (FIFO_DEPTH-1) loop fifo_data(i-1) <= fifo_data(i); end loop; fifo_data(FIFO_DEPTH-1) <= (others => '0'); free_var := free_var + 1; end if; - if(write = '1') then - if(free_var > 0) then + if (write = '1') then + if (free_var > 0) then fifo_data(FIFO_DEPTH-free_var) <= data_in; free_var := free_var - 1; end if; diff --git a/src/REF.txt b/src/REF.txt index 01a8d96..c96a341 100644 --- a/src/REF.txt +++ b/src/REF.txt @@ -433,14 +433,13 @@ STATUS INFO ----------- 31............24..............16..............8...............0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -+-+-+-+-+-----------------------------------------------+-+-+-+ -|R|P|A|K| UNUSED |F|U|D| -+-+-+-+-+-----------------------------------------------+-+-+-+ ++-+-+-+-------------------------------------------------+-+-+-+ +|R|P|A| UNUSED |F|U|D| ++-+-+-+-------------------------------------------------+-+-+-+ R...Sample has been Read -P...Sample has associated Payload +P...Sample has associated DATA Payload A...Associated Payload is aligned (Payload does extend until end of last Palyload Slot) -K...Key Hash available F...FilteredFlag (1:1 PID_STATUS_INFO Mapping) U...UnregisteredFlag (1:1 PID_STATUS_INFO Mapping) D...DisposedFlag (1:1 PID_STATUS_INFO Mapping) @@ -485,7 +484,7 @@ STATUS INFO +-+-+-+-------------------------------------------------+-+-+-+ R...Sample has been ACKed -P...Sample has associated Payload +P...Sample has associated DATA Payload A...Associated Payload is aligned (Payload does extend until end of last Palyload Slot) F...FilteredFlag (1:1 PID_STATUS_INFO Mapping) U...UnregisteredFlag (1:1 PID_STATUS_INFO Mapping) @@ -529,7 +528,7 @@ READER + + 08| | +-------------------------------------------------------------+ -09| ENDPOINT_POSITION | +09| WRITER_ID | +-------------------------------------------------------------+ 10| | ~ PAYLOAD ~ @@ -544,7 +543,7 @@ STATUS INFO | |P| |K| UNUSED |F|U|D| +-+-+-+-+-----------------------------------------------+-+-+-+ -P...Sample has associated Payload +P...Sample has associated DATA Payload K...Key Hash available F...FilteredFlag (1:1 PID_STATUS_INFO Mapping) U...UnregisteredFlag (1:1 PID_STATUS_INFO Mapping) diff --git a/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd index 7fcc5a1..5fbb8ca 100644 --- a/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test1_abzkriu.vhd @@ -301,7 +301,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Best Effort, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Best Effort, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - RTPS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1556,7 +1556,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd index 59bce85..1fdf64d 100644 --- a/src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test1_arzkriu.vhd @@ -300,7 +300,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - RTPS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1562,7 +1562,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd index 324150b..7f64ae3 100644 --- a/src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test1_arzksiu.vhd @@ -300,7 +300,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, ACCESS SCOPE Instance, Unordered) - RTPS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1560,7 +1560,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd index 78d925e..27f2212 100644 --- a/src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test1_arznriu.vhd @@ -279,7 +279,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - RTPS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1011,7 +1011,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd index 9b5bfcc..734030e 100644 --- a/src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test1_lbzkriu.vhd @@ -301,7 +301,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP LAST, Best Effort, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP LAST, Best Effort, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - RTPS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1556,7 +1556,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd index 13e85b0..568f260 100644 --- a/src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test1_lrzkriu.vhd @@ -301,7 +301,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP LAST, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - RTPS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP LAST, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - RTPS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1556,7 +1556,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test2_arpkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test2_arpkriu.vhd index 2846eed..37ba7e9 100644 --- a/src/Tests/Level_0/L0_dds_reader_test2_arpkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test2_arpkriu.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Positive TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - TIME_BASED_FILTER QoS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Positive TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - TIME_BASED_FILTER QoS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -475,7 +475,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test3_arzkrio.vhd b/src/Tests/Level_0/L0_dds_reader_test3_arzkrio.vhd index 52ace5f..1aa49d8 100644 --- a/src/Tests/Level_0/L0_dds_reader_test3_arzkrio.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test3_arzkrio.vhd @@ -294,7 +294,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Ordered) - Level 0 - DDS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Ordered) - DDS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1348,7 +1348,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test3_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test3_arzkriu.vhd index 11ed429..466e2d2 100644 --- a/src/Tests/Level_0/L0_dds_reader_test3_arzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test3_arzkriu.vhd @@ -294,7 +294,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - DDS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - DDS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1347,7 +1347,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test3_arzkrto.vhd b/src/Tests/Level_0/L0_dds_reader_test3_arzkrto.vhd index 186b75d..0bef4f1 100644 --- a/src/Tests/Level_0/L0_dds_reader_test3_arzkrto.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test3_arzkrto.vhd @@ -294,7 +294,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Topic, Ordered) - Level 0 - DDS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Topic, Ordered) - DDS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1347,7 +1347,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test3_arzkrtu.vhd b/src/Tests/Level_0/L0_dds_reader_test3_arzkrtu.vhd index e12cbba..8c9a5f9 100644 --- a/src/Tests/Level_0/L0_dds_reader_test3_arzkrtu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test3_arzkrtu.vhd @@ -294,7 +294,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Topic, Unordered) - Level 0 - DDS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Topic, Unordered) - DDS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1347,7 +1347,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test3_arzksto.vhd b/src/Tests/Level_0/L0_dds_reader_test3_arzksto.vhd index c1bd0da..a77b4f9 100644 --- a/src/Tests/Level_0/L0_dds_reader_test3_arzksto.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test3_arzksto.vhd @@ -295,7 +295,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, ACCESS SCOPE Topic, Ordered) - Level 0 - DDS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, ACCESS SCOPE Topic, Ordered) - DDS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1366,7 +1366,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test3_arznriu.vhd b/src/Tests/Level_0/L0_dds_reader_test3_arznriu.vhd index c7f6ea1..294e358 100644 --- a/src/Tests/Level_0/L0_dds_reader_test3_arznriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test3_arznriu.vhd @@ -275,7 +275,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - DDS Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - DDS Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -707,7 +707,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test4_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test4_arzkriu.vhd index c55be48..eae931d 100644 --- a/src/Tests/Level_0/L0_dds_reader_test4_arzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test4_arzkriu.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - Deadline Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Deadline Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -606,7 +606,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test4_arznriu.vhd b/src/Tests/Level_0/L0_dds_reader_test4_arznriu.vhd index 0e79be9..4e8ac07 100644 --- a/src/Tests/Level_0/L0_dds_reader_test4_arznriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test4_arznriu.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - Deadline Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyless, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Deadline Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -475,7 +475,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test5_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test5_arzkriu.vhd index 276d19c..b21b6f5 100644 --- a/src/Tests/Level_0/L0_dds_reader_test5_arzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test5_arzkriu.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - Sample Rejected Status Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Sample Rejected Status Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -768,7 +768,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test6_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test6_arzkriu.vhd index f0afa38..4bbddf5 100644 --- a/src/Tests/Level_0/L0_dds_reader_test6_arzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test6_arzkriu.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - Sample Rejected Status Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Sample Rejected Status Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -538,7 +538,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_reader_test7_arzkriu.vhd b/src/Tests/Level_0/L0_dds_reader_test7_arzkriu.vhd index 0cac98e..3d0285e 100644 --- a/src/Tests/Level_0/L0_dds_reader_test7_arzkriu.vhd +++ b/src/Tests/Level_0/L0_dds_reader_test7_arzkriu.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_reader - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Level 0 - Sample Rejected Status Handling"); + SetAlertLogName("dds_reader - Level 0 - (KEEP ALL, Reliable, Zero TIME_BASED_FILTER, Keyed, BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER, ACCESS SCOPE Instance, Unordered) - Sample Rejected Status Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -478,7 +478,7 @@ begin AffirmIfEqual(sstate_id, si_sample_state, col.s(dds_cnt).sstate); AffirmIfEqual(vstate_id, si_view_state, col.s(dds_cnt).vstate); AffirmIfEqual(istate_id, si_instance_state, col.s(dds_cnt).istate); - AffirmIfEqual(ts_id, convert_from_double_word(si_source_timestamp), convert_from_double_word(col.s(dds_cnt).ts)); + AffirmIfEqual(ts_id, to_unsigned(si_source_timestamp), to_unsigned(col.s(dds_cnt).ts)); AffirmIfEqual(inst_id, to_unsigned(si_instance_handle), to_unsigned(col.s(dds_cnt).inst)); AffirmIfEqual(pub_id, to_unsigned(si_publication_handle), to_unsigned(HANDLE_NIL)); AffirmIfEqual(dis_gen_cnt_id, si_disposed_generation_count, std_logic_vector(to_unsigned(col.s(dds_cnt).dis_gen_cnt,WORD_WIDTH))); diff --git a/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd b/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd index 2013154..ba68cd8 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_afk.vhd @@ -301,7 +301,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Finite Lifespan, Keyed) - Level 0 - General"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Finite Lifespan, Keyed) - General"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -2087,15 +2087,15 @@ begin if (rtps.ret_code = OK) then AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd index 0306465..00b5482 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_aik.vhd @@ -281,7 +281,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - General"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - General"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -2067,15 +2067,15 @@ begin if (rtps.ret_code = OK) then AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd b/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd index 7405bb1..2cd8748 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_ain.vhd @@ -254,7 +254,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyless) - Level 0 - General"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyless) - General"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -991,15 +991,15 @@ begin when GET_CACHE_CHANGE => if (rtps.ret_code = OK) then AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd b/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd index 397fb72..6a95171 100644 --- a/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test1_lik.vhd @@ -281,7 +281,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - General"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - General"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -1839,15 +1839,15 @@ begin if (rtps.ret_code = OK) then AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd index 1690c24..2a328a6 100644 --- a/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test2_aik.vhd @@ -215,7 +215,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - Wait For Acknowledgements"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - Wait For Acknowledgements"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -472,15 +472,15 @@ begin if (rtps.ret_code = OK) then AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd index cb06db5..2f217ac 100644 --- a/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test3_aik.vhd @@ -232,7 +232,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - Deadline Handling"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - Deadline Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -599,15 +599,15 @@ begin AffirmIfEqual(inst_id, cc_instance_handle(2), rtps.cc.instance(2)); AffirmIfEqual(inst_id, cc_instance_handle(3), rtps.cc.instance(3)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd b/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd index 6ce2be9..a548402 100644 --- a/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test3_ain.vhd @@ -232,7 +232,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - Deadline Handling"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - Deadline Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -514,15 +514,15 @@ begin AffirmIfEqual(inst_id, cc_instance_handle(2), rtps.cc.instance(2)); AffirmIfEqual(inst_id, cc_instance_handle(3), rtps.cc.instance(3)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd b/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd index f1120d4..e6a2c05 100644 --- a/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test4_aik.vhd @@ -232,7 +232,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - Liveliness Handling"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - Liveliness Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -609,15 +609,15 @@ begin AffirmIfEqual(inst_id, cc_instance_handle(2), rtps.cc.instance(2)); AffirmIfEqual(inst_id, cc_instance_handle(3), rtps.cc.instance(3)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd b/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd index 42da8f8..0d1f715 100644 --- a/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd +++ b/src/Tests/Level_0/L0_dds_writer_test5_afk.vhd @@ -232,7 +232,7 @@ begin begin - SetAlertLogName("dds_writer - (KEEP ALL, Infinite Lifespan, Keyed) - Level 0 - Lifespan Handling"); + SetAlertLogName("dds_writer - Level 0 - (KEEP ALL, Infinite Lifespan, Keyed) - Lifespan Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); @@ -591,15 +591,15 @@ begin if (rtps.ret_code = OK) then AffirmIfEqual(inst_id, to_unsigned(cc_instance_handle), to_unsigned(rtps.cc.instance)); AffirmIfEqual(kind_id, CACHE_CHANGE_KIND_TYPE'pos(cc_kind), CACHE_CHANGE_KIND_TYPE'pos(rtps.cc.kind)); - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); - AffirmIfEqual(ts_id, convert_from_double_word(cc_source_timestamp), convert_from_double_word(rtps.cc.src_timestamp)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); + AffirmIfEqual(ts_id, to_unsigned(cc_source_timestamp), to_unsigned(rtps.cc.src_timestamp)); rtps_stage <= CHECK; rtps_cnt <= 0; end if; when GET_MIN_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when GET_MAX_SN => - AffirmIfEqual(sn_id, convert_from_double_word(cc_seq_nr), convert_from_double_word(rtps.cc.seq_nr)); + AffirmIfEqual(sn_id, to_unsigned(cc_seq_nr), to_unsigned(rtps.cc.seq_nr)); when others => null; end case; diff --git a/src/Tests/Level_0/L0_mem_ctrl_test1.vhd b/src/Tests/Level_0/L0_mem_ctrl_test1.vhd index 8ba06fe..e9ce1a0 100644 --- a/src/Tests/Level_0/L0_mem_ctrl_test1.vhd +++ b/src/Tests/Level_0/L0_mem_ctrl_test1.vhd @@ -29,6 +29,15 @@ architecture testbench of L0_mem_ctrl_test1 is signal addr : std_logic_vector(ADDR_WIDTH-1 downto 0) := (others => '0'); signal reset : std_logic := '1'; shared variable SB : osvvm.ScoreBoardPkg_slv.ScoreBoardPType; + signal stim_done, test_done : std_logic := '0'; + + -- *FUNCTION DECLARATION* + procedure wait_on_complete is + begin + if (test_done /= '1') then + wait until test_done = '1'; + end if; + end procedure; begin @@ -69,6 +78,7 @@ begin RV.InitSeed(RV'instance_name); Log("Initiating Test", INFO); + stim_done <= '0'; valid_in <= '0'; data_in <= (others => '0'); reset <= '1'; @@ -193,10 +203,8 @@ begin wait until rising_edge(clk); wait until rising_edge(clk); - -- Wait until test Completion - if (not SB.empty) then - wait until SB.empty; - end if; + stim_done <= '1'; + wait_on_complete; TranscriptOpen(RESULTS_FILE, APPEND_MODE); SetTranscriptMirror; ReportAlerts; @@ -217,6 +225,17 @@ begin end if; end process; + done_proc : process(clk) + begin + if rising_edge(clk) then + if (stim_done = '1' and SB.empty) then + test_done <= '1'; + else + test_done <= '0'; + end if; + end if; + end process; + clock_prc : process begin clk <= '0'; diff --git a/src/Tests/Level_0/L0_rtps_handler_test2.vhd b/src/Tests/Level_0/L0_rtps_handler_test2.vhd index d412122..0042eeb 100644 --- a/src/Tests/Level_0/L0_rtps_handler_test2.vhd +++ b/src/Tests/Level_0/L0_rtps_handler_test2.vhd @@ -140,13 +140,13 @@ begin locator => ( 0 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & META_IPv4_MULTICAST_PORT, + portn => UDP_PORT_INVALID & META_IPv4_MULTICAST_PORT, addr => RV.RandSlv(LOCATOR_ADDR_WIDTH) ), 1 => ( kind => LOCATOR_KIND_UDPv4, portn => RV.RandSlv(LOCATOR_PORT_WIDTH), - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_META_ADDRESS + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_META_ADDRESS ), others => EMPTY_LOCATOR ) @@ -175,7 +175,8 @@ begin -- USER when others => tmp_id := ENTITYID(k); - ref2 := (k => '1', others => '0'); + ref2 := (others => '0'); + ref2(k) := '1'; end case; for l in 0 to 1 loop -- Reader/Writer Source diff --git a/src/Tests/Level_0/L0_rtps_out_test1.vhd b/src/Tests/Level_0/L0_rtps_out_test1.vhd index b890e7d..2049f48 100644 --- a/src/Tests/Level_0/L0_rtps_out_test1.vhd +++ b/src/Tests/Level_0/L0_rtps_out_test1.vhd @@ -111,7 +111,8 @@ begin stimulus_prc : process variable RV : RandomPType; variable t1, t2, t3 : natural := 0; - variable tmp : std_logic_vector(0 to NUM_ENDPOINTS) := (others => '0'); + variable tmp : std_logic_vector(0 to NUM_ENDPOINTS) := (others => '0'); + variable tmp_packet : TEST_PACKET_TYPE := EMPTY_TEST_PACKET; procedure gen_rand_packet(size : in natural; output : inout TEST_PACKET_TYPE) is variable tmp : natural := 0; @@ -193,11 +194,14 @@ begin push_reference(1, stimulus(t3)); start_test; -- Wait until begining of t3 sending - tmp := (t3 => '0', others => '1'); + tmp := (others => '1'); + tmp(t3) := '0'; wait on rd_sig until packet_sent = tmp and rd_sig = not tmp; -- Reset Input - stimulus := (t3 => stimulus(t3), others => EMPTY_TEST_PACKET); + tmp_packet := stimulus(t3); + stimulus := (others => EMPTY_TEST_PACKET); + stimulus(t3) := tmp_packet; Log("Begin Test 2", INFO); -- Min Valid Packet gen_rand_packet(4, stimulus(t1)); @@ -213,11 +217,14 @@ begin gen_rand_packet(1, stimulus(t1)); start_test; -- Wait until all but t1 sent - tmp := (t1 => '0', others => '1'); + tmp := (others => '1'); + tmp(t1) := '0'; wait on rd_sig until packet_sent = tmp and rd_sig = not tmp; -- reset Input - stimulus := (t1 => stimulus(t1), others => EMPTY_TEST_PACKET); + tmp_packet := stimulus(t1); + stimulus := (others => EMPTY_TEST_PACKET) ; + stimulus(t1) := tmp_packet; Log("Begin Test 3", INFO); for i in 1 to NUM_ENDPOINTS+1 loop t3 := (t1+i) mod (NUM_ENDPOINTS+1); diff --git a/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd index 0d3384d..94df688 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test1_vbk.vhd @@ -76,7 +76,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -142,7 +142,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Volatile, Best Effort, Keyed) - Level 0 - Metatraffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Volatile, Best Effort, Keyed) - Metatraffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd b/src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd index 8c24ea5..4539a9f 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test1_vrk.vhd @@ -76,7 +76,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -142,7 +142,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Volatile, Reliable, Keyed) - Level 0 - Metatraffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Volatile, Reliable, Keyed) - Metatraffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd index ae8fcaf..c903fdd 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_tbk.vhd @@ -64,7 +64,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -198,7 +198,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Transient Local, Best Effort, Keyed) - Level 0 - User Traffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Transient Local, Best Effort, Keyed) - User Traffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd index 52644b6..43c4c07 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_trk.vhd @@ -64,7 +64,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -198,7 +198,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Transient Local, Reliable, Keyed) - Level 0 - User Traffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Transient Local, Reliable, Keyed) - User Traffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd index 784ce0f..d56fedb 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vbk.vhd @@ -64,7 +64,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -198,7 +198,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Volatile, Best Effort, Keyed) - Level 0 - User Traffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Volatile, Best Effort, Keyed) - User Traffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd index 6c061c6..cffb835 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vrk.vhd @@ -64,7 +64,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -198,7 +198,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Volatile, Reliable, Keyed) - Level 0 - User Traffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Volatile, Reliable, Keyed) - User Traffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd b/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd index a6bad63..ef96ad4 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test2_vrn.vhd @@ -64,7 +64,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -198,7 +198,7 @@ begin end procedure; begin - SetAlertLogName("rtps_reader - (Volatile, Reliable, Non Keyed) - Level 0 - User Traffic Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Volatile, Reliable, Non Keyed) - User Traffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd b/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd index 55cdee1..d70dd42 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test3_a.vhd @@ -60,7 +60,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -213,7 +213,7 @@ begin begin - SetAlertLogName("rtps_reader - (Automatic Liveliness) - Level 0 - Liveliness Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Automatic Liveliness) - Liveliness Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd b/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd index 92bc702..684fdaa 100644 --- a/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd +++ b/src/Tests/Level_0/L0_rtps_reader_test3_m.vhd @@ -60,7 +60,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => MANUAL_BY_TOPIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => DURATION_ZERO, @@ -213,7 +213,7 @@ begin begin - SetAlertLogName("rtps_reader - (Manual by Topic Liveliness) - Level 0 - Liveliness Handling"); + SetAlertLogName("rtps_reader - Level 0 - (Manual by Topic Liveliness) - Liveliness Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd b/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd index 50b5df7..4900c43 100644 --- a/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd +++ b/src/Tests/Level_0/L0_rtps_writer_test1_vbkdp.vhd @@ -70,7 +70,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -149,7 +149,7 @@ begin end procedure; begin - SetAlertLogName("rtps_writer - (Volatile, Best Effort, Keyed, By Reception Timestamp, Push Mode) - Level 0 - Metatraffic Handling"); + SetAlertLogName("rtps_writer - Level 0 - (Volatile, Best Effort, Keyed, By Reception Timestamp, Push Mode) - Metatraffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd b/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd index 6858af2..7b00469 100644 --- a/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd +++ b/src/Tests/Level_0/L0_rtps_writer_test1_vrkdp.vhd @@ -70,7 +70,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -149,7 +149,7 @@ begin end procedure; begin - SetAlertLogName("rtps_writer - (Volatile, Reliable, Keyed, By Reception Timestamp, Push Mode) - Level 0 - Metatraffic Handling"); + SetAlertLogName("rtps_writer - Level 0 - (Volatile, Reliable, Keyed, By Reception Timestamp, Push Mode) - Metatraffic Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_0/L0_rtps_writer_test2_vrkdp.vhd b/src/Tests/Level_0/L0_rtps_writer_test2_vrkdp.vhd index 033c254..edf9f66 100644 --- a/src/Tests/Level_0/L0_rtps_writer_test2_vrkdp.vhd +++ b/src/Tests/Level_0/L0_rtps_writer_test2_vrkdp.vhd @@ -54,7 +54,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -183,7 +183,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Reliable, Keyed, By Reception Timestamp, Push Mode) - Level 0 - Reader Liveliness Handling"); + SetAlertLogName("rtps_writer - Level 0 - (Volatile, Reliable, Keyed, By Reception Timestamp, Push Mode) - Reader Liveliness Handling"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_reader_test1_trk.vhd b/src/Tests/Level_1/L1_rtps_reader_test1_trk.vhd index 64cc492..0b3b350 100644 --- a/src/Tests/Level_1/L1_rtps_reader_test1_trk.vhd +++ b/src/Tests/Level_1/L1_rtps_reader_test1_trk.vhd @@ -83,7 +83,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => gen_duration(5,0), @@ -245,7 +245,7 @@ begin begin - SetAlertLogName("rtps_reader (Transient Local, Reliable, Keyed) - Level 1 - RTPS Output"); + SetAlertLogName("rtps_reader - Level 1 - (Transient Local, Reliable, Keyed) - RTPS Output"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_reader_test1_vrk.vhd b/src/Tests/Level_1/L1_rtps_reader_test1_vrk.vhd index df7edd0..c191097 100644 --- a/src/Tests/Level_1/L1_rtps_reader_test1_vrk.vhd +++ b/src/Tests/Level_1/L1_rtps_reader_test1_vrk.vhd @@ -84,7 +84,7 @@ begin uut : entity work.rtps_reader(arch) generic map ( ENTITYID => DEFAULT_READER_ENTITYID, - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, HEARTBEAT_RESPONSE_DELAY => gen_duration(5,0), @@ -246,7 +246,7 @@ begin begin - SetAlertLogName("rtps_reader (Volatile, Reliable, Keyed) - Level 1 - RTPS Output"); + SetAlertLogName("rtps_reader - Level 1 - (Volatile, Reliable, Keyed) - RTPS Output"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_tbkdp.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_tbkdp.vhd index e392486..2be3cbd 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_tbkdp.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_tbkdp.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -336,7 +336,7 @@ begin begin - SetAlertLogName("rtps_writer (Transient Local, Best Effort, Keyed, By Reception Timestamp, Push Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Transient Local, Best Effort, Keyed, By Reception Timestamp, Push Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_trkdn.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_trkdn.vhd index f86a86d..be6952a 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_trkdn.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_trkdn.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -336,7 +336,7 @@ begin begin - SetAlertLogName("rtps_writer (Transient Local, Reliable, Keyed, By Reception Timestamp, Pull Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Transient Local, Reliable, Keyed, By Reception Timestamp, Pull Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_trkdp.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_trkdp.vhd index 1c8a8a2..8471b3a 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_trkdp.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_trkdp.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => TRANSIENT_LOCAL_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -336,7 +336,7 @@ begin begin - SetAlertLogName("rtps_writer (Transient Local, Reliable, Keyed, By Reception Timestamp, Push Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Transient Local, Reliable, Keyed, By Reception Timestamp, Push Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_vbkdp.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_vbkdp.vhd index 2f8ecad..d881ad6 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_vbkdp.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_vbkdp.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => BEST_EFFORT_RELIABILITY_QOS, + RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -336,7 +336,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Best Effort, Keyed, By Reception Timestamp, Push Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Volatile, Best Effort, Keyed, By Reception Timestamp, Push Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_vrkdn.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_vrkdn.vhd index ae7f1b0..6e2bcde 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_vrkdn.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_vrkdn.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -336,7 +336,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Reliable, Keyed, By Reception Timestamp, Pull Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Volatile, Reliable, Keyed, By Reception Timestamp, Pull Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_vrkdp.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_vrkdp.vhd index f757ebd..386bcf1 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_vrkdp.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_vrkdp.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -336,7 +336,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Reliable, Keyed, By Reception Timestamp, Push Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Volatile, Reliable, Keyed, By Reception Timestamp, Push Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_vrksp.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_vrksp.vhd index ad928e5..0c5d82a 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_vrksp.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_vrksp.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -337,7 +337,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Reliable, Keyed, By Source Timestamp, Push Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Volatile, Reliable, Keyed, By Source Timestamp, Push Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test1_vrndp.vhd b/src/Tests/Level_1/L1_rtps_writer_test1_vrndp.vhd index 6db3115..3488c56 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test1_vrndp.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test1_vrndp.vhd @@ -77,7 +77,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => AUTOMATIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -339,7 +339,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Reliable, Non Keyed, By Reception Timestamp, Push Mode) - Level 1 - RTPS Output (DATA & GAP)"); + SetAlertLogName("rtps_writer - Level 1 - (Volatile, Reliable, Non Keyed, By Reception Timestamp, Push Mode) - RTPS Output (DATA & GAP)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/Level_1/L1_rtps_writer_test2_vrkdn.vhd b/src/Tests/Level_1/L1_rtps_writer_test2_vrkdn.vhd index 288bc67..37e7984 100644 --- a/src/Tests/Level_1/L1_rtps_writer_test2_vrkdn.vhd +++ b/src/Tests/Level_1/L1_rtps_writer_test2_vrkdn.vhd @@ -76,7 +76,7 @@ begin -- Unit Under Test uut : entity work.rtps_writer(arch) generic map ( - RELIABILTY_QOS => RELIABLE_RELIABILITY_QOS, + RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS, LIVELINESS_QOS => MANUAL_BY_TOPIC_LIVELINESS_QOS, DURABILITY_QOS => VOLATILE_DURABILITY_QOS, DESTINATION_ORDER_QOS => BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER_QOS, @@ -277,7 +277,7 @@ begin begin - SetAlertLogName("rtps_writer (Volatile, Reliable, Keyed, By Reception Timestamp, Pull Mode) - Level 1 - RTPS Output (HEARTBEAT)"); + SetAlertLogName("rtps_writer - Level 1 - (Volatile, Reliable, Keyed, By Reception Timestamp, Pull Mode) - RTPS Output (HEARTBEAT)"); SetAlertEnable(FAILURE, TRUE); SetAlertEnable(ERROR, TRUE); SetAlertEnable(WARNING, TRUE); diff --git a/src/Tests/test_config.vhd b/src/Tests/test_config.vhd index 5723e58..37bca1e 100644 --- a/src/Tests/test_config.vhd +++ b/src/Tests/test_config.vhd @@ -175,7 +175,7 @@ package user_config is constant ENDPOINT_RELIABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := ( 15 => BEST_EFFORT_RELIABILITY_QOS, NUM_READERS+3 => BEST_EFFORT_RELIABILITY_QOS, - others => DEFAULT_RELIABILTY_QOS + others => DEFAULT_RELIABILITY_QOS ); -- (Only relevant to Writers) constant ENDPOINT_MAX_BLOCKING_TIME : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := ( @@ -215,4 +215,7 @@ package user_config is -- TESTING PARAMETERS constant TEST_STRING : string := "TEST_CONFIG_1"; + -- Set to TRUE for Simulation Testing (Extra Code generated) + constant SIMULATION_FLAG : boolean := TRUE; + end package; \ No newline at end of file diff --git a/src/Tests/testbench.pro b/src/Tests/testbench.pro index 4f17197..8067eb8 100644 --- a/src/Tests/testbench.pro +++ b/src/Tests/testbench.pro @@ -84,15 +84,15 @@ analyze Level_0/L0_dds_reader_test7_arzkriu.vhd simulate L0_rtps_handler_test1 simulate L0_rtps_handler_test2 +simulate L0_rtps_out_test1 +simulate L0_mem_ctrl_test1 simulate L0_rtps_builtin_endpoint_test1 simulate L0_rtps_builtin_endpoint_test2 simulate L0_rtps_builtin_endpoint_test3 simulate L0_rtps_builtin_endpoint_test4 simulate L0_rtps_builtin_endpoint_test5 simulate L0_rtps_builtin_endpoint_test6 -simulate L0_rtps_out_test1 simulate L1_rtps_builtin_endpoint_test1 -simulate L0_mem_ctrl_test1 simulate L0_rtps_reader_test1_vrk simulate L0_rtps_reader_test1_vbk simulate L0_rtps_reader_test2_vrk @@ -106,6 +106,7 @@ simulate L1_rtps_reader_test1_vrk simulate L1_rtps_reader_test1_trk simulate L0_rtps_writer_test1_vrkdp simulate L0_rtps_writer_test1_vbkdp +simulate L0_rtps_writer_test2_vrkdp simulate L1_rtps_writer_test1_vrkdp simulate L1_rtps_writer_test1_trkdp simulate L1_rtps_writer_test1_tbkdp @@ -115,7 +116,6 @@ simulate L1_rtps_writer_test1_vrksp simulate L1_rtps_writer_test1_vrkdn simulate L1_rtps_writer_test1_trkdn simulate L1_rtps_writer_test2_vrkdn -simulate L0_rtps_writer_test2_vrkdp simulate L0_dds_writer_test1_aik simulate L0_dds_writer_test1_ain simulate L0_dds_writer_test1_lik diff --git a/src/dds_reader.vhd b/src/dds_reader.vhd index d366732..6e623f7 100644 --- a/src/dds_reader.vhd +++ b/src/dds_reader.vhd @@ -155,7 +155,7 @@ architecture arch of dds_reader is -- Address pointing to the beginning of the first Instance Data Frame constant FIRST_INSTANCE_ADDRESS : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); - -- *SAMPLE MEMORY FRAME FORMAT* + -- *SAMPLE MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant SMF_STATUS_INFO_OFFSET : natural := 0; constant SMF_TIMESTAMP_OFFSET : natural := 1; @@ -173,12 +173,12 @@ architecture arch of dds_reader is constant SMF_PREV_ADDR_OFFSET : natural := SMF_NO_WRITERS_GEN_CNT_OFFSET + 1; constant SMF_NEXT_ADDR_OFFSET : natural := SMF_PREV_ADDR_OFFSET + 1; - -- *PAYLOAD MEMORY FRAME FORMAT* + -- *PAYLOAD MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant PMF_NEXT_ADDR_OFFSET : natural := 0; constant PMF_PAYLOAD_OFFSET : natural := 1; - -- *INSTANCE MEMORY FRAME OFFSET* + -- *INSTANCE MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant IMF_NEXT_ADDR_OFFSET : natural := 0; constant IMF_KEY_HASH_OFFSET : natural := 1; @@ -195,7 +195,7 @@ architecture arch of dds_reader is end function; constant IMF_WRITER_BITMAP_OFFSET : natural := gen_imf_writer_bitmap_offset(TIME_BASED_FILTER_QOS); - -- *INSTANCE MEMORY FRAME FORMAT FLAGS* + -- *INSTANCE MEMORY FRAME FIELD FLAGS* -- Flags mapping to the respective Endpoint Memory Frame Fields constant IMF_FLAG_WIDTH : natural := 7; constant IMF_KEY_HASH_FLAG : std_logic_vector(0 to IMF_FLAG_WIDTH-1) := (0 => '1', others => '0'); @@ -218,15 +218,22 @@ architecture arch of dds_reader is REMOVE_INSTANCE, UNMARK_INSTANCES, RESET_MEMORY); -- *Instance Memory Opcodes* -- OPCODE DESCRIPTION - -- SEARCH_INSTANCE_HASH Search Instance based on Key Hash pointed by key_hash. - -- SEARCH_INSTANCE_ADDR Search Instance based on Instance Pointer pointed by inst_addr_update. [This is needed to mark the previous Instance for Instance Removal] + -- SEARCH_INSTANCE_HASH Search Instance based on Key Hash pointed by "key_hash". + -- Set "inst_addr_base" to Base Address of found Instance, of INSTANCE_MEMORY_MAX_ADDRESS if nothing found. + -- "inst_data" contains Instance Data according to "inst_mem_fields". + -- SEARCH_INSTANCE_ADDR Search Instance based on Instance Pointer pointed by "inst_addr_update". + -- Set "inst_addr_base" to "inst_addr_update" + -- "inst_data" contains Instance Data according to "inst_mem_fields". -- INSERT_INSTANCE Insert Instance to memory. The Instance is inserted in Key Hash Numerical Order. - -- UPDATE_INSTANCE Update Instance Data pointed by inst_addr_base. (inst_mem_fields specifies which Fields to update) - -- GET_FIRST_INSTANCE Get Instance Data of first Instance (Instance with smallest Key Hash Numerical Order). (inst_mem_fields specifies which Fields to get) - -- GET_NEXT_INSTANCE Get Instance Data of next Instance (from the Instance pointed by inst_addr_base) (inst_mem_fields specifies which Fields to get) - -- REMOVE_INSTANCE Remove Instance pointed by inst_addr_base - -- GET_INSTANCE Get Data of Instance pointed by inst_addr_update. (inst_mem_fields specifies which Fields to get) - -- UNMARK_INSTANCES Reset the MARK_FLAG of all stored Instances + -- UPDATE_INSTANCE Update Instance Data pointed by "inst_addr_base" according to "inst_mem_fields" + -- GET_FIRST_INSTANCE Get Instance Data of first Instance (Instance with smallest Key Hash Numerical Order) according to "inst_mem_fields". + -- Set "inst_addr_base" to Address of Instance or INSTANCE_MEMORY_MAX_ADDRESS if no Instance in Memory. + -- GET_NEXT_INSTANCE Get Instance Data of next Instance (from the Instance pointed by "inst_addr_base") according to "inst_mem_fields". + -- Set "inst_addr_base" to Address of Instance or INSTANCE_MEMORY_MAX_ADDRESS if no other Instance in Memory. + -- REMOVE_INSTANCE Remove Instance pointed by "inst_addr_base". + -- GET_INSTANCE Get Data of Instance pointed by "inst_addr_update" according to "inst_mem_fields". + -- Already fetched Data of the Participant is not modified. + -- UNMARK_INSTANCES Reset the MARK_FLAG of all Instances in Memory. type INSTANCE_OPCODE_TYPE is (NOP, SEARCH_INSTANCE_HASH, SEARCH_INSTANCE_ADDR, INSERT_INSTANCE, UPDATE_INSTANCE, GET_FIRST_INSTANCE, GET_NEXT_INSTANCE, REMOVE_INSTANCE, GET_INSTANCE, UNMARK_INSTANCES); type WRITER_BITMAP_ARRAY_TYPE is array (0 to round_div(MAX_REMOTE_ENDPOINTS, WORD_WIDTH)-1) of std_logic_vector(0 to WORD_WIDTH-1); @@ -325,8 +332,8 @@ architecture arch of dds_reader is signal remove_oldest_sample, remove_oldest_sample_next : std_logic := '0'; -- Denotes if the oldest sample of the Instance with 'key_hash' should be removed signal remove_oldest_inst_sample, remove_oldest_inst_sample_next : std_logic := '0'; - -- Remote Writer Endpoint Bitmap Position - signal writer_pos, writer_pos_next : natural range 0 to MAX_REMOTE_ENDPOINTS-1 := 0; + -- Remote Writer ID + signal writer_id, writer_id_next : natural range 0 to MAX_REMOTE_ENDPOINTS-1 := 0; -- Key Hash Latch signal key_hash, key_hash_next : KEY_HASH_TYPE := HANDLE_NIL; -- RTPS Return Code Latch @@ -509,7 +516,7 @@ architecture arch of dds_reader is alias next_inst_next : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) is inst_addr_latch_2_next; alias first_payload : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2; alias first_payload_next : unsigned(PAYLOAD_MEMORY_ADDR_WIDTH-1 downto 0) is payload_addr_latch_2_next; - alias has_data : std_logic is sample_status_info(SSI_PAYLOAD_FLAG); + alias has_data : std_logic is sample_status_info(SSI_DATA_FLAG); alias has_key_hash : std_logic is sample_status_info(SSI_KEY_HASH_FLAG); -- *FUNCTION DECLARATION* @@ -533,6 +540,19 @@ architecture arch of dds_reader is return ret; end function; + -- This function caps the range of a natural. + -- This is needed, because during simulation some values may be outside the range due to delta time delays. + function cap_range(input : in integer; max : in natural) return natural is + begin + if (input > max and SIMULATION_FLAG) then + return max; + elsif (input < 0 and SIMULATION_FLAG) then + return 0; + else + return input; + end if; + end function; + begin --*****COMPONENT INSTANTIATION***** @@ -675,7 +695,7 @@ begin sample_addr_latch_3_next <= sample_addr_latch_3; sample_addr_latch_4_next <= sample_addr_latch_4; sample_addr_latch_5_next <= sample_addr_latch_5; - writer_pos_next <= writer_pos; + writer_id_next <= writer_id; key_hash_next <= key_hash; sample_status_info_next <= sample_status_info; remove_oldest_sample_next <= remove_oldest_sample; @@ -911,7 +931,7 @@ begin -- Synthesis Guard if (WITH_KEY) then -- Latch Writer Pos - writer_pos_next <= to_integer(unsigned(data_in_rtps)); + writer_id_next <= to_integer(unsigned(data_in_rtps)); stage_next <= REMOVE_WRITER; cnt_next <= 2; else @@ -925,7 +945,7 @@ begin inst_data_next2.writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); -- NOT_ALIVE_NO_WRITERS Transition - if (tmp_bitmap = (tmp_bitmap'range => '0') and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '0') then + if (tmp_bitmap = (tmp_bitmap'reverse_range => '0') and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '0') then trigger_sample_gen_next <= '1'; inst_data_next2.status_info(ISI_GENERATE_SAMPLE_FLAG) <= '1'; inst_data_next2.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; @@ -1161,13 +1181,14 @@ begin -- NOTE: The ALIGNED_FLAG is set by default. if actual Payload is not aligned, need to reset. sample_valid_in <= '1'; sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; - sample_write_data <= data_in_rtps; - sample_write_data(SSI_READ_FLAG) <= '0'; - sample_write_data(SSI_ALIGNED_FLAG) <= data_in_rtps(SSI_PAYLOAD_FLAG); + sample_write_data <= data_in_rtps; + sample_write_data(SSI_KEY_HASH_FLAG) <= '0'; -- Key Hash Flag is not stored + sample_write_data(SSI_READ_FLAG) <= '0'; + sample_write_data(SSI_ALIGNED_FLAG) <= data_in_rtps(SSI_DATA_FLAG); -- Latch Status Info sample_status_info_next <= data_in_rtps; sample_status_info_next(SSI_READ_FLAG) <= '0'; - sample_status_info_next(SSI_ALIGNED_FLAG) <= data_in_rtps(SSI_PAYLOAD_FLAG); + sample_status_info_next(SSI_ALIGNED_FLAG) <= data_in_rtps(SSI_DATA_FLAG); -- Memory Flow Control Guard if (sample_ready_in = '1') then ready_in_rtps <= '1'; @@ -1297,7 +1318,7 @@ begin if (valid_in_rtps = '1') then ready_in_rtps <= '1'; -- Latch Input, but do not pass to Memory - writer_pos_next <= to_integer(unsigned(data_in_rtps)); + writer_id_next <= cap_range(to_integer(unsigned(data_in_rtps)), MAX_REMOTE_ENDPOINTS-1); cnt_next <= cnt + 1; end if; -- SET Payload Address @@ -1597,6 +1618,7 @@ begin -- Wait for Instance Search to finish if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_IGNORE_DEADLINE_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG) severity FAILURE; -- Instance Found if (not WITH_KEY or inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then @@ -1763,7 +1785,7 @@ begin sample_cnt <= to_unsigned(1, WORD_WIDTH); deadline <= (time + TIME_BASED_FILTER_QOS) when (TIME_BASED_FILTER_QOS /= DURATION_ZERO) else TIME_INVALID; tmp_bitmap := (others => '0'); - tmp_bitmap(writer_pos) := '1'; + tmp_bitmap(writer_id) := '1'; writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); if (DESTINATION_ORDER_QOS = BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS and newest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) then @@ -1822,7 +1844,7 @@ begin sample_cnt <= to_unsigned(1, WORD_WIDTH); deadline <= (time + TIME_BASED_FILTER_QOS) when (TIME_BASED_FILTER_QOS /= DURATION_ZERO) else TIME_INVALID; tmp_bitmap := (others => '0'); - tmp_bitmap(writer_pos) := '1'; + tmp_bitmap(writer_id) := '1'; writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); if (DESTINATION_ORDER_QOS = BY_SOURCE_TIMESTAMP_DESTINATION_ORDER_QOS and newest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) then @@ -2039,6 +2061,8 @@ begin -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_WRITER_BITMAP_FLAG or IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_IGNORE_DEADLINE_FLAG) severity FAILURE; + -- DEFAULT STATUS INFO (LIVELINESS) if (WITH_KEY) then tmp_update := IMF_STATUS_FLAG; @@ -2054,9 +2078,9 @@ begin -- ALIVE/FILTERED/DISPOSE Operation if (sample_status_info(SSI_UNREGISTERED_FLAG) /= '1') then -- Write if Writer New for Instance - if (tmp_bitmap(writer_pos) /= '1') then + if (tmp_bitmap(writer_id) /= '1') then -- Insert Writer - tmp_bitmap(writer_pos) := '1'; + tmp_bitmap(writer_id) := '1'; -- Convert Back -- Synthesis Guard if (WITH_KEY) then @@ -2068,9 +2092,9 @@ begin end if; else -- Write if Writer New for Instance - if (tmp_bitmap(writer_pos) /= '0') then + if (tmp_bitmap(writer_id) /= '0') then -- Insert Writer - tmp_bitmap(writer_pos) := '0'; + tmp_bitmap(writer_id) := '0'; -- Convert Back -- Synthesis Guard if (WITH_KEY) then @@ -2128,7 +2152,7 @@ begin end if; end if; -- * -> NOT_ALIVE_NO_WRITERS Transition - elsif (sample_status_info(SSI_UNREGISTERED_FLAG) = '1' and tmp_bitmap = (tmp_bitmap'range => '0')) then + elsif (sample_status_info(SSI_UNREGISTERED_FLAG) = '1' and tmp_bitmap = (tmp_bitmap'reverse_range => '0')) then -- NOT_ALIVE -> NOT_ALIVE_NO_WRITERS if (inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '1' or inst_data.status_info(ISI_NOT_ALIVE_NO_WRITERS_FLAG) = '1') then tmp_bool := FALSE; @@ -2206,7 +2230,7 @@ begin -- Synthesis Guard if (WITH_KEY) then -- Stale Instance Transition - if (inst_data.sample_cnt = 0 and inst_data.writer_bitmap /= ZERO_WRITER_BITMAP_ARRAY and tmp_bitmap = (tmp_bitmap'range => '0')) then + if (inst_data.sample_cnt = 0 and inst_data.writer_bitmap /= ZERO_WRITER_BITMAP_ARRAY and tmp_bitmap = (tmp_bitmap'reverse_range => '0')) then stale_inst_cnt_next <= stale_inst_cnt + 1; end if; end if; @@ -2276,6 +2300,7 @@ begin -- Wait for instance Update to Complete if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG) severity FAILURE; case (cnt) is -- SET Disposed Generation Counter @@ -2481,181 +2506,187 @@ begin end case; when GENERATE_SAMPLE => -- Precondition: cur_sample set, cur_inst set, inst_data set (IMF_DISPOSED_CNT_FLAG, IMF_NO_WRITERS_CNT_FLAG) - case (cnt) is - -- GET Next Sample (Empty List) - when 0 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; - sample_read <= '1'; - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Sample Status Info - when 1 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; - sample_write_data <= (SSI_UNREGISTERED_FLAG => '1', others => '0'); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Timestamp 1/2 - when 2 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_TIMESTAMP_OFFSET; - sample_write_data <= std_logic_vector(time(0)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Timestamp 2/2 - when 3 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_TIMESTAMP_OFFSET + 1; - sample_write_data <= std_logic_vector(time(1)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Lifespan 1/2 - when 4 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_LIFESPAN_DEADLINE_OFFSET; - sample_write_data <= std_logic_vector(TIME_INVALID(0)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Lifespan 2/2 - when 5 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_LIFESPAN_DEADLINE_OFFSET + 1; - sample_write_data <= std_logic_vector(TIME_INVALID(1)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Payload Pointer - when 6 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(PAYLOAD_MEMORY_MAX_ADDRESS,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Instance Pointer - when 7 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_INSTANCE_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(cur_inst,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Disposed Generation Count - when 8 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_DISPOSED_GEN_CNT_OFFSET; - sample_write_data <= std_logic_vector(inst_data.disposed_gen_cnt); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET No Writers Generation Count - when 9 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NO_WRITERS_GEN_CNT_OFFSET; - sample_write_data <= std_logic_vector(inst_data.no_writers_gen_cnt); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Previous Sample Pointer - when 10 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_PREV_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(newest_sample,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- SET Next Sample Pointer - when 11 => - sample_valid_in <= '1'; - sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(SAMPLE_MEMORY_MAX_ADDRESS,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - assert (newest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; - cnt_next <= cnt + 1; - end if; - -- SET Next Sample Pointer (Previous Sample) - when 12 => - sample_valid_in <= '1'; - sample_addr <= newest_sample + SMF_NEXT_ADDR_OFFSET; - sample_write_data <= std_logic_vector(resize(empty_sample_list_head,WORD_WIDTH)); - - -- Memory Flow Control Guard - if (sample_ready_in = '1') then - cnt_next <= cnt + 1; - end if; - -- READ Next Address (Empty List) - when 13 => - sample_ready_out <= '1'; - - -- Memory Flow Control Guard - if (sample_valid_out = '1') then - -- Update Sample List Pointer - newest_sample_next <= cur_sample; - empty_sample_list_head_next <= resize(unsigned(sample_read_data), SAMPLE_MEMORY_ADDR_WIDTH); + + -- Wait for Instane Data + if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_DISPOSED_CNT_FLAG or IMF_NO_WRITERS_CNT_FLAG) severity FAILURE; + + case (cnt) is + -- GET Next Sample (Empty List) + when 0 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; + sample_read <= '1'; - -- Signal Data Available - status_sig_next <= status_sig or DATA_AVAILABLE_STATUS; - - if (WITH_KEY and remove_oldest_inst_sample = '1') then - assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; - - cur_sample_next <= oldest_sample; - stage_next <= FIND_OLDEST_INST_SAMPLE; - cnt_next <= 0; - elsif (remove_oldest_sample = '1') then - assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; - - -- Synthesis Guard - if (WITH_KEY) then - stage_next <= GET_OLDEST_SAMPLE_INSTANCE; - cnt_next <= 0; - else - cur_sample_next <= oldest_sample; - stage_next <= REMOVE_SAMPLE; - cnt_next <= 0; - end if; - elsif (trigger_sample_gen = '1') then - -- Continue - stage_next <= PROCESS_PENDING_SAMPLE_GENERATION; - cnt_next <= 1; - else - -- DONE - stage_next <= IDLE; + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; end if; - end if; - when others => - null; - end case; + -- SET Sample Status Info + when 1 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_STATUS_INFO_OFFSET; + sample_write_data <= (SSI_UNREGISTERED_FLAG => '1', others => '0'); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Timestamp 1/2 + when 2 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_TIMESTAMP_OFFSET; + sample_write_data <= std_logic_vector(time(0)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Timestamp 2/2 + when 3 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_TIMESTAMP_OFFSET + 1; + sample_write_data <= std_logic_vector(time(1)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Lifespan 1/2 + when 4 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_LIFESPAN_DEADLINE_OFFSET; + sample_write_data <= std_logic_vector(TIME_INVALID(0)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Lifespan 2/2 + when 5 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_LIFESPAN_DEADLINE_OFFSET + 1; + sample_write_data <= std_logic_vector(TIME_INVALID(1)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Payload Pointer + when 6 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PAYLOAD_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(PAYLOAD_MEMORY_MAX_ADDRESS,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Instance Pointer + when 7 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_INSTANCE_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(cur_inst,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Disposed Generation Count + when 8 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_DISPOSED_GEN_CNT_OFFSET; + sample_write_data <= std_logic_vector(inst_data.disposed_gen_cnt); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET No Writers Generation Count + when 9 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NO_WRITERS_GEN_CNT_OFFSET; + sample_write_data <= std_logic_vector(inst_data.no_writers_gen_cnt); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Previous Sample Pointer + when 10 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_PREV_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(newest_sample,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- SET Next Sample Pointer + when 11 => + sample_valid_in <= '1'; + sample_addr <= cur_sample + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(SAMPLE_MEMORY_MAX_ADDRESS,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + assert (newest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; + cnt_next <= cnt + 1; + end if; + -- SET Next Sample Pointer (Previous Sample) + when 12 => + sample_valid_in <= '1'; + sample_addr <= newest_sample + SMF_NEXT_ADDR_OFFSET; + sample_write_data <= std_logic_vector(resize(empty_sample_list_head,WORD_WIDTH)); + + -- Memory Flow Control Guard + if (sample_ready_in = '1') then + cnt_next <= cnt + 1; + end if; + -- READ Next Address (Empty List) + when 13 => + sample_ready_out <= '1'; + + -- Memory Flow Control Guard + if (sample_valid_out = '1') then + -- Update Sample List Pointer + newest_sample_next <= cur_sample; + empty_sample_list_head_next <= resize(unsigned(sample_read_data), SAMPLE_MEMORY_ADDR_WIDTH); + + -- Signal Data Available + status_sig_next <= status_sig or DATA_AVAILABLE_STATUS; + + if (WITH_KEY and remove_oldest_inst_sample = '1') then + assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; + + cur_sample_next <= oldest_sample; + stage_next <= FIND_OLDEST_INST_SAMPLE; + cnt_next <= 0; + elsif (remove_oldest_sample = '1') then + assert (oldest_sample /= SAMPLE_MEMORY_MAX_ADDRESS) severity FAILURE; + + -- Synthesis Guard + if (WITH_KEY) then + stage_next <= GET_OLDEST_SAMPLE_INSTANCE; + cnt_next <= 0; + else + cur_sample_next <= oldest_sample; + stage_next <= REMOVE_SAMPLE; + cnt_next <= 0; + end if; + elsif (trigger_sample_gen = '1') then + -- Continue + stage_next <= PROCESS_PENDING_SAMPLE_GENERATION; + cnt_next <= 1; + else + -- DONE + stage_next <= IDLE; + end if; + end if; + when others => + null; + end case; + end if; when GET_OLDEST_SAMPLE_INSTANCE => -- Synthesis Guard if (WITH_KEY) then @@ -2755,7 +2786,7 @@ begin if (inst_op_done = '1') then inst_op_start <= '1'; inst_opcode <= GET_INSTANCE; - inst_mem_fields <= IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG; + inst_mem_fields <= IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG or IMF_STATUS_FLAG; inst_addr_update <= cur_inst; cnt_next <= cnt + 1; end if; @@ -2960,6 +2991,8 @@ begin -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG or IMF_STATUS_FLAG) severity FAILURE; + -- Synthesis Guard if (WITH_KEY) then -- Stale Instance Update @@ -3045,12 +3078,16 @@ begin null; end case; when REMOVE_WRITER => + -- Precondition: inst_data set (IMF_WRITER_BITMAP_FLAG, IMF_STATUS_FLAG, IMF_SAMPLE_CNT_FLAG) + -- Synthesis Guard if (WITH_KEY) then -- Memory Operation Guard if (inst_op_done = '1') then case (cnt) is when 0 => + assert check_mask(current_imf, IMF_WRITER_BITMAP_FLAG or IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG) severity FAILURE; + -- No More Instances if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then -- DONE @@ -3062,7 +3099,7 @@ begin tmp_bitmap := from_writer_bitmap_array(inst_data.writer_bitmap); -- Remove Writer - tmp_bitmap(writer_pos) := '0'; + tmp_bitmap(writer_id) := '0'; -- NOTE: writer_bitmap is not latched, since the memory process is latching it at the -- same clock cycle. @@ -3070,7 +3107,7 @@ begin writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); -- NOT_ALIVE_NO_WRITERS Transition - if (tmp_bitmap = (tmp_bitmap'range => '0') and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '0') then + if (tmp_bitmap = (tmp_bitmap'reverse_range => '0') and inst_data.status_info(ISI_NOT_ALIVE_DISPOSED_FLAG) = '0') then trigger_sample_gen_next <= '1'; status_info_update <= inst_data.status_info; status_info_update(ISI_NOT_ALIVE_NO_WRITERS_FLAG) <= '1'; @@ -3085,7 +3122,7 @@ begin end if; -- Update Stale Instance Count - if (tmp_bitmap = (tmp_bitmap'range => '0') and inst_data.sample_cnt = 0) then + if (tmp_bitmap = (tmp_bitmap'reverse_range => '0') and inst_data.sample_cnt = 0) then stale_inst_cnt_next <= stale_inst_cnt + 1; end if; @@ -3119,6 +3156,8 @@ begin case (cnt) is -- Find and Remove First Stale Instance when 0 => + assert check_mask(current_imf, IMF_SAMPLE_CNT_FLAG or IMF_WRITER_BITMAP_FLAG) severity FAILURE; + -- Iterated through all Instances if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then -- NOTE: We should enter this state only if there is at least one stale Instance to be removed, so we should never enter this branch. @@ -3150,7 +3189,7 @@ begin sample_cnt <= to_unsigned(1, WORD_WIDTH); deadline <= (time + TIME_BASED_FILTER_QOS) when (TIME_BASED_FILTER_QOS /= DURATION_ZERO) else TIME_INVALID; tmp_bitmap := (others => '0'); - tmp_bitmap(writer_pos) := '1'; + tmp_bitmap(writer_id) := '1'; writer_bitmap <= to_writer_bitmap_array(tmp_bitmap); -- Latch Instance Pointer @@ -3356,6 +3395,7 @@ begin when 7 => -- Wait for Instance Data if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG) severity FAILURE; assert (next_inst = inst_addr_base) severity FAILURE; -- DEFAULT @@ -3793,6 +3833,7 @@ begin if (WITH_KEY) then -- Wait for Instance Data if (inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG) severity FAILURE; assert (next_inst = inst_addr_base) severity FAILURE; -- DEFAULT @@ -3947,6 +3988,7 @@ begin when 2 => -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG) severity FAILURE; -- NOTE: If we have a presentation of consecutive same instance samples of multiple instances, we have to -- mark the instances we have already handled, in order to prevent the GET_NEXT_SAMPLE state to -- re-process them. @@ -3954,6 +3996,7 @@ begin if (si_sample_rank_sig = 0) then -- Synthesis Guard if (WITH_KEY) then + inst_op_start <= '1'; inst_opcode <= UPDATE_INSTANCE; inst_mem_fields <= IMF_STATUS_FLAG; @@ -4175,6 +4218,8 @@ begin inst_mem_fields <= IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG; cnt_next <= 2; when 2 => + assert check_mask(current_imf, IMF_STATUS_FLAG) severity FAILURE; + -- Instance Found if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then -- DEFAULT @@ -4265,6 +4310,8 @@ begin inst_mem_fields <= IMF_STATUS_FLAG; cnt_next <= cnt + 1; when 1 => + assert check_mask(current_imf, IMF_STATUS_FLAG) severity FAILURE; + -- Instance Found if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then -- DEFAULT @@ -4482,6 +4529,8 @@ begin inst_mem_fields <= IMF_STATUS_FLAG; cnt_next <= cnt + 1; when 2 => + assert check_mask(current_imf, IMF_STATUS_FLAG) severity FAILURE; + -- Instance Found if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then -- Sample needs to be Generated @@ -4505,6 +4554,8 @@ begin stage_next <= IDLE; end if; when 3 => + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG) severity FAILURE; + -- RESOURCE_LIMITS_QOS (MAX_SAMPLES_PER_INSTANCE) if (WITH_KEY and MAX_SAMPLES_PER_INSTANCE /= LENGTH_UNLIMITED and inst_data.sample_cnt = unsigned(MAX_SAMPLES_PER_INSTANCE)) then if (HISTORY_QOS = KEEP_ALL_HISTORY_QOS and RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then @@ -4724,6 +4775,8 @@ begin cnt_next <= 2; -- Check Instance when 2 => + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG) severity FAILURE; + -- Reached End of Instances if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then -- DONE @@ -4783,8 +4836,10 @@ begin if (sample_ready_in = '1') then if (cur_sample = MAX_SAMPLE_ADDRESS) then -- DONE - stage_next <= RESET_PAYLOAD_MEMORY; - cnt_next <= 0; + stage_next <= RESET_PAYLOAD_MEMORY; + cnt_next <= 0; + empty_sample_list_head_next <= FIRST_SAMPLE_ADDRESS; + empty_sample_list_tail_next <= MAX_SAMPLE_ADDRESS; else -- Continue cur_sample_next <= cur_sample + SAMPLE_FRAME_SIZE; @@ -4815,7 +4870,8 @@ begin if (payload_ready_in = '1') then if (cur_payload = MAX_PAYLOAD_ADDRESS) then -- DONE - stage_next <= IDLE; + stage_next <= IDLE; + empty_payload_list_head_next <= FIRST_PAYLOAD_ADDRESS; else cur_payload_next <= cur_payload + PAYLOAD_FRAME_SIZE; end if; @@ -4940,6 +4996,7 @@ begin when UPDATE_INSTANCE => current_imf_next <= current_imf or inst_mem_fields; inst_stage_next <= UPDATE_INSTANCE; + if check_mask(inst_mem_fields,IMF_STATUS_FLAG) then inst_cnt_next <= 0; elsif check_mask(inst_mem_fields,IMF_SAMPLE_CNT_FLAG) then @@ -5001,6 +5058,7 @@ begin else current_imf_next <= current_imf or inst_mem_fields; end if; + -- Get Instance Data inst_stage_next <= GET_INSTANCE_DATA; if check_mask(inst_mem_fields,IMF_KEY_HASH_FLAG) then @@ -6462,7 +6520,8 @@ begin if (inst_ready_in = '1') then if (inst_addr_base = MAX_INSTANCE_ADDRESS) then -- DONE - inst_stage_next <= IDLE; + inst_stage_next <= IDLE; + inst_empty_head_next <= FIRST_INSTANCE_ADDRESS; else inst_addr_base_next <= inst_addr_base + INSTANCE_FRAME_SIZE; end if; @@ -6484,14 +6543,14 @@ begin inst_stage <= RESET_MEMORY; newest_sample <= SAMPLE_MEMORY_MAX_ADDRESS; oldest_sample <= SAMPLE_MEMORY_MAX_ADDRESS; - empty_sample_list_head <= FIRST_SAMPLE_ADDRESS; - empty_sample_list_tail <= MAX_SAMPLE_ADDRESS; - empty_payload_list_head <= FIRST_PAYLOAD_ADDRESS; + empty_sample_list_head <= SAMPLE_MEMORY_MAX_ADDRESS; + empty_sample_list_tail <= SAMPLE_MEMORY_MAX_ADDRESS; + empty_payload_list_head <= PAYLOAD_MEMORY_MAX_ADDRESS; inst_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; inst_occupied_head <= INSTANCE_MEMORY_MAX_ADDRESS; inst_next_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; inst_prev_addr_base <= INSTANCE_MEMORY_MAX_ADDRESS; - inst_empty_head <= FIRST_INSTANCE_ADDRESS; + inst_empty_head <= INSTANCE_MEMORY_MAX_ADDRESS; key_hash <= HANDLE_NIL; si_instance_handle_sig <= HANDLE_NIL; si_publication_handle_sig <= (others => (others => '0')); @@ -6514,7 +6573,7 @@ begin sample_rej_last_reason <= NOT_REJECTED; rtps_return_code_latch <= ERROR; dds_return_code_latch <= RETCODE_ERROR; - writer_pos <= 0; + writer_id <= 0; cnt <= 0; cnt2 <= 0; cnt3 <= 0; @@ -6601,7 +6660,7 @@ begin sample_rej_last_reason <= sample_rej_last_reason_next; rtps_return_code_latch <= rtps_return_code_latch_next; dds_return_code_latch <= dds_return_code_latch_next; - writer_pos <= writer_pos_next; + writer_id <= writer_id_next; cnt <= cnt_next; cnt2 <= cnt2_next; cnt3 <= cnt3_next; @@ -6624,7 +6683,7 @@ begin wait_for_sample_removal <= wait_for_sample_removal_next; dis_gen_cnt_latch <= dis_gen_cnt_latch_next; no_w_gen_cnt_latch <= no_w_gen_cnt_latch_next; - current_imf <= current_imf_next; + current_imf <= current_imf_next when WITH_KEY else (others => '1'); sample_addr_latch_1 <= sample_addr_latch_1_next; sample_addr_latch_2 <= sample_addr_latch_2_next; sample_addr_latch_3 <= sample_addr_latch_3_next; diff --git a/src/dds_writer.vhd b/src/dds_writer.vhd index 788d7d5..33fbb99 100644 --- a/src/dds_writer.vhd +++ b/src/dds_writer.vhd @@ -136,7 +136,7 @@ architecture arch of dds_writer is -- Address pointing to the beginning of the first Instance Data Frame constant FIRST_INSTANCE_ADDRESS : unsigned(INSTANCE_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); - -- *SAMPLE MEMORY FRAME FORMAT* + -- *SAMPLE MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant SMF_STATUS_INFO_OFFSET : natural := 0; constant SMF_SEQ_NR_OFFSET : natural := 1; @@ -159,12 +159,12 @@ architecture arch of dds_writer is constant SMF_PREV_ADDR_OFFSET : natural := gen_smf_prev_addr_offset(WITH_KEY); constant SMF_NEXT_ADDR_OFFSET : natural := SMF_PREV_ADDR_OFFSET + 1; - -- *PAYLOAD MEMORY FRAME FORMAT* + -- *PAYLOAD MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant PMF_NEXT_ADDR_OFFSET : natural := 0; constant PMF_PAYLOAD_OFFSET : natural := 1; - -- *INSTANCE MEMORY FRAME OFFSET* + -- *INSTANCE MEMORY FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant IMF_NEXT_ADDR_OFFSET : natural := 0; constant IMF_KEY_HASH_OFFSET : natural := 1; @@ -172,7 +172,7 @@ architecture arch of dds_writer is constant IMF_SAMPLE_CNT_OFFSET : natural := 6; constant IMF_ACK_CNT_OFFSET : natural := 7; - -- *INSTANCE MEMORY FRAME FORMAT FLAGS* + -- *INSTANCE MEMORY FRAME FIELD FLAGS* -- Flags mapping to the respective Endpoint Memory Frame Fields constant IMF_FLAG_WIDTH : natural := 4; constant IMF_KEY_HASH_FLAG : std_logic_vector(0 to IMF_FLAG_WIDTH-1) := (0 => '1', others => '0'); @@ -192,14 +192,21 @@ architecture arch of dds_writer is REMOVE_INSTANCE, RESET_MEMORY); -- *Instance Memory Opcodes* -- OPCODE DESCRIPTION - -- SEARCH_INSTANCE_HASH Search Instance based on Key Hash pointed by key_hash. - -- SEARCH_INSTANCE_ADDR Search Instance based on Instance Pointer pointed by inst_addr_update. [This is needed to mark the previous Instance for Instance Removal] - -- INSERT_INSTANCE Insert Instance to memory. The Instance is inserted in Key Hash Numerical Order. - -- UPDATE_INSTANCE Update Instance Data pointed by inst_addr_base. (inst_mem_fields specifies which Fields to update) - -- GET_FIRST_INSTANCE Get Instance Data of first Instance (Instance with smallest Key Hash Numerical Order). (inst_mem_fields specifies which Fields to get) - -- GET_NEXT_INSTANCE Get Instance Data of next Instance (from the Instance pointed by inst_addr_base) (inst_mem_fields specifies which Fields to get) - -- REMOVE_INSTANCE Remove Instance pointed by inst_addr_base - -- GET_INSTANCE Get Data of Instance pointed by inst_addr_update. (inst_mem_fields specifies which Fields to get) + -- SEARCH_INSTANCE_HASH Search Instance based on Key Hash pointed by "key_hash". + -- Set "inst_addr_base" to Base Address of found Instance, of INSTANCE_MEMORY_MAX_ADDRESS if nothing found. + -- "inst_data" contains Instance Data according to "inst_mem_fields". + -- SEARCH_INSTANCE_ADDR Search Instance based on Instance Pointer pointed by "inst_addr_update". + -- Set "inst_addr_base" to "inst_addr_update" + -- "inst_data" contains Instance Data according to "inst_mem_fields". + -- INSERT_INSTANCE Insert Instance to memory. + -- UPDATE_INSTANCE Update Instance Data pointed by "inst_addr_base" according to "inst_mem_fields" + -- GET_FIRST_INSTANCE Get Instance Data of first Instance according to "inst_mem_fields". + -- Set "inst_addr_base" to Address of Instance or INSTANCE_MEMORY_MAX_ADDRESS if no Instance in Memory. + -- GET_NEXT_INSTANCE Get Instance Data of next Instance (from the Instance pointed by "inst_addr_base") according to "inst_mem_fields". + -- Set "inst_addr_base" to Address of Instance or INSTANCE_MEMORY_MAX_ADDRESS if no other Instance in Memory. + -- REMOVE_INSTANCE Remove Instance pointed by "inst_addr_base". + -- GET_INSTANCE Get Data of Instance pointed by "inst_addr_update" according to "inst_mem_fields". + -- Already fetched Data of the Participant is not modified. type INSTANCE_OPCODE_TYPE is (NOP, SEARCH_INSTANCE_HASH, SEARCH_INSTANCE_ADDR, INSERT_INSTANCE, UPDATE_INSTANCE, GET_FIRST_INSTANCE, GET_NEXT_INSTANCE, REMOVE_INSTANCE, GET_INSTANCE); -- Record of Instance Data @@ -418,6 +425,8 @@ architecture arch of dds_writer is signal inst_cnt, inst_cnt_next : natural range 0 to 13 := 0; -- General Purpose Long Latch signal inst_long_latch, inst_long_latch_next : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := (others => '0'); + -- Instance Memory Flag Array denoting which inst_data Fields are up-to-date with the respective fields of the Instance (Pointed by inst_addr_base) + signal current_imf, current_imf_next : std_logic_vector(0 to IMF_FLAG_WIDTH-1) := (others => '0'); --*****ALIAS DECLARATION***** alias prev_sample : unsigned(SAMPLE_MEMORY_ADDR_WIDTH-1 downto 0) is sample_addr_latch_1; @@ -880,7 +889,7 @@ begin source_ts_next <= source_ts_dds; -- NOTE: The ALIGNED_FLAG is set by default. if actual Payload is not aligned, need to reset. - sample_status_info_next <= (SSI_PAYLOAD_FLAG => '1', SSI_ALIGNED_FLAG => '1', others => '0'); + sample_status_info_next <= (SSI_DATA_FLAG => '1', SSI_ALIGNED_FLAG => '1', others => '0'); cur_sample_next <= empty_sample_list_head; -- NOTE: We have to explicitly check the Payload Memory, as it may be "unaligned" with our Sample Memory @@ -937,7 +946,7 @@ begin source_ts_next <= source_ts_dds; -- NOTE: The ALIGNED_FLAG is set by default. if actual Payload is not aligned, need to reset. - sample_status_info_next <= (SSI_PAYLOAD_FLAG => '1', SSI_ALIGNED_FLAG => '1', SSI_DISPOSED_FLAG => '1', others => '0'); + sample_status_info_next <= (SSI_DATA_FLAG => '1', SSI_ALIGNED_FLAG => '1', SSI_DISPOSED_FLAG => '1', others => '0'); cur_sample_next <= empty_sample_list_head; -- NOTE: We always expect a Serialized Key as Input of this Opration, so we also check the Payload memory @@ -992,7 +1001,7 @@ begin source_ts_next <= source_ts_dds; -- NOTE: The ALIGNED_FLAG is set by default. if actual Payload is not aligned, need to reset. - sample_status_info_next <= (SSI_PAYLOAD_FLAG => '1', SSI_ALIGNED_FLAG => '1', SSI_UNREGISTERED_FLAG => '1', others => '0'); + sample_status_info_next <= (SSI_DATA_FLAG => '1', SSI_ALIGNED_FLAG => '1', SSI_UNREGISTERED_FLAG => '1', others => '0'); cur_sample_next <= empty_sample_list_head; -- NOTE: We always expect a Serialized Key as Input of this Opration, so we also check the Payload memory @@ -1278,7 +1287,7 @@ begin if (ready_out_kh = '1') then ready_in_dds <= '1'; -- Operation does not have Payload to store - if (sample_status_info(SSI_PAYLOAD_FLAG) = '0') then + if (sample_status_info(SSI_DATA_FLAG) = '0') then -- End of Payload if (last_word_in_dds = '1') then last_word_out_kh <= '1'; @@ -1450,10 +1459,14 @@ begin end if; end if; when REGISTER_OPERATION => + -- Precondition: inst_data set (IMF_STATUS_FLAG, IMF_SAMPLE_CNT_FLAG, IMF_ACK_CNT_FLAG) + -- Synthesis Guard if (WITH_KEY) then -- Wait for Instance Search to finish if (inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_ACK_CNT_FLAG) severity FAILURE; + -- Instance already in Memory if (inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then -- Accept Registration @@ -1567,10 +1580,11 @@ begin null; end case; when FILTER_STAGE => - -- Precondition: cur_sample set + -- Precondition: cur_sample set, inst_data set (IMF_SAMPLE_CNT_FLAG, IMF_ACK_CNT_FLAG) -- Wait for Instance Search to finish if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_SAMPLE_CNT_FLAG or IMF_ACK_CNT_FLAG) severity FAILURE; -- Instance Found if (not WITH_KEY or inst_addr_base /= INSTANCE_MEMORY_MAX_ADDRESS) then @@ -1775,8 +1789,12 @@ begin end if; end if; when UPDATE_INSTANCE => + -- Precondition: inst_data set (IMF_STATUS_FLAG, IMF_SAMPLE_CNT_FLAG, IMF_ACK_CNT_FLAG) + -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_ACK_CNT_FLAG) severity FAILURE; + -- Synthesis Guard if (WITH_KEY) then inst_op_start <= '1'; @@ -2473,10 +2491,12 @@ begin null; end case; when POST_SAMPLE_REMOVE => - -- Precondition: inst_data set (Status Info, Sample Count, ACK Count) + -- Precondition: inst_data set (IMF_STATUS_FLAG, IMF_SAMPLE_CNT_FLAG, IMF_ACK_CNT_FLAG) -- Memory Operation Guard if (not WITH_KEY or inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_ACK_CNT_FLAG) severity FAILURE; + -- Synthesis Guard if (WITH_KEY) then inst_op_start <= '1'; @@ -2550,6 +2570,8 @@ begin cnt_next <= 0; end if; when REMOVE_STALE_INSTANCE => + -- Precondition: inst_data set (IMF_STATUS_FLAG, IMF_SAMPLE_CNT_FLAG, IMF_ACK_CNT_FLAG) + -- Synthesis Guard if (WITH_KEY) then -- Wait for Instance Data @@ -2557,6 +2579,8 @@ begin case (cnt) is -- Find and Remove First Stale Instance when 0 => + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_ACK_CNT_FLAG) severity FAILURE; + -- Iterated through all Instances if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then -- NOTE: We should enter this state only if there is at least one stale Instance to be removed, so we should never enter this branch. @@ -2822,6 +2846,8 @@ begin null; end case; when ACKNACK_SAMPLE => + -- Precondition: inst_data set (IMF_ACK_CNT_FLAG, IMF_STATUS_FLAG, IMF_SAMPLE_CNT_FLAG) + case (cnt) is -- GET Status Info when 0 => @@ -2865,6 +2891,8 @@ begin if (WITH_KEY) then -- Wait for Instance Data if (inst_op_done = '1') then + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_SAMPLE_CNT_FLAG or IMF_ACK_CNT_FLAG) severity FAILURE; + -- Update inst_op_start <= '1'; inst_opcode <= UPDATE_INSTANCE; @@ -2897,6 +2925,8 @@ begin null; end case; when GET_SAMPLE => + -- Precondition: inst_data set (IMF_KEY_HASH_FLAG) + case (cnt) is -- GET Status Info when 0 => @@ -2994,6 +3024,8 @@ begin if (WITH_KEY) then -- Wait for Instance Data if (inst_op_done = '1') then + assert check_mask(current_imf, IMF_KEY_HASH_FLAG) severity FAILURE; + cc_instance_handle_sig_next <= inst_data.key_hash; cnt_next <= cnt + 1; @@ -3362,7 +3394,8 @@ begin last_word_out_dds <= '1'; if (ready_out_dds = '1') then -- Reset - status_sig_next <= status_sig and (not OFFERED_DEADLINE_MISSED_STATUS); + deadline_miss_last_inst_next <= HANDLE_NIL; + status_sig_next <= status_sig and (not OFFERED_DEADLINE_MISSED_STATUS); -- DONE stage_next <= IDLE; @@ -3390,6 +3423,8 @@ begin cnt_next <= 2; -- Check Instance when 2 => + assert check_mask(current_imf, IMF_STATUS_FLAG or IMF_KEY_HASH_FLAG) severity FAILURE; + -- Reached End of Instances if (inst_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then -- DONE @@ -3449,8 +3484,10 @@ begin if (sample_ready_in = '1') then if (cur_sample = MAX_SAMPLE_ADDRESS) then -- DONE - stage_next <= RESET_PAYLOAD_MEMORY; - cnt_next <= 0; + stage_next <= RESET_PAYLOAD_MEMORY; + cnt_next <= 0; + empty_sample_list_head_next <= FIRST_SAMPLE_ADDRESS; + empty_sample_list_tail_next <= MAX_SAMPLE_ADDRESS; else -- Continue cur_sample_next <= cur_sample + SAMPLE_FRAME_SIZE; @@ -3481,7 +3518,8 @@ begin if (payload_ready_in = '1') then if (cur_payload = MAX_PAYLOAD_ADDRESS) then -- DONE - stage_next <= IDLE; + stage_next <= IDLE; + empty_payload_list_head_next <= FIRST_PAYLOAD_ADDRESS; else cur_payload_next <= cur_payload + PAYLOAD_FRAME_SIZE; end if; @@ -3520,6 +3558,7 @@ begin inst_cnt_next <= inst_cnt; inst_data_next <= inst_data; inst_long_latch_next <= inst_long_latch; + current_imf_next <= current_imf; -- DEFAULT Unregistered inst_ready_out <= '0'; inst_valid_in <= '0'; @@ -3548,7 +3587,8 @@ begin case(inst_opcode) is when SEARCH_INSTANCE_HASH => -- Reset Data - inst_data_next <= ZERO_INSTANCE_DATA; + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; -- No Instances available if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then @@ -3561,7 +3601,8 @@ begin end if; when SEARCH_INSTANCE_ADDR => -- Reset Data - inst_data_next <= ZERO_INSTANCE_DATA; + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; -- No Instances avialable if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then @@ -3577,6 +3618,10 @@ begin -- by the main process that the operation can succeed (Memory is available) assert (inst_empty_head /= INSTANCE_MEMORY_MAX_ADDRESS) report "Instance Insertion while memory Full" severity FAILURE; + -- Reset Data + current_imf_next <= (others => '1'); + inst_data_next <= ZERO_INSTANCE_DATA; + inst_addr_base_next <= inst_empty_head; inst_stage_next <= INSERT_INSTANCE; inst_cnt_next <= 0; @@ -3587,7 +3632,9 @@ begin inst_data_next.sample_cnt <= sample_cnt; inst_data_next.ack_cnt <= ack_cnt; when UPDATE_INSTANCE => + current_imf_next <= current_imf or inst_mem_fields; inst_stage_next <= UPDATE_INSTANCE; + if check_mask(inst_mem_fields,IMF_STATUS_FLAG) then inst_cnt_next <= 0; elsif check_mask(inst_mem_fields,IMF_SAMPLE_CNT_FLAG) then @@ -3599,6 +3646,10 @@ begin inst_stage_next <= IDLE; end if; when GET_FIRST_INSTANCE => + -- Reset + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; + -- No Instances avialable if (inst_occupied_head = INSTANCE_MEMORY_MAX_ADDRESS) then inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; @@ -3609,6 +3660,10 @@ begin inst_cnt_next <= 0; end if; when GET_NEXT_INSTANCE => + -- Reset + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; + -- No Instances avialable if (inst_next_addr_base = INSTANCE_MEMORY_MAX_ADDRESS) then inst_addr_base_next <= INSTANCE_MEMORY_MAX_ADDRESS; @@ -3619,12 +3674,23 @@ begin inst_cnt_next <= 0; end if; when REMOVE_INSTANCE => + -- Reset + current_imf_next <= (others => '0'); + inst_data_next <= ZERO_INSTANCE_DATA; + inst_stage_next <= REMOVE_INSTANCE; inst_cnt_next <= 0; when GET_INSTANCE => inst_addr_base_next <= inst_addr_update; + if (inst_addr_base /= inst_addr_update) then + -- Reset + current_imf_next <= inst_mem_fields; + inst_data_next <= ZERO_INSTANCE_DATA; + else + current_imf_next <= current_imf or inst_mem_fields; + end if; + -- Get Instance Data - inst_data_next <= ZERO_INSTANCE_DATA; inst_stage_next <= GET_INSTANCE_DATA; if check_mask(inst_mem_fields,IMF_KEY_HASH_FLAG) then inst_cnt_next <= 0; @@ -4354,7 +4420,8 @@ begin if (inst_ready_in = '1') then if (inst_addr_base = MAX_INSTANCE_ADDRESS) then -- DONE - inst_stage_next <= IDLE; + inst_stage_next <= IDLE; + inst_empty_head_next <= FIRST_INSTANCE_ADDRESS; else inst_addr_base_next <= inst_addr_base + INSTANCE_FRAME_SIZE; end if; @@ -4413,9 +4480,9 @@ begin orphan_samples <= '0'; newest_sample <= SAMPLE_MEMORY_MAX_ADDRESS; oldest_sample <= SAMPLE_MEMORY_MAX_ADDRESS; - empty_payload_list_head <= FIRST_PAYLOAD_ADDRESS; - empty_sample_list_head <= FIRST_SAMPLE_ADDRESS; - empty_sample_list_tail <= MAX_SAMPLE_ADDRESS; + empty_payload_list_head <= PAYLOAD_MEMORY_MAX_ADDRESS; + empty_sample_list_head <= SAMPLE_MEMORY_MAX_ADDRESS; + empty_sample_list_tail <= SAMPLE_MEMORY_MAX_ADDRESS; payload_addr_latch_1 <= (others => '0'); payload_addr_latch_2 <= (others => '0'); long_latch <= (others => '0'); @@ -4434,8 +4501,9 @@ begin liveliness_lost_cnt <= (others => '0'); liveliness_lost_cnt_change <= (others => '0'); status_sig <= (others => '0'); + current_imf <= (others => '0'); inst_addr_base <= (others => '0'); - inst_empty_head <= FIRST_INSTANCE_ADDRESS; + inst_empty_head <= INSTANCE_MEMORY_MAX_ADDRESS; inst_occupied_head <= INSTANCE_MEMORY_MAX_ADDRESS; inst_long_latch <= (others => '0'); inst_next_addr_base <= (others => '0'); @@ -4504,6 +4572,7 @@ begin liveliness_lost_cnt <= liveliness_lost_cnt_next; liveliness_lost_cnt_change <= liveliness_lost_cnt_change_next; status_sig <= status_sig_next; + current_imf <= current_imf_next when WITH_KEY else (others => '1'); inst_addr_base <= inst_addr_base_next; inst_empty_head <= inst_empty_head_next; inst_occupied_head <= inst_occupied_head_next; diff --git a/src/history_cache.vhd b/src/history_cache.vhd index 2607a51..db8a78a 100644 --- a/src/history_cache.vhd +++ b/src/history_cache.vhd @@ -8,7 +8,7 @@ entity history_cache is MAX_INSTANCES : natural := DEFAULT_MAX_INSTANCES; MAX_SAMPLES_PER_INSTANCE : natural := DEFAULT_MAX_SAMPLES_PER_INSTANCE; HISTORY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_HISTORY_QOS; - RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_RELIABILTY_QOS; + RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := DEFAULT_RELIABILITY_QOS; GENERATION_COUNTERS : boolean := TRUE; ); port ( @@ -990,7 +990,7 @@ begin writer_bitmap <= from_endpoint_bitmap(tmp_bitmap); -- No More Writers for Instance - if (tmp_bitmap = (tmp_bitmap'range => '0')) then + if (tmp_bitmap = (tmp_bitmap'reverse_range => '0')) then inst_op_start_a <= '1'; instance_state <= NOT_ALIVE_NO_WRITERS; inst_opcode_a <= UPDATE_INSTANCE; diff --git a/src/rtps_builtin_endpoint.vhd b/src/rtps_builtin_endpoint.vhd index b9fac0e..6a498c4 100644 --- a/src/rtps_builtin_endpoint.vhd +++ b/src/rtps_builtin_endpoint.vhd @@ -35,9 +35,9 @@ architecture arch of rtps_builtin_endpoint is -- Max Serialized Payload Size in a UDP Stream (Bytes) [MAX_PAYLAOD(65536) - IPv4_HEADER(20) - UDP_HEADER(8) - RTPS_HEADER(20) - DATA_HEADER(24)] constant UDP_MAX_SIZE_SERIALIZED : natural := 65464; -- Highest Sequence Number of Publisher Data - constant PUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := convert_to_double_word(to_unsigned(NUM_WRITERS, 64)); + constant PUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := to_double_word(to_unsigned(NUM_WRITERS, 64)); -- Highest Sequence Number of Subscriber Data - constant SUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := convert_to_double_word(to_unsigned(NUM_READERS, 64)); + constant SUB_SEQUENCENUMBER : SEQUENCENUMBER_TYPE := to_double_word(to_unsigned(NUM_READERS, 64)); -- Heartbeat/Liveliness Assertion Period constant HEARTBEAT_PERIOD : DURATION_TYPE := work.rtps_package.min(MIN_ENDPOINT_LEASE_DURATION, PARTICIPANT_HEARTBEAT_PERIOD) - DURATION_DELTA; @@ -409,7 +409,7 @@ architecture arch of rtps_builtin_endpoint is alias data_flag : std_logic is flags(2); alias key_flag : std_logic is flags(3); alias final_flag : std_logic is flags(1); - alias payload_flag : std_logic is flags(4); + alias non_std_flag : std_logic is flags(4); -- HEARTBEAT alias first_seq_nr : SEQUENCENUMBER_TYPE is sn_latch_1; alias first_seq_nr_next : SEQUENCENUMBER_TYPE is sn_latch_1_next; @@ -453,13 +453,13 @@ architecture arch of rtps_builtin_endpoint is procedure assert_sn is begin if (message_type = EDP and is_subscriber = '0') then - assert (check_mask(current_pmf, PMF_PUB_SEQ_NR_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_PUB_SEQ_NR_FLAG) severity FAILURE; elsif (message_type = EDP and is_subscriber = '1') then - assert (check_mask(current_pmf, PMF_SUB_SEQ_NR_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_SUB_SEQ_NR_FLAG) severity FAILURE; elsif (message_type = MESSAGE) then - assert (check_mask(current_pmf, PMF_MES_SEQ_NR_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_MES_SEQ_NR_FLAG) severity FAILURE; elsif (message_type = PDP) then - assert (check_mask(current_pmf, PMF_SPDP_SEQ_NR_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_SPDP_SEQ_NR_FLAG) severity FAILURE; else assert FALSE report "assert_sn: Unknown Message Type" severity FAILURE; end if; @@ -789,7 +789,7 @@ begin stage_next <= PACKET_SRC_ADDR; -- SANITY CHECK: Skip Packet if non-standard Payload - if(header_opcode = SID_DATA and payload_flag = '1') then + if(header_opcode = SID_DATA and non_std_flag = '1') then stage_next <= SKIP_PACKET; end if; end if; @@ -807,14 +807,15 @@ begin -- Input FIFO Guard and Memory Operation Guard if (empty = '0' and mem_op_done = '1') then rd_guard := '1'; - cnt_next <= cnt + 1; -- Latch Src GUIDPrefix case (cnt) is when 0 => guid_next(0) <= data_in; + cnt_next <= cnt + 1; when 1 => guid_next(1) <= data_in; + cnt_next <= cnt + 1; when 2 => guid_next(2) <= data_in; guid_next(3) <= ENTITYID_PARTICIPANT; @@ -1216,12 +1217,12 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; -- Latch Sequence Number case (cnt) is when 0 => seq_nr_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; when 1 => seq_nr_next(1) <= unsigned(data_in_swapped); -- Store Next Sequence Number @@ -1303,10 +1304,11 @@ begin end if; when PROCESS_MESSAGE_SEQUENCE_NUMBERS => -- Precondition: participant_data set (PMF_MES_SEQ_NR_FLAG) - assert (check_mask(current_pmf, PMF_MES_SEQ_NR_FLAG)) severity FAILURE; -- Wait for Participant Data if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_MES_SEQ_NR_FLAG) severity FAILURE; + -- Participant in Buffer if (mem_addr_base /= PARTICIPANT_MEMORY_MAX_ADDRESS) then -- NOTE: Since the BuiltinParticipantMessageWriter has a History Depth of 1 (see DDSI-RTPS 2.3 8.4.13.3), we accept all newer SNs, since @@ -1333,7 +1335,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Check if GUID Prefix valid (Should be the same as the GUID Prefix of the Packet) @@ -1341,16 +1342,22 @@ begin when 0 => if (data_in /= guid(0)) then stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- GUID Prefix 2/3 when 1 => if (data_in /= guid(1)) then stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- GUID Prefix 3/3 when 2 => if (data_in /= guid(2)) then stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- Participant Mesasge Kind when 3 => @@ -1386,19 +1393,21 @@ begin stage_next <= SKIP_PACKET; -- Output FIFO Guard elsif ((endpoint_mask and endpoint_full) = (endpoint_full'range => '0')) then - wr_sig <= '1'; - cnt_next <= cnt + 1; + wr_sig <= '1'; case (cnt) is -- Liveliness Assertion Opcode when 0 => - data_out <= OPCODE_LIVELINESS_UPDATE; + data_out <= OPCODE_LIVELINESS_UPDATE; + cnt_next <= cnt + 1; -- GUID Prefix 1/3 when 1 => - data_out <= guid(0); + data_out <= guid(0); + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 2 => - data_out <= guid(1); + data_out <= guid(1); + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 3 => data_out <= guid(2); @@ -1414,26 +1423,30 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- GapStart Sequence Number 1/2 when 0 => gap_start_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- GapStart Sequence Number 2/2 when 1 => gap_start_next(1) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- GapList.Base 1/2 when 2 => gap_list_base_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- GapList.Base 2/2 when 3 => gap_list_base_next(1) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- GapList.NumBits when 4 => gap_list_end_next <= gap_list_base + to_integer(unsigned(data_in_swapped)); bitmap_cnt_next <= unsigned(round_slv(data_in_swapped(log2c(MAX_BITMAP_WIDTH)-1 downto 0),bitmap_cnt'length)); cnt2_next <= 0; + cnt_next <= cnt + 1; -- GapList.Bitmap when 5 => -- Read Bitmap @@ -1441,9 +1454,6 @@ begin cnt2_next <= cnt2 + 1; bitmap_latch_next(cnt2) <= data_in_swapped; - - -- Keep Sub-State - cnt_next <= cnt; else stage_next <= PROCESS_GAP_SEQUENCE_NUMBERS; end if; @@ -1506,16 +1516,18 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; -- Latch Sequence Numbers case (cnt) is when 0 => first_seq_nr_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; when 1 => first_seq_nr_next(1) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; when 2 => last_seq_nr_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; when 3 => last_seq_nr_next(1) <= unsigned(data_in_swapped); stage_next <= PROCESS_HEARTBEAT_SEQUENCE_NUMBERS; @@ -1525,11 +1537,12 @@ begin end if; when PROCESS_HEARTBEAT_SEQUENCE_NUMBERS => -- Precondition: participant_data set (PMF_HEARTBEAT_RES_TIME_FLAG, PMF_PUB_SEQ_NR_FLAG/PMF_SUB_SEQ_NR_FLAG/PMF_MES_SEQ_NR_FLAG) - assert (check_mask(current_pmf, PMF_HEARTBEAT_RES_TIME_FLAG)) severity FAILURE; - assert_sn; -- Wait for Participant Search to finish if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_HEARTBEAT_RES_TIME_FLAG) severity FAILURE; + assert_sn; + -- Participant in Buffer if (mem_addr_base /= PARTICIPANT_MEMORY_MAX_ADDRESS) then -- No scheduled Heartbeat Response @@ -1605,13 +1618,13 @@ begin when PROCESS_ACKNACK => if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; -- Latch Sequence Number -- NOTE: Because we always sent the entire history cache, we only need to look at the SequenceNumberSetBase to determine if we need to sent data or not case (cnt) is when 0 => first_seq_nr_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; when 1 => first_seq_nr_next(1) <= unsigned(data_in_swapped); @@ -1622,10 +1635,11 @@ begin end if; when PROCESS_ACKNACK_SEQUENCE_NUMBERS => -- Precondition: participant_data set (PMF_ACKNACK_RES_TIME_FLAG, PMF_EXTRA_FLAGS_FLAG) - assert (check_mask(current_pmf, PMF_ACKNACK_RES_TIME_FLAG or PMF_EXTRA_FLAGS_FLAG)) severity FAILURE; -- Wait for Participant Search to finish if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_ACKNACK_RES_TIME_FLAG or PMF_EXTRA_FLAGS_FLAG) severity FAILURE; + -- Participant in Buffer if (mem_addr_base /= PARTICIPANT_MEMORY_MAX_ADDRESS) then -- No scheduled Acknack Response @@ -1774,7 +1788,7 @@ begin end if; end if; when PARTICIPANT_STALE_CHECK => - -- Preconditions (See Sub-states) + -- Precondition: participant_data set (PMF_LEASE_DEADLINE_FLAG, PMF_HEARTBEAT_RES_TIME_FLAG, PMF_ACKNACK_RES_TIME_FLAG) -- Wait for Stale Search to finish if (mem_op_done = '1') then @@ -1785,8 +1799,7 @@ begin mem_field_flags <= PMF_LEASE_DEADLINE_FLAG or PMF_ACKNACK_RES_TIME_FLAG or PMF_HEARTBEAT_RES_TIME_FLAG; cnt_next <= cnt + 1; when 1 => - -- Precondition: participant_data set (PMF_LEASE_DEADLINE_FLAG, PMF_HEARTBEAT_RES_TIME_FLAG, PMF_ACKNACK_RES_TIME_FLAG) - assert (check_mask(current_pmf, PMF_LEASE_DEADLINE_FLAG or PMF_HEARTBEAT_RES_TIME_FLAG or PMF_ACKNACK_RES_TIME_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_LEASE_DEADLINE_FLAG or PMF_HEARTBEAT_RES_TIME_FLAG or PMF_ACKNACK_RES_TIME_FLAG) severity FAILURE; -- Found Stale Entry if (mem_addr_base /= PARTICIPANT_MEMORY_MAX_ADDRESS) then @@ -1866,8 +1879,7 @@ begin stage_next <= IDLE; end if; when 2 => - -- Precondition: participant_data set (PMF_GUIDPREFIX_FLAG) - assert (check_mask(current_pmf, PMF_GUIDPREFIX_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_GUIDPREFIX_FLAG) severity FAILURE; -- Latch GUID Prefix guid_next(0) <= participant_data.guid_prefix(0); @@ -1897,8 +1909,7 @@ begin -- Continue cnt_next <= 1; when 4 => - -- Precondition: participant_data set (PMF_EXTRA_FLAGS_FLAG) - assert (check_mask(current_pmf, PMF_EXTRA_FLAGS_FLAG)) severity FAILURE; + assert check_mask(current_pmf, PMF_EXTRA_FLAGS_FLAG) severity FAILURE; mem_op_start <= '1'; mem_opcode <= UPDATE_PARTICIPANT; @@ -2344,21 +2355,26 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; -- Check if GUID Prefix valid (Should be the same as the GUID Prefix of the Packet) and update the Entity ID case (cnt) is when 0 => if (data_in /= guid(0)) then stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; when 1 => if (data_in /= guid(1)) then stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; when 2 => if (data_in /= guid(2)) then stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; when 3 => guid_next(3) <= data_in; @@ -2396,7 +2412,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Locator Kind @@ -2405,6 +2420,8 @@ begin if (data_in_swapped /= LOCATOR_KIND_UDPv4) then -- Skip stage_next <= SKIP_PARAMETER; + else + cnt_next <= cnt + 1; end if; -- Locator Port when 1 => @@ -2414,19 +2431,20 @@ begin -- NOTE: We have to make sure that the address is also valid -- Temporal Latch long_latch_next <= data_in_swapped; + cnt_next <= cnt + 1; else -- Ignore stage_next <= SKIP_PARAMETER; end if; -- Locator Address 1/4 when 2 => - null; + cnt_next <= cnt + 1; -- Locator Address 2/4 when 3 => - null; + cnt_next <= cnt + 1; -- Locator Address 3/4 when 4 => - null; + cnt_next <= cnt + 1; -- Locator Address 4/4 (IPv4) when 5 => -- Latch Src Addr @@ -2461,12 +2479,12 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; -- Latch Lease Duration case (cnt) is when 0 => lease_duration_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; when 1 => lease_duration_next(1) <= unsigned(data_in_swapped); -- DONE @@ -2522,11 +2540,11 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is when 0 => long_latch_next <= data_in_swapped; + cnt_next <= cnt + 1; when 1 => tmp_dw := (0 => unsigned(long_latch), 1 => unsigned(data_in_swapped)); -- Check QoS Compatibility (Unmark match on incompatibility) @@ -2562,12 +2580,12 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is when 0 => -- Temporal Latch long_latch_next <= data_in_swapped; + cnt_next <= cnt + 1; when 1 => tmp_dw := (0 => unsigned(long_latch), 1 => unsigned(data_in_swapped)); -- Check QoS Compatibility (Unmark match on incompatibility) @@ -2587,7 +2605,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is when 0 => @@ -2603,9 +2620,10 @@ begin if (is_subscriber = '1') then reader_flags_next(READER_IS_BEST_EFFORT_FLAG) <= '1' when (data_in_swapped = BEST_EFFORT_RELIABILITY_QOS) else '0'; end if; + cnt_next <= cnt + 1; when 1 => -- NOTE: The max_blocking_time value is ignored - null; + cnt_next <= cnt + 1; when 2 => -- DONE stage_next <= SKIP_PARAMETER; @@ -2647,7 +2665,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is when 0 => @@ -2658,6 +2675,7 @@ begin endpoint_mask_next(i) <= '0'; end if; end loop; + cnt_next <= cnt + 1; when 1 => -- Check QoS Compatibility (Unmark match on incompatibility) for i in 0 to NUM_ENDPOINTS-1 loop @@ -2703,11 +2721,11 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is when 0 => long_latch_next <= data_in_swapped; + cnt_next <= cnt + 1; when 1 => tmp_dw := (0 => unsigned(long_latch), 1 => unsigned(data_in_swapped)); -- Check QoS Compatibility (Unmark match on incompatibility) @@ -2854,31 +2872,36 @@ begin end if; when INFORM_ENDPOINTS_MATCH => -- Precondition: participant_data set (PMF_DEFAULT_IPV4_ADDR_FLAG, PMF_UDP_PORT_FLAG) - assert (check_mask(current_pmf, PMF_DEFAULT_IPV4_ADDR_FLAG or PMF_UDP_PORT_FLAG)) severity FAILURE; -- Wait for Participant Data if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_DEFAULT_IPV4_ADDR_FLAG or PMF_UDP_PORT_FLAG) severity FAILURE; + -- Output FIFO Guard if ((endpoint_mask and endpoint_full) = (endpoint_full'range => '0')) then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- Match Opcode when 0 => - data_out <= OPCODE_ENDPOINT_MATCH; + data_out <= OPCODE_ENDPOINT_MATCH; + cnt_next <= cnt + 1; -- GUID Prefix 1/3 when 1 => - data_out <= guid(0); + data_out <= guid(0); + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 2 => - data_out <= guid(1); + data_out <= guid(1); + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 3 => - data_out <= guid(2); + data_out <= guid(2); + cnt_next <= cnt + 1; -- Entity ID when 4 => - data_out <= guid(3); + data_out <= guid(3); + cnt_next <= cnt + 1; -- IPv4 Address when 5 => -- If Endpoint did not set Address, use Participant Default @@ -2887,6 +2910,7 @@ begin else data_out <= participant_data.def_addr; end if; + cnt_next <= cnt + 1; -- UDPv4 Port and Reader Flags when 6 => -- Default @@ -2916,21 +2940,24 @@ begin -- Output FIFO Guard if (((not endpoint_mask) and endpoint_full) = (endpoint_full'range => '0')) then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- Match Opcode when 0 => - data_out <= OPCODE_ENDPOINT_UNMATCH; + data_out <= OPCODE_ENDPOINT_UNMATCH; + cnt_next <= cnt + 1; -- GUID Prefix 1/3 when 1 => - data_out <= guid(0); + data_out <= guid(0); + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 2 => - data_out <= guid(1); + data_out <= guid(1); + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 3 => - data_out <= guid(2); + data_out <= guid(2); + cnt_next <= cnt + 1; -- Entity ID when 4 => data_out <= guid(3); @@ -2946,21 +2973,23 @@ begin -- Output FIFO Guard if (endpoint_full = (endpoint_full'range => '0')) then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- Match Opcode when 0 => - data_out <= OPCODE_PARTICIPANT_UNMATCH; + data_out <= OPCODE_PARTICIPANT_UNMATCH; + cnt_next <= cnt + 1; -- GUID Prefix 1/3 when 1 => - data_out <= guid(0); + data_out <= guid(0); + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 2 => - data_out <= guid(1); + data_out <= guid(1); + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 3 => - data_out <= guid(2); + data_out <= guid(2); last_word_out <= '1'; -- Currently in Stale Check @@ -2977,21 +3006,22 @@ begin end if; when SEND_HEADER => -- Precondition: participant_data set (PMF_META_IPV4_ADDR_FLAG, PMF_UDP_PORT_FLAG) [if return_stage /= SEND_PARTICIPANT_ANNOUNCEMENT] - if (return_stage /= SEND_PARTICIPANT_ANNOUNCEMENT) then - assert (check_mask(current_pmf, PMF_META_IPV4_ADDR_FLAG or PMF_UDP_PORT_FLAG)) severity FAILURE; - end if; -- Wait for Participant Data if (mem_op_done = '1') then + if (return_stage /= SEND_PARTICIPANT_ANNOUNCEMENT) then + assert check_mask(current_pmf, PMF_META_IPV4_ADDR_FLAG or PMF_UDP_PORT_FLAG) severity FAILURE; + end if; + if (rtps_full = '0') then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- OUTPUT HEADER -- Src IPv4 Address when 0 => - data_out <= DEFAULT_IPv4_ADDRESS; + data_out <= DEFAULT_IPv4_ADDRESS; + cnt_next <= cnt + 1; -- Dest IPv4 Address when 1 => -- Set Default Multicast Announce Address if Participant Announcement @@ -3000,6 +3030,7 @@ begin else data_out <= participant_data.meta_addr; end if; + cnt_next <= cnt + 1; -- Src and Dest UDPv4 Ports when 2 => -- Set Default Multicast Announce Port if Participant Announcement @@ -3008,17 +3039,23 @@ begin else data_out <= META_IPv4_UNICAST_PORT & participant_data.meta_port; end if; + cnt_next <= cnt + 1; -- RTPS MESSAGE HEADER when 3 => - data_out <= PROTOCOL_RTPS; + data_out <= PROTOCOL_RTPS; + cnt_next <= cnt + 1; when 4 => - data_out <= PROTOCOLVERSION_2_4 & VENDORID; + data_out <= PROTOCOLVERSION_2_4 & VENDORID; + cnt_next <= cnt + 1; when 5 => - data_out <= GUIDPREFIX(0); + data_out <= GUIDPREFIX(0); + cnt_next <= cnt + 1; when 6 => - data_out <= GUIDPREFIX(1); + data_out <= GUIDPREFIX(1); + cnt_next <= cnt + 1; when 7 => - data_out <= GUIDPREFIX(2); + data_out <= GUIDPREFIX(2); + -- Continue with respective RTPS Submessage stage_next <= return_stage; cnt_next <= 0; @@ -3033,7 +3070,6 @@ begin when SEND_PARTICIPANT_ANNOUNCEMENT => if (rtps_full = '0') then wr_sig <= '1'; - participant_data_cnt_next <= participant_data_cnt + 1; -- Send Participant Data data_out <= LOCAL_PARTICIPANT_DATA.data(participant_data_cnt); @@ -3043,100 +3079,125 @@ begin last_word_out <= '1'; -- DONE stage_next <= IDLE; + else + participant_data_cnt_next <= participant_data_cnt + 1; end if; end if; when SEND_ACKNACK => -- Precondition: participant_data set (PMF_PUB_SEQ_NR_FLAG, PMF_SUB_SEQ_NR_FLAG, PMF_MES_SEQ_NR_FLAG) - assert (check_mask(current_pmf, PMF_PUB_SEQ_NR_FLAG or PMF_SUB_SEQ_NR_FLAG or PMF_MES_SEQ_NR_FLAG)) severity FAILURE; -- Wait for Participant Data if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_PUB_SEQ_NR_FLAG or PMF_SUB_SEQ_NR_FLAG or PMF_MES_SEQ_NR_FLAG) severity FAILURE; + if (rtps_full = '0') then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- ACKNACK RTPS SUBMESSAGE (Publication) -- RTPS Submessage Header when 0 => - data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => - data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR; + data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER; + data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER; + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 1/2) when 3 => - data_out <= std_logic_vector(participant_data.pub_seq_nr(0)); + data_out <= std_logic_vector(participant_data.pub_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 2/2) when 4 => - data_out <= std_logic_vector(participant_data.pub_seq_nr(1)); + data_out <= std_logic_vector(participant_data.pub_seq_nr(1)); + cnt_next <= cnt + 1; -- Sequence Number Set (NumBits) when 5 => - data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap) when 6 => -- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet) -- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist) - data_out <= (others => '1'); + data_out <= (others => '1'); + cnt_next <= cnt + 1; -- Count when 7 => data_out <= std_logic_vector(count); + cnt_next <= cnt + 1; -- ACKNACK RTPS SUBMESSAGE (Subscription) -- RTPS Submessage Header when 8 => - data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 9 => - data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR; + data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR; + cnt_next <= cnt + 1; -- Writer Entity ID when 10 => - data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER; + data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER; + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 1/2) when 11 => - data_out <= std_logic_vector(participant_data.sub_seq_nr(0)); + data_out <= std_logic_vector(participant_data.sub_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 2/2) when 12 => - data_out <= std_logic_vector(participant_data.sub_seq_nr(1)); + data_out <= std_logic_vector(participant_data.sub_seq_nr(1)); + cnt_next <= cnt + 1; -- Sequence Number Set (NumBits) when 13 => - data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap) when 14 => -- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet) -- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist) - data_out <= (others => '1'); + data_out <= (others => '1'); + cnt_next <= cnt + 1; -- Count when 15 => - data_out <= std_logic_vector(count); + data_out <= std_logic_vector(count); + cnt_next <= cnt + 1; -- ACKNACK RTPS SUBMESSAGE (Message) -- RTPS Submessage Header when 16 => - data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 17 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + cnt_next <= cnt + 1; -- Writer Entity ID when 18 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 1/2) when 19 => - data_out <= std_logic_vector(participant_data.mes_seq_nr(0)); + data_out <= std_logic_vector(participant_data.mes_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 2/2) when 20 => - data_out <= std_logic_vector(participant_data.mes_seq_nr(1)); + data_out <= std_logic_vector(participant_data.mes_seq_nr(1)); + cnt_next <= cnt + 1; -- Sequence Number Set (NumBits) when 21 => - data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + data_out <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap) when 22 => -- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet) -- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist) - data_out <= (others => '1'); + data_out <= (others => '1'); + cnt_next <= cnt + 1; -- Count when 23 => - data_out <= std_logic_vector(count); + data_out <= std_logic_vector(count); last_word_out <= '1'; -- Continue @@ -3150,84 +3211,107 @@ begin when SEND_HEARTBEAT => if (rtps_full = '0') then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- HEARTBEAT RTPS SUBMESSAGE (Publication) -- RTPS Submessage Header when 0 => - data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => - data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR; + data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_DETECTOR; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER; + data_out <= ENTITYID_SEDP_BUILTIN_PUBLICATIONS_ANNOUNCER; + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 3 => - data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(0)); + data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(0)); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 4 => - data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(1)); + data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(1)); + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 5 => - data_out <= std_logic_vector(PUB_SEQUENCENUMBER(0)); + data_out <= std_logic_vector(PUB_SEQUENCENUMBER(0)); + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 6 => - data_out <= std_logic_vector(PUB_SEQUENCENUMBER(1)); + data_out <= std_logic_vector(PUB_SEQUENCENUMBER(1)); + cnt_next <= cnt + 1; -- Count when 7 => - data_out <= std_logic_vector(count); + data_out <= std_logic_vector(count); + cnt_next <= cnt + 1; -- HEARTBEAT RTPS SUBMESSAGE (Subscription) -- RTPS Submessage Header when 8 => - data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 9 => - data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR; + data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_DETECTOR; + cnt_next <= cnt + 1; -- Writer Entity ID when 10 => - data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER; + data_out <= ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_ANNOUNCER; + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 11 => - data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(0)); + data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(0)); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 12 => - data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(1)); + data_out <= std_logic_vector(FIRST_SEQUENCENUMBER(1)); + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 13 => - data_out <= std_logic_vector(SUB_SEQUENCENUMBER(0)); + data_out <= std_logic_vector(SUB_SEQUENCENUMBER(0)); + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 14 => - data_out <= std_logic_vector(SUB_SEQUENCENUMBER(1)); + data_out <= std_logic_vector(SUB_SEQUENCENUMBER(1)); + cnt_next <= cnt + 1; -- Count when 15 => - data_out <= std_logic_vector(count); + data_out <= std_logic_vector(count); + cnt_next <= cnt + 1; -- HEARTBEAT RTPS SUBMESSAGE (Message) -- RTPS Submessage Header when 16 => - data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_HEARTBEAT & "00000010" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 17 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + cnt_next <= cnt + 1; -- Writer Entity ID when 18 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 19 => - data_out <= std_logic_vector(man_live_seq_nr(0)); + data_out <= std_logic_vector(man_live_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 20 => - data_out <= std_logic_vector(man_live_seq_nr(1)); + data_out <= std_logic_vector(man_live_seq_nr(1)); + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 21 => - data_out <= std_logic_vector(auto_live_seq_nr(0)); + data_out <= std_logic_vector(auto_live_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 22 => - data_out <= std_logic_vector(auto_live_seq_nr(1)); + data_out <= std_logic_vector(auto_live_seq_nr(1)); + cnt_next <= cnt + 1; -- Count when 23 => data_out <= std_logic_vector(count); + -- If manual and automatic sequence numbers are not consecutive, we have only asserted the automatic liveliness if (live_gap_start /= auto_live_seq_nr) then stage_next <= SEND_MES_AUTO_LIVE; @@ -3243,17 +3327,17 @@ begin end if; when SEND_PUB_DATA => -- Precondition: participant_data set (PMF_EXTRA_FLAGS_FLAG) - assert (check_mask(current_pmf, PMF_EXTRA_FLAGS_FLAG)) severity FAILURE; -- Wait for Participant Data if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_EXTRA_FLAGS_FLAG) severity FAILURE; + -- If Publisher Data not scheduled for response or no Writers available, skip if (not check_mask(participant_data.extra_flags, EF_PUB_DATA_FLAG) or NUM_WRITERS = 0) then stage_next <= SEND_SUB_DATA; -- Output FIFO Guard elsif (rtps_full = '0') then wr_sig <= '1'; - publisher_data_cnt_next <= publisher_data_cnt + 1; -- Send Publisher Data data_out <= WRITER_ENDPOINT_DATA.data(publisher_data_cnt); @@ -3274,15 +3358,18 @@ begin -- DONE stage_next <= IDLE; end if; + else + publisher_data_cnt_next <= publisher_data_cnt + 1; end if; end if; end if; when SEND_SUB_DATA => -- Precondition: participant_data set (PMF_EXTRA_FLAGS_FLAG) - assert (check_mask(current_pmf, PMF_EXTRA_FLAGS_FLAG)) severity FAILURE; -- Wait for Participant Data if (mem_op_done = '1') then + assert check_mask(current_pmf, PMF_EXTRA_FLAGS_FLAG) severity FAILURE; + -- If Subscriber Data not scheduled for response or no Readers available, skip if (not check_mask(participant_data.extra_flags, EF_PUB_DATA_FLAG) or NUM_READERS = 0) then stage_next <= SEND_MES_MAN_LIVE; @@ -3290,7 +3377,6 @@ begin -- Output FIFO Guard elsif (rtps_full = '0') then wr_sig <= '1'; - subscriber_data_cnt_next <= subscriber_data_cnt + 1; -- Send Subscriber Data data_out <= READER_ENDPOINT_DATA.data(subscriber_data_cnt); @@ -3311,6 +3397,8 @@ begin -- DONE stage_next <= IDLE; end if; + else + subscriber_data_cnt_next <= subscriber_data_cnt + 1; end if; end if; end if; @@ -3318,44 +3406,54 @@ begin -- Output FIFO Guard if (rtps_full = '0') then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- DATA RTPS SUBMESSAGE (Participant Message) -- RTPS Submessage Header when 0 => - data_out <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16)); + data_out <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16)); + cnt_next <= cnt + 1; -- ExtraFlags, octetsToInlineQoS when 1 => - data_out <= x"0000" & std_logic_vector(to_unsigned(16, 16)); + data_out <= x"0000" & std_logic_vector(to_unsigned(16, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 2 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + cnt_next <= cnt + 1; -- Writer Entity ID when 3 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 4 => - data_out <= std_logic_vector(man_live_seq_nr(0)); + data_out <= std_logic_vector(man_live_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 5 => - data_out <= std_logic_vector(man_live_seq_nr(1)); + data_out <= std_logic_vector(man_live_seq_nr(1)); + cnt_next <= cnt + 1; -- Serialized Payload Header when 6 => - data_out <= CDR_BE & x"0000"; + data_out <= CDR_BE & x"0000"; + cnt_next <= cnt + 1; -- Serialized Payload BEGIN -- GUID Prefix 1/3 when 7 => - data_out <= GUIDPREFIX(0); + data_out <= GUIDPREFIX(0); + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 8 => - data_out <= GUIDPREFIX(1); + data_out <= GUIDPREFIX(1); + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 9 => - data_out <= GUIDPREFIX(2); + data_out <= GUIDPREFIX(2); + cnt_next <= cnt + 1; -- Participant Message Kind when 10 => - data_out <= PARTICIPANT_MESSAGE_DATA_KIND_MANUAL_LIVELINESS_UPDATE; + data_out <= PARTICIPANT_MESSAGE_DATA_KIND_MANUAL_LIVELINESS_UPDATE; + cnt_next <= cnt + 1; -- Data Length when 11 => data_out <= (others => '0'); @@ -3375,31 +3473,37 @@ begin -- Output FIFO Guard if (rtps_full = '0') then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- DATA RTPS SUBMESSAGE (Participant Message) -- RTPS Submessage Header when 0 => - data_out <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16)); + data_out <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + cnt_next <= cnt + 1; -- GAP Start Sequence Number 1/2 when 3 => - data_out <= std_logic_vector(live_gap_start(0)); + data_out <= std_logic_vector(live_gap_start(0)); + cnt_next <= cnt + 1; -- GAP Start Sequence Number 2/2 when 4 => - data_out <= std_logic_vector(live_gap_start(1)); + data_out <= std_logic_vector(live_gap_start(1)); + cnt_next <= cnt + 1; -- GAP End Sequence Number Set (Bitmap Base 1/2) when 5 => - data_out <= std_logic_vector(live_gap_end(0)); + data_out <= std_logic_vector(live_gap_end(0)); + cnt_next <= cnt + 1; -- GAP End Sequence Number Set (Bitmap Base 2/2) when 6 => - data_out <= std_logic_vector(live_gap_end(1)); + data_out <= std_logic_vector(live_gap_end(1)); + cnt_next <= cnt + 1; -- GAP End Sequence Number Set (NumBits) when 7 => data_out <= (others => '0'); @@ -3413,48 +3517,59 @@ begin -- Output FIFO Guard if (rtps_full = '0') then wr_sig <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- DATA RTPS SUBMESSAGE (Participant Message) -- RTPS Submessage Header when 0 => - data_out <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16)); + data_out <= SID_DATA & "00000100" & std_logic_vector(to_unsigned(44, 16)); + cnt_next <= cnt + 1; -- ExtraFlags, octetsToInlineQoS when 1 => - data_out <= x"0000" & std_logic_vector(to_unsigned(16, 16)); + data_out <= x"0000" & std_logic_vector(to_unsigned(16, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 2 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER; + cnt_next <= cnt + 1; -- Writer Entity ID when 3 => - data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + data_out <= ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER; + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 4 => - data_out <= std_logic_vector(auto_live_seq_nr(0)); + data_out <= std_logic_vector(auto_live_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 5 => - data_out <= std_logic_vector(auto_live_seq_nr(1)); + data_out <= std_logic_vector(auto_live_seq_nr(1)); + cnt_next <= cnt + 1; -- Serialized Payload Header when 6 => - data_out <= CDR_BE & x"0000"; + data_out <= CDR_BE & x"0000"; + cnt_next <= cnt + 1; -- Serialized Payload BEGIN -- GUID Prefix 1/3 when 7 => - data_out <= GUIDPREFIX(0); + data_out <= GUIDPREFIX(0); + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 8 => - data_out <= GUIDPREFIX(1); + data_out <= GUIDPREFIX(1); + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 9 => - data_out <= GUIDPREFIX(2); + data_out <= GUIDPREFIX(2); + cnt_next <= cnt + 1; -- Participant Message Kind when 10 => - data_out <= PARTICIPANT_MESSAGE_DATA_KIND_AUTOMATIC_LIVELINESS_UPDATE; + data_out <= PARTICIPANT_MESSAGE_DATA_KIND_AUTOMATIC_LIVELINESS_UPDATE; + cnt_next <= cnt + 1; -- Data Length when 11 => - data_out <= (others => '0'); + data_out <= (others => '0'); last_word_out <= '1'; + -- If we are in the middle of a liveliness assertion, find the next Participant destination if (is_live_assert = '1') then mem_op_start <= '1'; @@ -5709,7 +5824,8 @@ begin if (mem_ready_in = '1') then if (mem_addr_base = MAX_PARTICIPANT_ADDRESS) then -- DONE - mem_stage_next <= IDLE; + mem_stage_next <= IDLE; + mem_empty_head_next <= FIRST_PARTICIPANT_ADDRESS; else mem_addr_base_next <= mem_addr_base + PARTICIPANT_FRAME_SIZE; end if; @@ -5756,7 +5872,7 @@ begin src_entityid <= ENTITYID_UNKNOWN; dest_entityid <= ENTITYID_UNKNOWN; mem_addr_base <= PARTICIPANT_MEMORY_MAX_ADDRESS; - mem_empty_head <= (others => '0'); + mem_empty_head <= PARTICIPANT_MEMORY_MAX_ADDRESS; mem_occupied_head <= PARTICIPANT_MEMORY_MAX_ADDRESS; mem_next_addr_base <= PARTICIPANT_MEMORY_MAX_ADDRESS; mem_prev_addr_base <= PARTICIPANT_MEMORY_MAX_ADDRESS; @@ -5765,9 +5881,9 @@ begin sn_latch_1 <= SEQUENCENUMBER_UNKNOWN; sn_latch_2 <= SEQUENCENUMBER_UNKNOWN; sn_latch_3 <= SEQUENCENUMBER_UNKNOWN; - auto_live_seq_nr <= convert_to_double_word(to_unsigned(2, 64)); + auto_live_seq_nr <= to_double_word(to_unsigned(2, 64)); man_live_seq_nr <= FIRST_SEQUENCENUMBER; - live_gap_start <= convert_to_double_word(to_unsigned(2, 64)); + live_gap_start <= to_double_word(to_unsigned(2, 64)); live_gap_end <= FIRST_SEQUENCENUMBER; lease_duration <= DURATION_ZERO; check_time <= TIME_INVALID; diff --git a/src/rtps_config_package.vhd b/src/rtps_config_package.vhd index 0c681f3..85ba376 100644 --- a/src/rtps_config_package.vhd +++ b/src/rtps_config_package.vhd @@ -54,7 +54,7 @@ package rtps_config_package is constant SSI_FILTERED_FLAG : natural := STATUS_INFO_FILTERED_FLAG; constant SSI_KEY_HASH_FLAG : natural := 28; -- Reader Only constant SSI_ALIGNED_FLAG : natural := 29; - constant SSI_PAYLOAD_FLAG : natural := 30; + constant SSI_DATA_FLAG : natural := 30; constant SSI_READ_FLAG : natural := 31; -- Reader Only constant SSI_ACK_FLAG : natural := 31; -- Writer Only @@ -319,7 +319,7 @@ package body rtps_config_package is -- Count Bytes ret := ret + 1; -- Exit on first NULL byte (NULL Byte included in count) - if (str(i)(WORD_WIDTH-(j*BYTE_WIDTH)-1 downto WORD_WIDTH-(j*BYTE_WIDTH)-BYTE_WIDTH) = (BYTE_WIDTH-1 downto 0 => '0')) then + if (str(i)(WORD_WIDTH-(j*BYTE_WIDTH)-1 downto WORD_WIDTH-(j*BYTE_WIDTH)-BYTE_WIDTH) = (0 to BYTE_WIDTH-1 => '0')) then done := TRUE; exit; end if; @@ -490,7 +490,7 @@ package body rtps_config_package is ret.data(ind+len) := std_logic_vector(ENDPOINT_TIME_BASED_FILTER_QOS(i)(1)); end if; -- RELIABILITY - if (ENDPOINT_RELIABILITY_QOS(i) /= DEFAULT_RELIABILTY_QOS or ENDPOINT_MAX_BLOCKING_TIME(i) /= DEFAULT_MAX_BLOCKING_TIME) then + if (ENDPOINT_RELIABILITY_QOS(i) /= DEFAULT_RELIABILITY_QOS or ENDPOINT_MAX_BLOCKING_TIME(i) /= DEFAULT_MAX_BLOCKING_TIME) then len := len + 1; ret.data(ind+len) := PID_RELIABILITY & std_logic_vector(to_unsigned(12, 16)); len := len + 1; @@ -675,7 +675,7 @@ package body rtps_config_package is ret.data(ind+len) := std_logic_vector(ENDPOINT_LEASE_DURATION(i)(1)); end if; -- RELIABILITY - if (ENDPOINT_RELIABILITY_QOS(i) /= DEFAULT_RELIABILTY_QOS or ENDPOINT_MAX_BLOCKING_TIME(i) /= DEFAULT_MAX_BLOCKING_TIME) then + if (ENDPOINT_RELIABILITY_QOS(i) /= DEFAULT_RELIABILITY_QOS or ENDPOINT_MAX_BLOCKING_TIME(i) /= DEFAULT_MAX_BLOCKING_TIME) then len := len + 1; ret.data(ind+len) := PID_RELIABILITY & std_logic_vector(to_unsigned(12, 16)); len := len + 1; @@ -801,7 +801,7 @@ package body rtps_config_package is ret.data(ret.length) := std_logic_vector(ENDPOINT_LEASE_DURATION(id)(1)); end if; -- RELIABILITY - if (ENDPOINT_RELIABILITY_QOS(id) /= DEFAULT_RELIABILTY_QOS or ENDPOINT_MAX_BLOCKING_TIME(id) /= DEFAULT_MAX_BLOCKING_TIME) then + if (ENDPOINT_RELIABILITY_QOS(id) /= DEFAULT_RELIABILITY_QOS or ENDPOINT_MAX_BLOCKING_TIME(id) /= DEFAULT_MAX_BLOCKING_TIME) then ret.length := ret.length + 1; ret.data(ret.length) := PID_RELIABILITY & std_logic_vector(to_unsigned(12, 16)); ret.length := ret.length + 1; @@ -1123,7 +1123,7 @@ package body rtps_config_package is ret.LIVELINESS_QOS(i) := '0'; end if; -- RELIABILITY - if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_RELIABILTY_QOS), unsigned(ENDPOINT_RELIABILITY_QOS(i)))) then + if (not check_qos_compatibility(boolean_to_std_logic(is_reader), '1', unsigned(DEFAULT_RELIABILITY_QOS), unsigned(ENDPOINT_RELIABILITY_QOS(i)))) then ret.RELIABILITY_QOS(i) := '0'; end if; -- DESTINATION_ORDER diff --git a/src/rtps_handler.vhd b/src/rtps_handler.vhd index 1e86d29..e7c0a5e 100644 --- a/src/rtps_handler.vhd +++ b/src/rtps_handler.vhd @@ -385,13 +385,14 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is when 0 => src_guidprefix_next(0) <= data_in; + cnt_next <= cnt + 1; when 1 => src_guidprefix_next(1) <= data_in; + cnt_next <= cnt + 1; when 2 => src_guidprefix_next(2) <= data_in; @@ -494,7 +495,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; -- If Destination GUID Prefix is not us, skip the rest of the packet case (cnt) is @@ -503,12 +503,16 @@ begin if (data_in /= GUIDPREFIX(0)) then -- Ignore stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- GUID Prefix 2/3 when 1 => if (data_in /= GUIDPREFIX(1)) then -- Ignore stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- GUID Prefix 3/3 when 2 => @@ -526,25 +530,28 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- unused when 0 => - null; + cnt_next <= cnt + 1; -- Protocol Version & Vendor ID when 1 => -- Check Major Protocol Version if (data_in(31 downto 24) /= PROTOCOLVERSION_2_4(15 downto 8)) then -- Protocol not supported, skip rest of Packet stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- GUID Prefix 1/3 when 2 => src_guidprefix_next(0) <= data_in; + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 3 => src_guidprefix_next(1) <= data_in; + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 4 => src_guidprefix_next(2) <= data_in; @@ -557,12 +564,12 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Timesatmp 1/2 when 0 => src_ts_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- Timesatmp 2/2 when 1 => src_ts_next(1) <= unsigned(data_in_swapped); @@ -601,7 +608,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Locator Kind @@ -612,6 +618,7 @@ begin else locator_match_next <= '0'; end if; + cnt_next <= cnt + 1; -- Locator Port when 1 => -- We only store UDPv4 Locators @@ -623,15 +630,16 @@ begin long_latch_next <= data_in_swapped; end if; end if; + cnt_next <= cnt + 1; -- Locator Address 1/4 when 2 => - null; + cnt_next <= cnt + 1; -- Locator Address 2/4 when 3 => - null; + cnt_next <= cnt + 1; -- Locator Address 3/4 when 4 => - null; + cnt_next <= cnt + 1; -- Locator Address 4/4 (IPv4 Address) when 5 => -- We only store valid UDPv4 Locators @@ -651,7 +659,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- IPv4 Address @@ -663,6 +670,7 @@ begin locator_match_next <= '1'; long_latch_next <= data_in_swapped; end if; + cnt_next <= cnt + 1; -- UDPv4 Port when 1 => -- Store only valid Locators @@ -689,18 +697,20 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Reader Entity ID when 0 => dest_entityid_next <= data_in; + cnt_next <= cnt + 1; -- Writer Entity ID when 1 => src_entityid_next <= data_in; + cnt_next <= cnt + 1; -- First Sequence Number 1/2 when 2 => sn_latch_1_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- First Sequence Number 2/2 when 3 => sn_latch_1_next(1) <= unsigned(data_in_swapped); @@ -710,6 +720,8 @@ begin if (tmp_sn = 0 or tmp_sn(0)(WORD_WIDTH-1) = '1') then -- If firstSN.value is zero or negative, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.5.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- Last Sequence Number 1/2 when 4 => @@ -717,6 +729,7 @@ begin -- Pre-Calculation for Validity Check sn_latch_3_next <= sn_latch_1 - 1; + cnt_next <= cnt + 1; -- Last Sequence Number 2/2 when 5 => sn_latch_2_next(1) <= unsigned(data_in_swapped); @@ -726,6 +739,8 @@ begin if (tmp_sn(0)(WORD_WIDTH-1) = '1') then -- If lastSN.value is negative, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.5.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- Count when 6 => @@ -746,19 +761,21 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Reader Entity ID when 0 => src_is_reader_next <= '1'; src_entityid_next <= data_in; + cnt_next <= cnt + 1; -- Writer Entity ID when 1 => dest_entityid_next <= data_in; + cnt_next <= cnt + 1; -- ReaderSNState.Base 1/2 when 2 => sn_latch_1_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- ReaderSNState.Base 2/2 when 3 => sn_latch_1_next(1) <= unsigned(data_in_swapped); @@ -769,6 +786,8 @@ begin -- If Bitmap Base is zero or negative, Number Set is invalid (see DDSI-RTPS 2.3 Section 9.4.2.6) -- If readerSNState is invalid, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.1.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- ReaderSNState.NumBits when 4 => @@ -781,6 +800,8 @@ begin -- If numBits is negative or larger than 256, Number Set is invalid (see DDSI-RTPS 2.3 Section 9.4.2.6) -- If readerSNState is invalid, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.1.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- ReaderSNState.Bitmap when 5 => @@ -789,13 +810,11 @@ begin cnt2_next <= cnt2 + 1; bitmap_latch_next(cnt2) <= data_in_swapped; - - -- Keep Sub-State - cnt_next <= cnt; -- Exit Condition else -- Prevent Input Latching rd_guard := '0'; + cnt_next <= cnt + 1; end if; -- Count when 6 => @@ -811,21 +830,24 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Reader Entity ID when 0 => dest_entityid_next <= data_in; + cnt_next <= cnt + 1; -- Writer Entity ID when 1 => src_entityid_next <= data_in; + cnt_next <= cnt + 1; -- GapStart Sequence Number 1/2 when 2 => sn_latch_1_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- GapStart Sequence Number 2/2 when 3 => sn_latch_1_next(1) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- VALIDITY CHECK tmp_sn := (0 => sn_latch_1(0), 1 => unsigned(data_in_swapped)); @@ -833,13 +855,17 @@ begin -- If Bitmap Base is zero or negative, Number Set is invalid (see DDSI-RTPS 2.3 Section 9.4.2.6) -- If gapList is invalid, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.4.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- GapList.Base 1/2 when 4 => sn_latch_2_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- GapList.Base 2/2 when 5 => sn_latch_2_next(1) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- VALIDITY CHECK tmp_sn := (0 => sn_latch_2(0), 1 => unsigned(data_in_swapped)); @@ -847,6 +873,8 @@ begin -- If Bitmap Base is zero or negative, Number Set is invalid (see DDSI-RTPS 2.3 Section 9.4.2.6) -- If gapList is invalid, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.4.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- ReaderSNState.NumBits when 6 => @@ -860,6 +888,8 @@ begin -- If numBits is negative or larger than 256, Number Set is invalid (see DDSI-RTPS 2.3 Section 9.4.2.6) -- If gapList is invalid, skip Packet (see DDSI-RTPS 2.3 Section 8.3.7.4.3 and 8.3.4.1) stage_next <= SKIP_PACKET; + else + cnt_next <= cnt + 1; end if; -- ReaderSNState.Bitmap when 7 => @@ -868,9 +898,6 @@ begin cnt2_next <= cnt2 + 1; bitmap_latch_next(cnt2) <= data_in_swapped; - - -- Keep Sub-State - cnt_next <= cnt; end if; when others => null; @@ -887,7 +914,6 @@ begin -- Input FIFO Guard if (empty = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Extra Flags & octetstoinlineQoS @@ -896,15 +922,19 @@ begin -- Latch Length to skip Uknown Data Header Part and latch offset to ensure 4-Byte alignement (see align_prc) offset_latch_next <= std_logic_vector(rtps_sub_data_length(1 downto 0)); data_header_end_next <= (read_cnt_plus & "00") + rtps_sub_data_length; + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => dest_entityid_next <= data_in; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => src_entityid_next <= data_in; + cnt_next <= cnt + 1; -- Sequence Number 1/2 when 3 => sn_latch_1_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 4 => sn_latch_1_next(1) <= unsigned(data_in_swapped); @@ -993,57 +1023,66 @@ begin -- NOTE: This is a synchronised push on potentially multiple output FIFOs. If one FIFO gets full, the process stalls for all FIFOs. -- Output FIFO Guard if (builtin_endpoint = '1' and builtin_full = '0') or (builtin_endpoint = '0' and ((user_endpoint and user_full) = (user_endpoint'range => '0'))) then - cnt_next <= cnt + 1; case (cnt) is -- OPCODE (Submessage ID), Submessage Flags, UPDv4 Source Port when 0 => data_out <= opcode & flags & src_port; wr_sig <= '1'; + cnt_next <= cnt + 1; -- IPv4 Source Address when 1 => data_out <= src_addr; wr_sig <= '1'; + cnt_next <= cnt + 1; -- GUID Prefix 1/3 when 2 => data_out <= src_guidprefix(0); wr_sig <= '1'; + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 3 => data_out <= src_guidprefix(1); wr_sig <= '1'; + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 4 => data_out <= src_guidprefix(2); wr_sig <= '1'; + cnt_next <= cnt + 1; -- Source Entity ID when 5 => data_out <= src_entityid; wr_sig <= '1'; + cnt_next <= cnt + 1; -- Destination ID [only for Built-in Endpoints] when 6 => if (builtin_endpoint = '1') then data_out <= dest_entityid; wr_sig <= '1'; end if; + cnt_next <= cnt + 1; -- Sequence Number 1/2 [only for DATA Submessages] when 7 => if (opcode = SID_DATA) then data_out <= std_logic_vector(sn_latch_1(0)); wr_sig <= '1'; end if; + cnt_next <= cnt + 1; -- Sequence Number 2/2 [only for DATA Submessages] when 8 => if (opcode = SID_DATA) then data_out <= std_logic_vector(sn_latch_1(1)); wr_sig <= '1'; end if; + cnt_next <= cnt + 1; -- Source Timestamp 1/2 [only for DATA Submessages and User Endpoints] when 9 => if (opcode = SID_DATA and builtin_endpoint = '0') then data_out <= std_logic_vector(src_ts(0)); wr_sig <= '1'; end if; + cnt_next <= cnt + 1; -- Source Timestamp 1/2 [only for DATA Submessages and User Endpoints] when 10 => if (opcode = SID_DATA and builtin_endpoint = '0') then @@ -1061,7 +1100,6 @@ begin -- NOTE: This is a synchronised push on potentially multiple output FIFOs. If one FIFO gets full, the process stalls for all FIFOs. -- Output FIFO Guard if (builtin_endpoint = '1' and builtin_full = '0') or (builtin_endpoint = '0' and ((user_endpoint and user_full) = (user_endpoint'range => '0'))) then - cnt_next <= cnt + 1; case (opcode) is when SID_HEARTBEAT => @@ -1070,18 +1108,22 @@ begin when 0 => data_out <= std_logic_vector(sn_latch_1(0)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- FirstSN 2/2 when 1 => data_out <= std_logic_vector(sn_latch_1(1)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- LastSN 1/2 when 2 => data_out <= std_logic_vector(sn_latch_2(0)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- LastSN 2/2 when 3 => data_out <= std_logic_vector(sn_latch_2(1)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- Count when 4 => data_out <= long_latch; @@ -1099,15 +1141,18 @@ begin when 0 => data_out <= std_logic_vector(sn_latch_1(0)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- ReaderSNState.Base 2/2 when 1 => data_out <= std_logic_vector(sn_latch_1(1)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- ReaderSNState.NumBits when 2 => data_out <= std_logic_vector(ulong_latch); wr_sig <= '1'; cnt2_next <= 0; + cnt_next <= cnt + 1; -- ReaderSNState.Bitmap when 3 => -- Write Bitmap @@ -1116,9 +1161,8 @@ begin data_out <= bitmap_latch_next(cnt2); wr_sig <= '1'; - - -- Keep Sub-State - cnt_next <= cnt; + else + cnt_next <= cnt + 1; end if; -- Count when 4 => @@ -1137,22 +1181,27 @@ begin when 0 => data_out <= std_logic_vector(sn_latch_1(0)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- GapStart 2/2 when 1 => data_out <= std_logic_vector(sn_latch_1(1)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- GapList.Base 1/2 when 2 => data_out <= std_logic_vector(sn_latch_2(0)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- GapList.Base 2/2 when 3 => data_out <= std_logic_vector(sn_latch_2(1)); wr_sig <= '1'; + cnt_next <= cnt + 1; -- GapList.NumBits when 4 => data_out <= std_logic_vector(ulong_latch); wr_sig <= '1'; + cnt_next <= cnt + 1; cnt2_next <= 0; -- GapList.Bitmap when 5 => @@ -1162,9 +1211,8 @@ begin data_out <= bitmap_latch_next(cnt2); wr_sig <= '1'; - - -- Keep Sub-State - cnt_next <= cnt; + else + cnt_next <= cnt + 1; end if; -- NOTE: Because we need to pull "last_word_out" high on the last Byte, and doing so in the last Byte of Bitmap was deemed -- to much overhead (We need a counter in addition to cnt2 to track the next-to-last Byte of the Bitmap), we just diff --git a/src/rtps_package.vhd b/src/rtps_package.vhd index b243fdb..bf0e856 100644 --- a/src/rtps_package.vhd +++ b/src/rtps_package.vhd @@ -384,7 +384,7 @@ package rtps_package is -- RELIABILITY constant BEST_EFFORT_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_WIDTH)); constant RELIABLE_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,CDR_ENUMERATION_WIDTH)); - constant DEFAULT_RELIABILTY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := RELIABLE_RELIABILITY_QOS; + constant DEFAULT_RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := RELIABLE_RELIABILITY_QOS; -- MAX BLOCKING TIME (RELIABILITY) constant DEFAULT_MAX_BLOCKING_TIME : DURATION_TYPE; --Deferred to Package Body (100 ms) -- TRANSPORT_PRIORITY @@ -463,8 +463,8 @@ package rtps_package is function to_key_hash (A : GUID_TYPE) return KEY_HASH_TYPE; -- *OVERLOAD FUNCTIONS* - function convert_from_double_word (input: DOUBLE_WORD_ARRAY) return unsigned; - function convert_to_double_word (input: unsigned(63 downto 0)) return DOUBLE_WORD_ARRAY; + function to_unsigned (input: DOUBLE_WORD_ARRAY) return unsigned; + function to_double_word (input: unsigned(63 downto 0)) return DOUBLE_WORD_ARRAY; function ">" (L,R: DOUBLE_WORD_ARRAY) return boolean; function ">" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean; function ">" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean; @@ -524,7 +524,7 @@ package body rtps_package is constant DEFAULT_MAX_BLOCKING_TIME : DURATION_TYPE := gen_duration(0,100 * (10**6)); -- 100 ms constant DEFAULT_PARTICIPANT_LEASE_DURATION : DURATION_TYPE := gen_duration(100, 0); -- 100 s - function convert_from_double_word (input: DOUBLE_WORD_ARRAY) return unsigned is + function to_unsigned (input: DOUBLE_WORD_ARRAY) return unsigned is variable ret : unsigned(63 downto 0) := (others => '0'); begin ret(63 downto 32) := input(0); @@ -532,7 +532,7 @@ package body rtps_package is return ret; end function; - function convert_to_double_word (input: unsigned(63 downto 0)) return DOUBLE_WORD_ARRAY is + function to_double_word (input: unsigned(63 downto 0)) return DOUBLE_WORD_ARRAY is variable ret : DOUBLE_WORD_ARRAY := (others => (others => '0')); begin ret(0) := input(63 downto 32); @@ -542,122 +542,122 @@ package body rtps_package is function ">" (L,R: DOUBLE_WORD_ARRAY) return boolean is begin - return convert_from_double_word(L) > convert_from_double_word(R); + return to_unsigned(L) > to_unsigned(R); end function; function ">" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean is begin - return convert_from_double_word(L) > R; + return to_unsigned(L) > R; end function; function ">" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean is begin - return L > convert_from_double_word(R); + return L > to_unsigned(R); end function; function "<" (L,R: DOUBLE_WORD_ARRAY) return boolean is begin - return convert_from_double_word(L) < convert_from_double_word(R); + return to_unsigned(L) < to_unsigned(R); end function; function "<" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean is begin - return convert_from_double_word(L) < R; + return to_unsigned(L) < R; end function; function "<" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean is begin - return L < convert_from_double_word(R); + return L < to_unsigned(R); end function; function ">=" (L,R: DOUBLE_WORD_ARRAY) return boolean is begin - return convert_from_double_word(L) >= convert_from_double_word(R); + return to_unsigned(L) >= to_unsigned(R); end function; function ">=" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean is begin - return convert_from_double_word(L) >= R; + return to_unsigned(L) >= R; end function; function ">=" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean is begin - return L >= convert_from_double_word(R); + return L >= to_unsigned(R); end function; function "<=" (L,R: DOUBLE_WORD_ARRAY) return boolean is begin - return convert_from_double_word(L) <= convert_from_double_word(R); + return to_unsigned(L) <= to_unsigned(R); end function; function "<=" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean is begin - return convert_from_double_word(L) <= R; + return to_unsigned(L) <= R; end function; function "<=" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean is begin - return L <= convert_from_double_word(R); + return L <= to_unsigned(R); end function; function "=" (L,R: DOUBLE_WORD_ARRAY) return boolean is begin - return convert_from_double_word(L) = convert_from_double_word(R); + return to_unsigned(L) = to_unsigned(R); end function; function "=" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean is begin - return convert_from_double_word(L) = R; + return to_unsigned(L) = R; end function; function "=" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean is begin - return L = convert_from_double_word(R); + return L = to_unsigned(R); end function; function "/=" (L,R: DOUBLE_WORD_ARRAY) return boolean is begin - return convert_from_double_word(L) /= convert_from_double_word(R); + return to_unsigned(L) /= to_unsigned(R); end function; function "/=" (L: DOUBLE_WORD_ARRAY; R: natural) return boolean is begin - return convert_from_double_word(L) /= R; + return to_unsigned(L) /= R; end function; function "/=" (L: natural; R: DOUBLE_WORD_ARRAY) return boolean is begin - return L /= convert_from_double_word(R); + return L /= to_unsigned(R); end function; function "+" (L,R: DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY is begin - return convert_to_double_word(convert_from_double_word(L) + convert_from_double_word(R)); + return to_double_word(to_unsigned(L) + to_unsigned(R)); end function; function "+" (L: DOUBLE_WORD_ARRAY; R: natural) return DOUBLE_WORD_ARRAY is begin - return convert_to_double_word(convert_from_double_word(L) + R); + return to_double_word(to_unsigned(L) + R); end function; function "+" (L: natural; R: DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY is begin - return convert_to_double_word(L + convert_from_double_word(R)); + return to_double_word(L + to_unsigned(R)); end function; function "-" (L,R: DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY is begin - return convert_to_double_word(convert_from_double_word(L) - convert_from_double_word(R)); + return to_double_word(to_unsigned(L) - to_unsigned(R)); end function; function "-" (L: DOUBLE_WORD_ARRAY; R: natural) return DOUBLE_WORD_ARRAY is begin - return convert_to_double_word(convert_from_double_word(L) - R); + return to_double_word(to_unsigned(L) - R); end function; function "-" (L: natural; R: DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY is begin - return convert_to_double_word(L - convert_from_double_word(R)); + return to_double_word(L - to_unsigned(R)); end function; function min(L, R : DOUBLE_WORD_ARRAY) return DOUBLE_WORD_ARRAY is diff --git a/src/rtps_reader.vhd b/src/rtps_reader.vhd index efde791..804f9f4 100644 --- a/src/rtps_reader.vhd +++ b/src/rtps_reader.vhd @@ -13,7 +13,7 @@ use work.rtps_config_package.all; entity rtps_reader is generic ( ENTITYID : std_logic_vector(ENTITYID_WIDTH-1 downto 0); - RELIABILTY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); + RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); LIVELINESS_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); DURABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); HEARTBEAT_RESPONSE_DELAY : DURATION_TYPE; @@ -66,7 +66,7 @@ architecture arch of rtps_reader is ret := 12 when (qos = RELIABLE_RELIABILITY_QOS) else 8; return ret; end function; - constant ENDPOINT_FRAME_SIZE : natural := gen_frame_size(RELIABILTY_QOS); + constant ENDPOINT_FRAME_SIZE : natural := gen_frame_size(RELIABILITY_QOS); -- Endpoint Memory Size in 4-Byte Words constant ENDPOINT_MEMORY_SIZE : natural := MAX_REMOTE_ENDPOINTS * ENDPOINT_FRAME_SIZE; -- Endpoint Memory Address Width @@ -78,7 +78,7 @@ architecture arch of rtps_reader is -- Address pointing to the beginning of the first Endpoint Data Frame constant FIRST_ENDPOINT_ADDRESS : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); - -- *ENDPOINT MEMORY FORMAT FORMAT FLAGS* + -- *ENDPOINT MEMORY FRAME FIELD FLAGS* -- Flags mapping to the respective Endpoint Memory Frame Fields constant EMF_FLAG_WIDTH : natural := 7; constant EMF_ENTITYID_FLAG : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (0 => '1', others => '0'); @@ -89,19 +89,19 @@ architecture arch of rtps_reader is constant EMF_LEASE_DEADLINE_FLAG : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (5 => '1', others => '0'); constant EMF_RES_TIME_FLAG : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (6 => '1', others => '0'); - -- *ENDPOINT MEMORY FRAME FORMAT* + -- *ENDPOINT MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant EMF_ENTITYID_OFFSET : natural := 0; constant EMF_GUIDPREFIX_OFFSET : natural := 1; constant EMF_IPV4_ADDR_OFFSET : natural := 4; constant EMF_UDP_PORT_OFFSET : natural := 5; - function gen_emf_udp_port_offset(qos : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0)) return natural is + function gen_emf_next_seq_nr_offset(qos : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0)) return natural is variable ret : natural := 0; begin - ret := 6 when (qos = RELIABLE_RELIABILITY_QOS) else EMF_GUIDPREFIX_OFFSET + 3; + ret := (EMF_UDP_PORT_OFFSET + 1) when (qos = RELIABLE_RELIABILITY_QOS) else (EMF_GUIDPREFIX_OFFSET + 3); return ret; end function; - constant EMF_NEXT_SEQ_NR_OFFSET : natural := gen_emf_udp_port_offset(RELIABILTY_QOS); + constant EMF_NEXT_SEQ_NR_OFFSET : natural := gen_emf_next_seq_nr_offset(RELIABILITY_QOS); constant EMF_LEASE_DEADLINE_OFFSET : natural := EMF_NEXT_SEQ_NR_OFFSET + 2; constant EMF_RES_TIME_OFFSET : natural := EMF_LEASE_DEADLINE_OFFSET + 2; @@ -117,13 +117,18 @@ architecture arch of rtps_reader is RESET_MAX_POINTER, GET_NEXT_ENDPOINT, RESET_MEMORY); -- *Memory FSM Opcodes* -- OPCODE DESCRIPTION - -- SEARCH_ENDPOINT Find Endpoint with specified GUID in memory - -- INSERT_ENDPOINT Insert Endpoint to first available empty_user slot in memory - -- UPDATE_ENDPOINT Update Endpoint pointed by mem_addr_base. (mem_field_flags specifies which Fields to update) - -- REMOVE_ENDPOINT Remove Endpoint pointed by mem_addr_base - -- GET_FIRST_ENDPOINT Get Endpoint Data of first Endpoint stored in Memory. (mem_field_flags specifies which Fields to get) - -- GET_NEXT_ENDPOINT Get Endpoint Data of next Endpoint (from the Endpoint pointed by mem_addr_base) stored in Memory. (mem_field_flags specifies which Fields to get) - -- GET_ENDPOINT Get Endpoint Data from Endpoint currently pointed by mem_addr_base. (mem_field_flags specifies which Fields to get) + -- SEARCH_ENDPOINT Search memory for Endpoint with GUID equal to "guid" signal. + -- Set "mem_addr_base" to base Address of found Endpoint, or ENDPOINT_MEMORY_MAX_ADDRESS if nothing found. + -- "mem_endpoint_data" contains Endpoint Data according to "mem_field_flags". + -- INSERT_ENDPOINT Insert Endpoint to first available empty slot in memory + -- UPDATE_ENDPOINT Update Endpoint pointed by "mem_addr_base" according to "mem_field_flags". + -- REMOVE_ENDPOINT Remove Endpoint pointed by "mem_addr_base" + -- GET_FIRST_ENDPOINT Get Endpoint Data of first Endpoint stored in Memory according to "mem_field_flags". + -- Set "mem_addr_base" to Address of Endpoint, or ENDPOINT_MEMORY_MAX_ADDRESS if no Endpoint in Memory. + -- GET_NEXT_ENDPOINT Get Endpoint Data of next Endpoint (from the Endpoint pointed by "mem_addr_base") according to "mem_field_flags". + -- Set "mem_addr_base" to Address of Endpoint, or ENDPOINT_MEMORY_MAX_ADDRESS if no other Endpoint in Memory. + -- GET_ENDPOINT Get Endpoint Data from Endpoint pointed by "mem_addr_update" according to "mem_field_flags". + -- Already fetched data of the same Endpoint is not modified. type MEM_OPCODE_TYPE is (NOP, SEARCH_ENDPOINT, INSERT_ENDPOINT, UPDATE_ENDPOINT, REMOVE_ENDPOINT, GET_FIRST_ENDPOINT, GET_NEXT_ENDPOINT, GET_ENDPOINT); -- Record of Endpoint Data @@ -248,6 +253,8 @@ architecture arch of rtps_reader is signal res_time : TIME_TYPE := TIME_INVALID; -- Test signal used for testbench synchronisation signal idle_sig : std_logic := '0'; + -- Signal used to pass Endpoint Pointers to the Endpoint Memory Process + signal mem_addr_update : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); -- *MEMORY PROCESS* -- Memory FSM state @@ -268,8 +275,8 @@ architecture arch of rtps_reader is signal mem_endpoint_latch_data, mem_endpoint_latch_data_next : ENDPOINT_LATCH_DATA_TYPE := ZERO_ENDPOINT_LATCH_DATA; -- Position (In Endpoint Memory Frame Granularity) of current relevant Endpoint signal mem_pos, mem_pos_next : natural range 0 to MAX_REMOTE_ENDPOINTS-1 := 0; - -- Signifies an abort of the currently initiated read transaction - signal abort_read : std_logic := '0'; + -- Endpoint Memory Flag Array denoting which mem_endpoint_data Fields are up-to-date with the respective fields of the Endpoint (Pointed by mem_addr_base) + signal current_emf, current_emf_next : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (others => '0'); -- *MEMORY CONTROL CONNECTION SIGNALS* signal mem_addr : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); @@ -277,7 +284,7 @@ architecture arch of rtps_reader is signal mem_ready_in, mem_valid_in : std_logic := '0'; signal mem_ready_out, mem_valid_out : std_logic := '0'; signal mem_read : std_logic := '0'; - + signal abort_read : std_logic := '0'; --*****ALIAS DECLARATION***** -- ENDPOINT FRAME HEADER @@ -297,7 +304,7 @@ architecture arch of rtps_reader is alias data_flag : std_logic is flags(2); alias key_flag : std_logic is flags(3); alias final_flag : std_logic is flags(1); - alias payload_flag : std_logic is flags(4); + alias non_std_flag : std_logic is flags(4); alias liveliness_flag : std_logic is flags(2); -- HEARTBEAT alias first_seq_nr : SEQUENCENUMBER_TYPE is sn_latch_1; @@ -434,6 +441,7 @@ begin mem_field_flags <= (others => '0'); data_out_hc <= (others => '0'); data_out_rtps <= (others => '0'); + mem_addr_update <= (others => '0'); @@ -522,7 +530,6 @@ begin else rd_guard := '1'; end if; - cnt_next <= cnt + 1; case (cnt) is -- GUID Prefix 1/3 @@ -532,6 +539,7 @@ begin else guid_next(0) <= data_in_user; end if; + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 1 => if (is_meta = '1') then @@ -539,6 +547,7 @@ begin else guid_next(1) <= data_in_user; end if; + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 2 => if (is_meta = '1') then @@ -584,7 +593,7 @@ begin mem_opcode <= SEARCH_ENDPOINT; mem_field_flags <= (others => '0'); -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then stage_next <= LATCH_ENDPOINT_DATA; cnt_next <= 0; else @@ -637,16 +646,16 @@ begin end if; when LATCH_ENDPOINT_DATA => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Input FIFO Guard if (empty_meta = '0') then rd_meta <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- IPv4 Address when 0 => addr_next <= data_in_meta; + cnt_next <= cnt + 1; -- UDP Port when 1 => --assert (last_word_in_meta = '1') report "last_word_in_meta not set" severity FAILURE; @@ -667,7 +676,7 @@ begin -- Endpoint already in Memory if (mem_addr_base /= ENDPOINT_MEMORY_MAX_ADDRESS) then -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Update the Endpoint Data -- NOTE: The Lease Duration is NOT updated in case of an update. That is the responsibility of the Liveliness Update mem_op_start <= '1'; @@ -700,7 +709,7 @@ begin -- Ignore stage_next <= IDLE; else - -- Propagate Removal + -- Propagate Removal (Sent Memory Position as ID) start_hc <= '1'; opcode_hc <= REMOVE_WRITER; data_out_hc <= std_logic_vector(to_unsigned(mem_pos, WORD_WIDTH)); @@ -714,8 +723,12 @@ begin end if; end if; when OPCODE_PARTICIPANT_UNMATCH => + -- Precondition: mem_endpoint_data set (EMF_GUIDPREFIX_FLAG) + case (cnt) is when 0 => + assert check_mask(current_emf, EMF_GUIDPREFIX_FLAG) severity FAILURE; + -- Reached End of Endpoints if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- DONE @@ -723,7 +736,7 @@ begin else -- Participant Match if (guid(0) = mem_endpoint_data.guid(0) and guid(1) = mem_endpoint_data.guid(1) and guid(2) = mem_endpoint_data.guid(2)) then - -- Propagate Removal + -- Propagate Removal (Sent Memory Position as ID) start_hc <= '1'; opcode_hc <= REMOVE_WRITER; data_out_hc <= std_logic_vector(to_unsigned(mem_pos, WORD_WIDTH)); @@ -748,10 +761,14 @@ begin null; end case; when OPCODE_LIVELINESS_UPDATE => + -- Precondition: mem_endpoint_data set (EMF_GUIDPREFIX_FLAG) + -- Synthesis Guard if (LIVELINESS_QOS /= MANUAL_BY_TOPIC_LIVELINESS_QOS) then case (cnt) is when 0 => + assert check_mask(current_emf, EMF_GUIDPREFIX_FLAG) severity FAILURE; + -- No matches in memory if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- DONE @@ -806,21 +823,23 @@ begin -- Input FIFO Guard if (empty_user = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Sequence Number 1/2 when 0 => seq_nr_next(0) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- Sequence Number 2/2 when 1 => seq_nr_next(1) <= unsigned(data_in_user); -- Store Next Sequence Number tmp_dw := (0 => seq_nr(0), 1 => unsigned(data_in_user)); next_seq_nr_next <= tmp_dw + 1; + cnt_next <= cnt + 1; -- Timestamp 1/2 when 2 => ts_next(0) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- Timestamp 2/2 when 3 => ts_next(1) <= unsigned(data_in_user); @@ -838,18 +857,20 @@ begin -- Input FIFO Guard if (empty_user = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- First Sequence Number 1/2 when 0 => first_seq_nr_next(0) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- First Sequence Number 2/2 when 1 => first_seq_nr_next(1) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- Last Sequence Number 1/2 when 2 => last_seq_nr_next(0) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- Last Sequence Number 2/2 when 3 => last_seq_nr_next(1) <= unsigned(data_in_user); @@ -860,8 +881,12 @@ begin end case; end if; when PROCESS_HEARTBEAT => + -- Precondition: mem_endpoint_data set (EMF_RES_TIME_FLAG, EMF_NEXT_SEQ_NR_FLAG) + -- Wait for Endpoint Search to finish if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_RES_TIME_FLAG or EMF_NEXT_SEQ_NR_FLAG) severity FAILURE; + -- DEFAULT stage_next <= SKIP_PACKET; @@ -905,7 +930,7 @@ begin end if; -- If current Sequence Number obsolete (removed from source history cache) elsif (first_seq_nr > mem_endpoint_data.next_seq_nr) then - -- Store new expected Sequence Number and set Response Dealy + -- Store new expected Sequence Number and set Response Delay next_seq_nr_next <= first_seq_nr; mem_op_start <= '1'; mem_opcode <= UPDATE_ENDPOINT; @@ -962,26 +987,30 @@ begin -- Input FIFO Guard if (empty_user = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- GapStart Sequence Number 1/2 when 0 => gap_start_next(0) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- GapStart Sequence Number 2/2 when 1 => gap_start_next(1) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- GapList.Base 1/2 when 2 => gap_list_base_next(0) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- GapList.Base 2/2 when 3 => gap_list_base_next(1) <= unsigned(data_in_user); + cnt_next <= cnt + 1; -- GapList.NumBits when 4 => gap_list_end_next <= gap_list_base + to_integer(unsigned(data_in_user)); bitmap_cnt_next <= unsigned(round_slv(data_in_user(log2c(MAX_BITMAP_WIDTH)-1 downto 0),bitmap_cnt'length)); cnt2_next <= 0; + cnt_next <= cnt + 1; -- GapList.Bitmap when 5 => -- Read Bitmap @@ -989,9 +1018,6 @@ begin cnt2_next <= cnt2 + 1; bitmap_latch_next(cnt2) <= data_in_user; - - -- Keep Sub-State - cnt_next <= cnt; else stage_next <= PROCESS_GAP; end if; @@ -1001,8 +1027,12 @@ begin end if; when PROCESS_GAP => + -- Precondition: mem_endpoint_data set (EMF_NEXT_SEQ_NR_FLAG) + -- Wait for Endpoint Search if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_NEXT_SEQ_NR_FLAG) severity FAILURE; + -- DEFAULT stage_next <= SKIP_PACKET; @@ -1028,8 +1058,6 @@ begin if (mem_op_done = '1') then tmp_bitmap := to_slv_bitmap(bitmap_latch); - -- TODO: Test GAP that has next expected not marked in GAP - -- First valid sequence number found if (tmp_bitmap(bitmap_pos) = '0') then -- Update next sequence number @@ -1147,13 +1175,13 @@ begin -- Input FIFO Guard if (empty_user = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Lifespan 1/2 when 0 => -- NOTE: We are misusing the sn_latch_1 as temporal CDR_LONG storage sn_latch_1_next(0) <= unsigned(data_in_swapped); + cnt_next <= cnt + 1; -- Lifespan 2/2 when 1 => tmp_dw := (0 => sn_latch_1(0), 1 => unsigned(data_in_swapped)); @@ -1172,18 +1200,20 @@ begin -- Input FIFO Guard if (empty_user = '0') then rd_guard := '1'; - cnt_next <= cnt + 1; case (cnt) is -- Key Hash 1/4 when 0 => key_hash_next(0) <= data_in_user; + cnt_next <= cnt + 1; -- Key Hash 2/4 when 1 => key_hash_next(1) <= data_in_user; + cnt_next <= cnt + 1; -- Key Hash 3/4 when 2 => key_hash_next(2) <= data_in_user; + cnt_next <= cnt + 1; -- Key Hash 4/4 when 3 => key_hash_next(3) <= data_in_user; @@ -1205,15 +1235,19 @@ begin stage_next <= SKIP_PARAMETER; end if; when INITIATE_ADD_CACHE_CHANGE_REQUEST => + -- Precondition: mem_endpoint_data set (EMF_NEXT_SEQ_NR_FLAG) + -- Wait for Endpoint Data if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_NEXT_SEQ_NR_FLAG) severity FAILURE; + -- Unknown Endpoint if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- Ignore stage_next <= SKIP_PACKET; else -- Data is Next expected Sequence Number - if ((RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and seq_nr = mem_endpoint_data.next_seq_nr) or (RELIABILTY_QOS = BEST_EFFORT_RELIABILITY_QOS and seq_nr >= mem_endpoint_data.next_seq_nr) or (DURABILITY_QOS = VOLATILE_DURABILITY_QOS and mem_endpoint_data.next_seq_nr = SEQUENCENUMBER_UNKNOWN)) then + if ((RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and seq_nr = mem_endpoint_data.next_seq_nr) or (RELIABILITY_QOS = BEST_EFFORT_RELIABILITY_QOS and seq_nr >= mem_endpoint_data.next_seq_nr) or (DURABILITY_QOS = VOLATILE_DURABILITY_QOS and mem_endpoint_data.next_seq_nr = SEQUENCENUMBER_UNKNOWN)) then -- SANITY CHECK: Skip if no Hash Key and no Payload if (WITH_KEY and key_hash_rcvd = '0' and data_flag = '0' and key_flag = '0') then -- Ignore @@ -1240,7 +1274,8 @@ begin valid_out_hc <= '1'; data_out_hc <= status_info; data_out_hc(SSI_KEY_HASH_FLAG) <= key_hash_rcvd when WITH_KEY; - data_out_hc(SSI_PAYLOAD_FLAG) <= data_flag; + -- NOTE: The SSI_DATA_FLAG states if the Payload contains normal Data for the Sample or the Serialized Key for the Key Hash calculation + data_out_hc(SSI_DATA_FLAG) <= data_flag; -- Output Guard if (ready_out_hc = '1') then cnt_next <= cnt + 1; @@ -1394,6 +1429,8 @@ begin stage_next <= SKIP_PACKET; end if; when ENDPOINT_STALE_CHECK => + -- Precondition: mem_endpoint_data set (EMF_LEASE_DEADLINE_FLAG, EMF_RES_TIME_FLAG) + -- Memory Operation Guard if (mem_op_done = '1') then case (cnt) is @@ -1402,9 +1439,11 @@ begin mem_op_start <= '1'; mem_opcode <= GET_NEXT_ENDPOINT; mem_field_flags <= EMF_LEASE_DEADLINE_FLAG or EMF_RES_TIME_FLAG; - cnt_next <= 1; + cnt_next <= cnt + 1; -- Check Endpoint when 1 => + assert check_mask(current_emf, EMF_LEASE_DEADLINE_FLAG or EMF_RES_TIME_FLAG) severity FAILURE; + -- End of Endpoints if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- Reset @@ -1414,7 +1453,7 @@ begin else -- Endpoint Lease Expired if (mem_endpoint_data.lease_deadline /= TIME_INVALID and mem_endpoint_data.lease_deadline <= time) then - -- Propagate Removal + -- Propagate Removal (Sent Memory Position as ID) start_hc <= '1'; opcode_hc <= REMOVE_WRITER; data_out_hc <= std_logic_vector(to_unsigned(mem_pos, WORD_WIDTH)); @@ -1427,7 +1466,7 @@ begin cnt_next <= 0; end if; -- Synthesis Guard/Response Time Reached - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.res_time <= time) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.res_time <= time) then -- If Suppression Delay passed, zero the time if(mem_endpoint_data.res_time(1)(0) = '1') then -- Disable Suppression @@ -1443,6 +1482,7 @@ begin mem_op_start <= '1'; mem_opcode <= GET_ENDPOINT; mem_field_flags <= EMF_ENTITYID_FLAG or EMF_IPV4_ADDR_FLAG or EMF_UDP_PORT_FLAG or EMF_NEXT_SEQ_NR_FLAG; + mem_addr_update <= mem_addr_base; cnt_next <= 2; end if; @@ -1452,7 +1492,7 @@ begin end if; else -- Update Check Time - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.lease_deadline /= TIME_INVALID and mem_endpoint_data.res_time < mem_endpoint_data.lease_deadline) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.lease_deadline /= TIME_INVALID and mem_endpoint_data.res_time < mem_endpoint_data.lease_deadline) then if (mem_endpoint_data.res_time < check_time) then check_time_next <= mem_endpoint_data.res_time; end if; @@ -1460,7 +1500,7 @@ begin if (mem_endpoint_data.lease_deadline < check_time) then check_time_next <= mem_endpoint_data.lease_deadline; end if; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID) then if (mem_endpoint_data.res_time < check_time) then check_time_next <= mem_endpoint_data.res_time; end if; @@ -1472,7 +1512,7 @@ begin end if; when 2 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Set Heartbeat Suppression Time if (HEARTBEAT_SUPPRESSION_DELAY /= DURATION_INFINITE and HEARTBEAT_SUPPRESSION_DELAY /= DURATION_ZERO) then -- Set Heartbeat Suppression Time @@ -1509,35 +1549,46 @@ begin end case; end if; when SEND_HEADER => - -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + -- Precondition: mem_endpoint_data set (EMF_IPV4_ADDR_FLAG, EMF_UDP_PORT_FLAG) + + -- Synthesis Guard / Wait for Endpoint Data + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_op_done = '1') then + assert check_mask(current_emf, EMF_IPV4_ADDR_FLAG or EMF_UDP_PORT_FLAG) severity FAILURE; + -- Output FIFO Guard if (full_rtps = '0') then wr_rtps <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- OUTPUT HEADER -- Src IPv4 Address when 0 => - data_out_rtps <= DEFAULT_IPv4_ADDRESS; + data_out_rtps <= DEFAULT_IPv4_ADDRESS; + cnt_next <= cnt + 1; -- Dest IPv4 Address when 1 => - data_out_rtps <= mem_endpoint_data.addr; + data_out_rtps <= mem_endpoint_data.addr; + cnt_next <= cnt + 1; -- Src and Dest UDPv4 Ports when 2 => - data_out_rtps <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn; + data_out_rtps <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn; + cnt_next <= cnt + 1; -- RTPS MESSAGE HEADER when 3 => - data_out_rtps <= PROTOCOL_RTPS; + data_out_rtps <= PROTOCOL_RTPS; + cnt_next <= cnt + 1; when 4 => - data_out_rtps <= PROTOCOLVERSION_2_4 & VENDORID; + data_out_rtps <= PROTOCOLVERSION_2_4 & VENDORID; + cnt_next <= cnt + 1; when 5 => - data_out_rtps <= GUIDPREFIX(0); + data_out_rtps <= GUIDPREFIX(0); + cnt_next <= cnt + 1; when 6 => - data_out_rtps <= GUIDPREFIX(1); + data_out_rtps <= GUIDPREFIX(1); + cnt_next <= cnt + 1; when 7 => - data_out_rtps <= GUIDPREFIX(2); + data_out_rtps <= GUIDPREFIX(2); + -- Continue with respective RTPS Submessage stage_next <= return_stage; cnt_next <= 0; @@ -1547,42 +1598,52 @@ begin end if; end if; when SEND_ACKNACK => - -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + -- Precondition: mem_endpoint_data set (EMF_ENTITYID_FLAG, EMF_NEXT_SEQ_NR_FLAG) + + -- Synthesis Guard / Wait for Endpoint Data + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_op_done = '1') then + assert check_mask(current_emf, EMF_ENTITYID_FLAG or EMF_NEXT_SEQ_NR_FLAG) severity FAILURE; + -- Output FIFO Guard if (full_rtps = '0') then wr_rtps <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- ACKNACK RTPS SUBMESSAGE -- RTPS Submessage Header when 0 => - data_out_rtps <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, SUBMESSAGE_LENGTH_WIDTH)); + data_out_rtps <= SID_ACKNACK & "00000010" & std_logic_vector(to_unsigned(28, SUBMESSAGE_LENGTH_WIDTH)); + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => - data_out_rtps <= ENTITYID; + data_out_rtps <= ENTITYID; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out_rtps <= mem_endpoint_data.guid(3); + data_out_rtps <= mem_endpoint_data.guid(3); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 1/2) when 3 => - data_out_rtps <= std_logic_vector(mem_endpoint_data.next_seq_nr(0)); + data_out_rtps <= std_logic_vector(mem_endpoint_data.next_seq_nr(0)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap Base 2/2) when 4 => - data_out_rtps <= std_logic_vector(mem_endpoint_data.next_seq_nr(1)); + data_out_rtps <= std_logic_vector(mem_endpoint_data.next_seq_nr(1)); + cnt_next <= cnt + 1; -- Sequence Number Set (NumBits) when 5 => - data_out_rtps <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + data_out_rtps <= std_logic_vector(to_unsigned(CDR_LONG_WIDTH, CDR_LONG_WIDTH)); + cnt_next <= cnt + 1; -- Sequence Number Set (Bitmap) when 6 => -- NOTE: In order to avoid having to generate a variable sized bitmap, we always request the next 32 sequence numbers, even if they do not exist (yet) -- XXX: Assumes correct implementation of the RTPS Protocol (i.e. Writer ignores requested SNs that do not exist) - data_out_rtps <= (others => '1'); + data_out_rtps <= (others => '1'); + cnt_next <= cnt + 1; -- Count when 7 => - data_out_rtps <= std_logic_vector(count); - last_word_out_rtps <= '1'; + data_out_rtps <= std_logic_vector(count); + last_word_out_rtps <= '1'; -- Stale Check in Progress if (stale_check = '1') then @@ -1705,6 +1766,7 @@ begin max_endpoint_addr_next <= max_endpoint_addr; mem_endpoint_latch_data_next <= mem_endpoint_latch_data; mem_pos_next <= mem_pos; + current_emf_next <= current_emf; -- DEFAULT Unregistered mem_addr <= (others => '0'); mem_write_data <= (others => '0'); @@ -1733,15 +1795,15 @@ begin case(mem_opcode) is when SEARCH_ENDPOINT => + current_emf_next <= mem_field_flags; + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; mem_pos_next <= 0; mem_stage_next <= SEARCH_ENDPOINT; mem_cnt_next <= 0; when INSERT_ENDPOINT => - mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; - mem_pos_next <= 0; - mem_stage_next <= FIND_EMPTY_SLOT; - mem_cnt_next <= 0; + current_emf_next <= (others => '1'); -- Set Endpoint Data mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; mem_endpoint_data_next.guid <= guid_next; @@ -1750,58 +1812,79 @@ begin mem_endpoint_data_next.next_seq_nr <= SEQUENCENUMBER_UNKNOWN when (DURABILITY_QOS = VOLATILE_DURABILITY_QOS) else FIRST_SEQUENCENUMBER; mem_endpoint_data_next.lease_deadline <= lease_deadline; mem_endpoint_data_next.res_time <= TIME_INVALID; + + mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; + mem_pos_next <= 0; + mem_stage_next <= FIND_EMPTY_SLOT; + mem_cnt_next <= 0; when UPDATE_ENDPOINT => - mem_stage_next <= UPDATE_ENDPOINT; - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_IPV4_ADDR_FLAG)) then + current_emf_next <= current_emf or mem_field_flags; + mem_stage_next <= UPDATE_ENDPOINT; + + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 0; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 1; elsif check_mask(mem_field_flags,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 2; elsif check_mask(mem_field_flags,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 6; else -- DONE mem_stage_next <= IDLE; end if; when REMOVE_ENDPOINT => + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + current_emf_next <= (others => '0'); + mem_stage_next <= REMOVE_ENDPOINT; mem_cnt_next <= 0; when GET_FIRST_ENDPOINT => + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + current_emf_next <= mem_field_flags; + mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; mem_pos_next <= 0; mem_stage_next <= GET_NEXT_ENDPOINT; mem_cnt_next <= 0; when GET_NEXT_ENDPOINT => + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + current_emf_next <= mem_field_flags; + -- Memory Bound Guard if (mem_addr_base >= max_endpoint_addr) then mem_addr_base_next <= ENDPOINT_MEMORY_MAX_ADDRESS; else - -- Reached End of Memory, No match mem_addr_base_next <= mem_addr_base + ENDPOINT_FRAME_SIZE; mem_pos_next <= mem_pos + 1; mem_stage_next <= GET_NEXT_ENDPOINT; mem_cnt_next <= 0; end if; when GET_ENDPOINT => + if (mem_addr_base /= mem_addr_update) then + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + current_emf_next <= mem_field_flags; + else + current_emf_next <= current_emf or mem_field_flags; + end if; + -- Fetch Endpoint Data mem_stage_next <= GET_ENDPOINT_DATA; - mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; if check_mask(mem_field_flags,EMF_ENTITYID_FLAG) then mem_cnt_next <= 0; elsif check_mask(mem_field_flags,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 1; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 5; elsif check_mask(mem_field_flags,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 6; elsif check_mask(mem_field_flags,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -1946,15 +2029,15 @@ begin mem_cnt_next <= 0; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 1; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 5; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 6; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -1977,15 +2060,15 @@ begin if (mem_ready_in = '1') then if check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 1; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 5; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 6; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else mem_cnt_next <= 12; @@ -2016,15 +2099,15 @@ begin mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 5; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 6; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2037,19 +2120,19 @@ begin -- GET IPv4 Address when 4 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_IPV4_ADDR_OFFSET; mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 5; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 6; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif ((RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif ((RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2065,7 +2148,7 @@ begin -- GET UDP Port/ Flags when 5 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_UDP_PORT_OFFSET; mem_read <= '1'; @@ -2075,14 +2158,14 @@ begin mem_cnt_next <= 6; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then mem_cnt_next <= 12; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 13; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 16; else mem_cnt_next <= 17; @@ -2108,16 +2191,16 @@ begin if (mem_ready_in = '1') then if check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then mem_cnt_next <= 12; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 13; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 16; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 17; else mem_cnt_next <= 18; @@ -2140,16 +2223,16 @@ begin mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then mem_cnt_next <= 12; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 13; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 16; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 17; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 18; @@ -2161,7 +2244,7 @@ begin -- GET Response Time 1/2 when 10 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET; mem_read <= '1'; @@ -2173,7 +2256,7 @@ begin -- GET Response Time 2/2 when 11 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET + 1; mem_read <= '1'; @@ -2183,9 +2266,9 @@ begin mem_cnt_next <= 12; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 13; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 16; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 17; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 18; @@ -2205,15 +2288,15 @@ begin if check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 13; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 16; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 17; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 18; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 22; else -- DONE @@ -2245,15 +2328,15 @@ begin if (mem_valid_out = '1') then mem_endpoint_data_next.guid(2) <= mem_read_data; - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 16; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 17; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 18; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 22; else -- DONE @@ -2263,19 +2346,19 @@ begin -- READ IPv4 Address when 16 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then mem_endpoint_data_next.addr <= mem_read_data; - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 17; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 18; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 22; else -- DONE @@ -2286,7 +2369,7 @@ begin -- READ UDP Port when 17 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2296,7 +2379,7 @@ begin mem_cnt_next <= 18; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 22; else -- DONE @@ -2322,7 +2405,7 @@ begin if check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 22; else -- DONE @@ -2345,7 +2428,7 @@ begin if (mem_valid_out = '1') then mem_endpoint_data_next.lease_deadline(1) <= unsigned(mem_read_data); - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 22; else -- DONE @@ -2355,7 +2438,7 @@ begin -- READ Response Time 1/2 when 22 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2367,7 +2450,7 @@ begin -- READ Response Time 2/2 when 23 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2412,12 +2495,12 @@ begin mem_addr <= mem_addr_base + EMF_GUIDPREFIX_OFFSET + 2; mem_write_data <= mem_endpoint_latch_data.guid(2); if (mem_ready_in = '1') then - mem_cnt_next <= mem_cnt + 1 when (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) else 6; + mem_cnt_next <= mem_cnt + 1 when (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) else 6; end if; -- IPv4 Address when 4 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_IPV4_ADDR_OFFSET; mem_write_data <= mem_endpoint_latch_data.addr; @@ -2428,10 +2511,10 @@ begin -- UDPv4 Ports when 5 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_UDP_PORT_OFFSET; - mem_write_data <= mem_endpoint_latch_data.portn & ((mem_write_data'length-mem_endpoint_latch_data.portn'length-1) downto 0 => '0'); + mem_write_data <= mem_endpoint_latch_data.portn & (0 to (mem_write_data'length-mem_endpoint_latch_data.portn'length-1) => '0'); if (mem_ready_in = '1') then mem_cnt_next <= mem_cnt + 1; end if; @@ -2467,7 +2550,7 @@ begin mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.lease_deadline(1)); if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_cnt_next <= mem_cnt + 1; else -- DONE @@ -2477,7 +2560,7 @@ begin -- Response Time 1/2 when 10 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET; mem_write_data <= std_logic_vector(TIME_INVALID(0)); @@ -2487,7 +2570,7 @@ begin end if; -- Response Time 2/2 when 11 => - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET + 1; mem_write_data <= std_logic_vector(TIME_INVALID(1)); @@ -2504,20 +2587,20 @@ begin -- IPv4 Address when 0 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_IPV4_ADDR_OFFSET; mem_write_data <= mem_endpoint_latch_data.addr; mem_endpoint_data_next.addr <= mem_endpoint_latch_data.addr; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 1; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 2; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 6; else -- DONE @@ -2528,10 +2611,10 @@ begin -- UDPv4 Ports when 1 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_UDP_PORT_OFFSET; - mem_write_data <= mem_endpoint_latch_data.portn & ((mem_write_data'length-mem_endpoint_latch_data.portn'length-1) downto 0 => '0'); + mem_write_data <= mem_endpoint_latch_data.portn & (0 to (mem_write_data'length-mem_endpoint_latch_data.portn'length-1) => '0'); mem_endpoint_data_next.portn <= mem_endpoint_latch_data.portn; -- Memory Flow Control Guard if (mem_ready_in = '1') then @@ -2539,7 +2622,7 @@ begin mem_cnt_next <= 2; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 6; else -- DONE @@ -2566,7 +2649,7 @@ begin if (mem_ready_in = '1') then if check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 6; else -- DONE @@ -2590,7 +2673,7 @@ begin mem_endpoint_data_next.lease_deadline <= mem_endpoint_latch_data.lease_deadline; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 6; else -- DONE @@ -2600,7 +2683,7 @@ begin -- Response Time 1/2 when 6 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.res_time(0)); @@ -2612,7 +2695,7 @@ begin -- Response Time 2/2 when 7 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.res_time(1)); @@ -2779,15 +2862,15 @@ begin mem_cnt_next <= 0; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_GUIDPREFIX_FLAG) then mem_cnt_next <= 1; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_IPV4_ADDR_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG)) then mem_cnt_next <= 5; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_NEXT_SEQ_NR_FLAG) then mem_cnt_next <= 6; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -2897,6 +2980,7 @@ begin flags <= (others => '0'); opcode <= (others => '0'); count <= (others => '0'); + current_emf <= (others => '0'); key_hash <= (others => (others => '0')); bitmap_latch <= (others => (others => '0')); else @@ -2936,6 +3020,7 @@ begin flags <= flags_next; opcode <= opcode_next; count <= count_next; + current_emf <= current_emf_next; key_hash <= key_hash_next; bitmap_latch <= bitmap_latch_next; end if; diff --git a/src/rtps_test_package.vhd b/src/rtps_test_package.vhd index fa47808..d25028d 100644 --- a/src/rtps_test_package.vhd +++ b/src/rtps_test_package.vhd @@ -657,23 +657,23 @@ package body rtps_test_package is locator => ( 0 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & META_IPv4_MULTICAST_PORT, - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_META_ADDRESS + portn => (UDP_PORT_WIDTH to LOCATOR_PORT_WIDTH-1 => '0') & META_IPv4_MULTICAST_PORT, + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_META_ADDRESS ), 1 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & META_IPv4_UNICAST_PORT, - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_META_ADDRESS + portn => (UDP_PORT_WIDTH to LOCATOR_PORT_WIDTH-1 => '0') & META_IPv4_UNICAST_PORT, + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_META_ADDRESS ), 2 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & META_IPv4_MULTICAST_PORT, - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_ADDRESS + portn => (UDP_PORT_WIDTH to LOCATOR_PORT_WIDTH-1 => '0') & META_IPv4_MULTICAST_PORT, + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_ADDRESS ), 3 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & META_IPv4_UNICAST_PORT, - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_ADDRESS + portn => (UDP_PORT_WIDTH to LOCATOR_PORT_WIDTH-1 => '0') & META_IPv4_UNICAST_PORT, + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_ADDRESS ), others => EMPTY_LOCATOR ) @@ -683,13 +683,13 @@ package body rtps_test_package is locator => ( 0 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & USER_IPv4_MULTICAST_PORT, - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_ADDRESS + portn => (UDP_PORT_WIDTH to LOCATOR_PORT_WIDTH-1 => '0') & USER_IPv4_MULTICAST_PORT, + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_ADDRESS ), 1 => ( kind => LOCATOR_KIND_UDPv4, - portn => (LOCATOR_PORT_WIDTH-1 downto UDP_PORT_WIDTH => '0') & USER_IPv4_UNICAST_PORT, - addr => (LOCATOR_ADDR_WIDTH-1 downto IPv4_ADDRESS_WIDTH => '0') & DEFAULT_IPv4_ADDRESS + portn => (UDP_PORT_WIDTH to LOCATOR_PORT_WIDTH-1 => '0') & USER_IPv4_UNICAST_PORT, + addr => (IPv4_ADDRESS_WIDTH to LOCATOR_ADDR_WIDTH-1 => '0') & DEFAULT_IPv4_ADDRESS ), others => EMPTY_LOCATOR ) @@ -808,7 +808,7 @@ package body rtps_test_package is liveliness => DEFAULT_LIVELINESS_QOS, leaseDuration => DEFAULT_LEASE_DURATION, time_based_filter => DEFAULT_TIME_BASED_FILTER_QOS, - reliability => DEFAULT_RELIABILTY_QOS, + reliability => DEFAULT_RELIABILITY_QOS, max_blocking_time => DEFAULT_MAX_BLOCKING_TIME, transport_priority => DEFAULT_TRANSPORT_PRIORITY_QOS, lifespan => DEFAULT_LIFESPAN_QOS, @@ -1018,9 +1018,9 @@ package body rtps_test_package is begin if (ref.kind /= LOCATOR_KIND_UDPv4) then return FALSE; - elsif (ref.addr(IPv4_ADDRESS_WIDTH-1 downto 0) = (IPv4_ADDRESS_WIDTH-1 downto 0 => '0')) then + elsif (ref.addr(IPv4_ADDRESS_WIDTH-1 downto 0) = IPv4_ADDRESS_INVALID) then return FALSE; - elsif (ref.portn(UDP_PORT_WIDTH-1 downto 0) = (UDP_PORT_WIDTH-1 downto 0 => '0')) then + elsif (ref.portn(UDP_PORT_WIDTH-1 downto 0) = UDP_PORT_INVALID) then return FALSE; else return TRUE; @@ -1263,10 +1263,10 @@ package body rtps_test_package is if (ref.submessageID = SID_ACKNACK or ref.submessageID = SID_NACK_FRAG or ref.submessageID = SID_HEARTBEAT or ref.submessageID = SID_HEARTBEAT_FRAG or ref.submessageID = SID_GAP or ref.submessageID = SID_DATA or ref.submessageID = SID_DATA_FRAG or ref.submessageID = SID_INFO_TS or ref.submessageID = SID_INFO_SRC or ref.submessageID = SID_INFO_DST or ref.submessageID = SID_INFO_REPLY or ref.submessageID =SID_INFO_REPLY_IP4) then -- NOTE: A Submessage Length of 0 is left as is. -- Fix Submessage Length - if (ref.submessageLength = (ref.submessageLength'range => '1')) then + if (ref.submessageLength = (ref.submessageLength'reverse_range => '1')) then output.data(start)(SUBMESSAGE_LENGTH_WIDTH-1 downto 0) := endian_swap(ref.flags(SUBMESSAGE_ENDIAN_FLAG_POS), int((output.length-start-1)*4,SUBMESSAGE_LENGTH_WIDTH)); -- Fix(Truncate/Extend) Packet Length to specified Length - elsif (ref.submessageLength /= (ref.submessageLength'range => '0')) then + elsif (ref.submessageLength /= (ref.submessageLength'reverse_range => '0')) then output.length := start + to_integer(unsigned(ref.submessageLength)); end if; -- *PAD/UKNOWN* @@ -1422,7 +1422,7 @@ package body rtps_test_package is null; end case; if (ref.payload.length > 0 and (not ref.serialized_key)) then - output.data(output.length)(SSI_PAYLOAD_FLAG) := '1'; + output.data(output.length)(SSI_DATA_FLAG) := '1'; end if; if (ref.instance /= HANDLE_NIL) then output.data(output.length)(SSI_KEY_HASH_FLAG) := '1'; @@ -1604,7 +1604,7 @@ package body rtps_test_package is end if; end if; -- METATRAFFIC MULTICAST LOCATOR - if (ref.metatrafficMulticastLocatorList.numLocators /= (ref.metatrafficMulticastLocatorList.numLocators'range => '0')) then + if (ref.metatrafficMulticastLocatorList.numLocators /= (ref.metatrafficMulticastLocatorList.numLocators'reverse_range => '0')) then tmp := to_integer(unsigned(ref.metatrafficMulticastLocatorList.numLocators)); for i in 0 to tmp-1 loop if (pid = PID_METATRAFFIC_MULTICAST_LOCATOR) then @@ -1632,7 +1632,7 @@ package body rtps_test_package is end loop; end if; -- METATRAFFIC UNICAST LOCATOR - if (ref.metatrafficUnicastLocatorList.numLocators /= (ref.metatrafficUnicastLocatorList.numLocators'range => '0')) then + if (ref.metatrafficUnicastLocatorList.numLocators /= (ref.metatrafficUnicastLocatorList.numLocators'reverse_range => '0')) then tmp := to_integer(unsigned(ref.metatrafficUnicastLocatorList.numLocators)); for i in 0 to tmp-1 loop if (pid = PID_METATRAFFIC_UNICAST_LOCATOR) then @@ -1660,7 +1660,7 @@ package body rtps_test_package is end loop; end if; -- DEFAULT MULTICAST LOCATOR - if (ref.defaultMulticastLocatorList.numLocators /= (ref.defaultMulticastLocatorList.numLocators'range => '0')) then + if (ref.defaultMulticastLocatorList.numLocators /= (ref.defaultMulticastLocatorList.numLocators'reverse_range => '0')) then tmp := to_integer(unsigned(ref.defaultMulticastLocatorList.numLocators)); for i in 0 to tmp-1 loop if (pid = PID_DEFAULT_MULTICAST_LOCATOR) then @@ -1689,7 +1689,7 @@ package body rtps_test_package is end if; -- DEFAULT UNICAST LOCATOR assert (unsigned(ref.defaultUnicastLocatorList.numLocators) > 0) report "PARTICIPANT_DATA: Participant needs to have at least one Default Unicast Locator." severity error; - if (ref.defaultUnicastLocatorList.numLocators /= (ref.defaultUnicastLocatorList.numLocators'range => '0')) then + if (ref.defaultUnicastLocatorList.numLocators /= (ref.defaultUnicastLocatorList.numLocators'reverse_range => '0')) then tmp := to_integer(unsigned(ref.defaultUnicastLocatorList.numLocators)); for i in 0 to tmp-1 loop if (pid = PID_DEFAULT_UNICAST_LOCATOR) then @@ -1885,7 +1885,7 @@ package body rtps_test_package is -- UDP Port when 5 => if (ref.match = MATCH) then - ret(i).data := user_loc.portn(UDP_PORT_WIDTH-1 downto 0) & (UDP_PORT_WIDTH-1 downto 0 => '0'); + ret(i).data := user_loc.portn(UDP_PORT_WIDTH-1 downto 0) & UDP_PORT_INVALID; else ret(i).data := (others => '-'); end if; @@ -2004,7 +2004,7 @@ package body rtps_test_package is -- UDP Port when 5 => if (ref.match = MATCH) then - ret(i).data := user_loc.portn(UDP_PORT_WIDTH-1 downto 0) & (UDP_PORT_WIDTH-1 downto 0 => '0'); + ret(i).data := user_loc.portn(UDP_PORT_WIDTH-1 downto 0) & UDP_PORT_INVALID; ret(i).data(READER_EXPECTS_INLINE_QOS_FLAG) := ref.expectsInlineQoS(0); ret(i).data(READER_EXPECTS_HISTORICAL_DATA_FLAG) := '1' when (ref.durability /= VOLATILE_DURABILITY_QOS) else '0'; ret(i).data(READER_IS_BEST_EFFORT_FLAG) := '1' when (ref.reliability = BEST_EFFORT_RELIABILITY_QOS) else '0'; @@ -2073,7 +2073,7 @@ package body rtps_test_package is -- UDP Port when 5 => if (ref.match = MATCH) then - ret(i).data := user_loc.portn(UDP_PORT_WIDTH-1 downto 0) & (UDP_PORT_WIDTH-1 downto 0 => '0'); + ret(i).data := user_loc.portn(UDP_PORT_WIDTH-1 downto 0) & UDP_PORT_INVALID; ret(i).data(READER_EXPECTS_INLINE_QOS_FLAG) := ref.expectsInlineQoS(0); ret(i).data(READER_EXPECTS_HISTORICAL_DATA_FLAG) := '1' when (ref.durability /= VOLATILE_DURABILITY_QOS) else '0'; ret(i).data(READER_IS_BEST_EFFORT_FLAG) := '1' when (ref.reliability = BEST_EFFORT_RELIABILITY_QOS) else '0'; @@ -2373,7 +2373,7 @@ package body rtps_test_package is end if; end if; -- RELIABILITY - if (ref.reliability /= DEFAULT_RELIABILTY_QOS or ref.max_blocking_time /= DEFAULT_MAX_BLOCKING_TIME or pid = PID_RELIABILITY) then + if (ref.reliability /= DEFAULT_RELIABILITY_QOS or ref.max_blocking_time /= DEFAULT_MAX_BLOCKING_TIME or pid = PID_RELIABILITY) then if (pid = PID_RELIABILITY) then assert (12+(offset*4) >= 0) report "Parameter Length < 0" severity FAILURE; output.data(output.length) := PID_RELIABILITY & endian_swap(ref.littleEndian, int(12+(offset*4),PARAMETER_LENGTH_WIDTH)); @@ -2601,7 +2601,7 @@ package body rtps_test_package is procedure gen_sentinel(output : inout TEST_PACKET_TYPE) is begin - output.data(output.length) := PID_SENTINEL & (PARAMETER_LENGTH_WIDTH-1 downto 0 => '0'); + output.data(output.length) := PID_SENTINEL & (0 to PARAMETER_LENGTH_WIDTH-1 => '0'); output.length := output.length + 1; end procedure; @@ -2803,7 +2803,7 @@ package body rtps_test_package is end if; end if; -- RELIABILITY - if (endpoint.reliability /= DEFAULT_RELIABILTY_QOS or endpoint.max_blocking_time /= DEFAULT_MAX_BLOCKING_TIME or pid = PID_RELIABILITY) then + if (endpoint.reliability /= DEFAULT_RELIABILITY_QOS or endpoint.max_blocking_time /= DEFAULT_MAX_BLOCKING_TIME or pid = PID_RELIABILITY) then if (pid = PID_RELIABILITY) then assert (12+(offset*4) >= 0) report "Parameter Length < 0" severity FAILURE; output.data(output.length) := PID_RELIABILITY & endian_swap(littleEndian, int(12+(offset*4),PARAMETER_LENGTH_WIDTH)); @@ -3155,7 +3155,7 @@ package body rtps_test_package is for i in 0 to max(mem.ilen-1,0) loop -- Instance Found if (inst = mem.inst(i).inst) then - if (((mem.inst(i).istate and istate) /= (istate'range => '0')) and ((mem.inst(i).vstate and vstate) /= (vstate'range => '0'))) then + if (((mem.inst(i).istate and istate) /= (istate'reverse_range => '0')) and ((mem.inst(i).vstate and vstate) /= (vstate'reverse_range => '0'))) then return TRUE; end if; end if; @@ -3173,6 +3173,7 @@ package body rtps_test_package is end if; end loop; assert FALSE report "Instance not in Memory" severity FAILURE; + return mem.ilen; end function; procedure gen_collection (mem : inout DDS_READER_MEM_TYPE; col : inout COLLECTION_TYPE; inst : INSTANCE_HANDLE_TYPE; sstate : in std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0); istate : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0); vstate : in std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0); max_samples : in natural; remove : in boolean; sort : in boolean) is @@ -3189,7 +3190,7 @@ package body rtps_test_package is loop if (no_inst) then -- Sample and Instance Compatible - if (((mem.s(i).sstate and sstate) /= (sstate'range => '0')) and check_instance(istate, vstate, mem, mem.s(i).inst) and ((inst /= HANDLE_NIL and inst = mem.s(i).inst) or inst = HANDLE_NIL) and (sel(i) /= '1')) then + if (((mem.s(i).sstate and sstate) /= (sstate'reverse_range => '0')) and check_instance(istate, vstate, mem, mem.s(i).inst) and ((inst /= HANDLE_NIL and inst = mem.s(i).inst) or inst = HANDLE_NIL) and (sel(i) /= '1')) then col.s(col.len) := mem.s(i); col.s(col.len).istate := mem.inst(find_instance(mem,mem.s(i).inst)).istate; col.s(col.len).vstate := mem.inst(find_instance(mem,mem.s(i).inst)).vstate; @@ -3206,7 +3207,7 @@ package body rtps_test_package is end if; end if; -- Sample Compatible (and belonging to specified Instance) - elsif (((mem.s(i).sstate and sstate) /= (sstate'range => '0')) and (mem.s(i).inst = tmp_inst) and (sel(i) /= '1')) then + elsif (((mem.s(i).sstate and sstate) /= (sstate'reverse_range => '0')) and (mem.s(i).inst = tmp_inst) and (sel(i) /= '1')) then col.s(col.len) := mem.s(i); col.s(col.len).istate := mem.inst(find_instance(mem,mem.s(i).inst)).istate; col.s(col.len).vstate := mem.inst(find_instance(mem,mem.s(i).inst)).vstate; diff --git a/src/rtps_writer.vhd b/src/rtps_writer.vhd index a0fef60..bd82d47 100644 --- a/src/rtps_writer.vhd +++ b/src/rtps_writer.vhd @@ -11,7 +11,7 @@ use work.rtps_config_package.all; entity rtps_writer is generic ( - RELIABILTY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); + RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); LIVELINESS_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); DURABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); DESTINATION_ORDER_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0); @@ -79,7 +79,7 @@ architecture arch of rtps_writer is ret := 15 when (qos = RELIABLE_RELIABILITY_QOS) else 6; return ret; end function; - constant ENDPOINT_FRAME_SIZE : natural := gen_frame_size(RELIABILTY_QOS); + constant ENDPOINT_FRAME_SIZE : natural := gen_frame_size(RELIABILITY_QOS); -- Endpoint Memory Size in 4-Byte Words constant ENDPOINT_MEMORY_SIZE : natural := MAX_REMOTE_ENDPOINTS * ENDPOINT_FRAME_SIZE; -- Endpoint Memory Address Width @@ -91,7 +91,7 @@ architecture arch of rtps_writer is -- Address pointing to the beginning of the first Endpoint Data Frame constant FIRST_ENDPOINT_ADDRESS : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); - -- *ENDPOINT MEMORY FORMAT FORMAT FLAGS* + -- *ENDPOINT MEMORY FRAME FIELD FLAGS* -- Flags mapping to the respective Endpoint Memory Frame Fields constant EMF_FLAG_WIDTH : natural := 9; constant EMF_ENTITYID_FLAG : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (0 => '1', others => '0'); @@ -105,7 +105,7 @@ architecture arch of rtps_writer is constant EMF_REQ_SEQ_NR_BITMAP_FLAG : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (8 => '1', others => '0'); - -- *ENDPOINT MEMORY FRAME FORMAT* + -- *ENDPOINT MEMORY FRAME FIELD OFFSETS* -- 4-Byte Word Offsets to Beginning of Respective Fields in the Endpoint Memory Frame constant EMF_ENTITYID_OFFSET : natural := 0; constant EMF_GUIDPREFIX_OFFSET : natural := 1; @@ -129,13 +129,18 @@ architecture arch of rtps_writer is RESET_MAX_POINTER, GET_NEXT_ENDPOINT, RESET_MEMORY); -- *Memory FSM Opcodes* -- OPCODE DESCRIPTION - -- SEARCH_ENDPOINT Find Endpoint with specified GUID in memory - -- INSERT_ENDPOINT Insert Endpoint to first available empty_user slot in memory - -- UPDATE_ENDPOINT Update Endpoint pointed by mem_addr_base. (mem_field_flags specifies which Fields to update) - -- REMOVE_ENDPOINT Remove Endpoint pointed by mem_addr_base - -- GET_FIRST_ENDPOINT Get Endpoint Data of first Endpoint stored in Memory. (mem_field_flags specifies which Fields to get) - -- GET_NEXT_ENDPOINT Get Endpoint Data of next Endpoint (from the Endpoint pointed by mem_addr_base) stored in Memory. (mem_field_flags specifies which Fields to get) - -- GET_ENDPOINT Get Endpoint Data from Endpoint currently pointed by mem_addr_base. (mem_field_flags specifies which Fields to get) + -- SEARCH_ENDPOINT Search memory for Endpoint with GUID equal to "guid" signal. + -- Set "mem_addr_base" to base Address of found Endpoint, or ENDPOINT_MEMORY_MAX_ADDRESS if nothing found. + -- "mem_endpoint_data" contains Endpoint Data according to "mem_field_flags". + -- INSERT_ENDPOINT Insert Endpoint to first available empty slot in memory + -- UPDATE_ENDPOINT Update Endpoint pointed by "mem_addr_base" according to "mem_field_flags". + -- REMOVE_ENDPOINT Remove Endpoint pointed by "mem_addr_base" + -- GET_FIRST_ENDPOINT Get Endpoint Data of first Endpoint stored in Memory according to "mem_field_flags". + -- Set "mem_addr_base" to Address of Endpoint, or ENDPOINT_MEMORY_MAX_ADDRESS if no Endpoint in Memory. + -- GET_NEXT_ENDPOINT Get Endpoint Data of next Endpoint (from the Endpoint pointed by "mem_addr_base") according to "mem_field_flags". + -- Set "mem_addr_base" to Address of Endpoint, or ENDPOINT_MEMORY_MAX_ADDRESS if no other Endpoint in Memory. + -- GET_ENDPOINT Get Endpoint Data from Endpoint pointed by "mem_addr_update" according to "mem_field_flags". + -- Already fetched data of the same Endpoint is not modified. type MEM_OPCODE_TYPE is (NOP, SEARCH_ENDPOINT, INSERT_ENDPOINT, UPDATE_ENDPOINT, REMOVE_ENDPOINT, GET_FIRST_ENDPOINT, GET_NEXT_ENDPOINT, GET_ENDPOINT); -- Record of Endpoint Data @@ -278,6 +283,8 @@ architecture arch of rtps_writer is signal req_bitmap_pos, req_bitmap_pos_next : natural range 0 to req_seq_nr_bitmap'length-1 := 0; -- Test signal used for testbench synchronisation signal idle_sig : std_logic := '0'; + -- Signal used to pass Endpoint Pointers to the Endpoint Memory Process + signal mem_addr_update : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); -- *MEMORY PROCESS* -- Memory FSM state @@ -298,8 +305,8 @@ architecture arch of rtps_writer is signal mem_endpoint_latch_data, mem_endpoint_latch_data_next : ENDPOINT_LATCH_DATA_TYPE := ZERO_ENDPOINT_LATCH_DATA; -- Position (In Endpoint Memory Frame Granularity) of current relevant Endpoint signal mem_pos, mem_pos_next : natural range 0 to MAX_REMOTE_ENDPOINTS-1 := 0; - -- Signifies an abort of the currently initiated read transaction - signal abort_read : std_logic := '0'; + -- Endpoint Memory Flag Array denoting which mem_endpoint_data Fields are up-to-date with the respective fields of the Endpoint (Pointed by mem_addr_base) + signal current_emf, current_emf_next : std_logic_vector(0 to EMF_FLAG_WIDTH-1) := (others => '0'); -- *MEMORY CONTROL CONNECTION SIGNALS* signal mem_addr : unsigned(ENDPOINT_MEMORY_ADDR_WIDTH-1 downto 0) := (others => '0'); @@ -307,6 +314,7 @@ architecture arch of rtps_writer is signal mem_ready_in, mem_valid_in : std_logic := '0'; signal mem_ready_out, mem_valid_out : std_logic := '0'; signal mem_read : std_logic := '0'; + signal abort_read : std_logic := '0'; --*****ALIAS DECLARATION***** @@ -322,7 +330,7 @@ architecture arch of rtps_writer is alias qos_flag : std_logic is data_out_rtps(17); alias data_flag : std_logic is data_out_rtps(18); alias key_flag : std_logic is data_out_rtps(19); - alias payload_flag : std_logic is data_out_rtps(20); + alias non_std_flag : std_logic is data_out_rtps(20); -- ACKNACK alias nack_base : SEQUENCENUMBER_TYPE is sn_latch_1; alias nack_base_next : SEQUENCENUMBER_TYPE is sn_latch_1_next; @@ -465,6 +473,7 @@ begin seq_nr_hc <= SEQUENCENUMBER_UNKNOWN; mem_field_flags <= (others => '0'); data_out_rtps <= (others => '0'); + mem_addr_update <= (others => '0'); -- Assert Liveliness Latch Setter if (liveliness_assertion = '1') then @@ -517,7 +526,7 @@ begin cnt_next <= 0; end if; -- Heartbeat Timeout - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and time >= heartbeat_time) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and time >= heartbeat_time) then start_hc <= '1'; opcode_hc <= GET_MIN_SN; @@ -532,7 +541,7 @@ begin cnt_next <= 0; end if; -- Stale Check Timeout - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and time >= check_time) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and time >= check_time) then -- Memory Operation Guard if (mem_op_done = '1') then stale_check_next <= '1'; @@ -580,10 +589,10 @@ begin -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then stage_next <= LATCH_SRC_ADDR; -- SANITY CHECK: Skip Packet if non-standard Payload - if(header_opcode = SID_DATA and payload_flag = '1') then + if(header_opcode = SID_DATA and non_std_flag = '1') then stage_next <= SKIP_PACKET; end if; else @@ -600,7 +609,6 @@ begin else rd_user <= '1'; end if; - cnt_next <= cnt + 1; case (cnt) is -- GUID Prefix 1/3 @@ -610,6 +618,7 @@ begin else guid_next(0) <= data_in_user; end if; + cnt_next <= cnt + 1; -- GUID Prefix 2/3 when 1 => if (is_meta = '1') then @@ -617,6 +626,7 @@ begin else guid_next(1) <= data_in_user; end if; + cnt_next <= cnt + 1; -- GUID Prefix 3/3 when 2 => if (is_meta = '1') then @@ -679,7 +689,7 @@ begin end case; else -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then case (opcode) is when SID_ACKNACK => stage_next <= LATCH_ACKNACK; @@ -697,12 +707,12 @@ begin -- Input FIFO Guard if (empty_meta = '0') then rd_meta <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- IPv4 Address when 0 => addr_next <= data_in_meta; + cnt_next <= cnt + 1; -- UDP Port when 1 => --assert (last_word_in_meta = '1') report "last_word_in_meta not set" severity FAILURE; @@ -734,7 +744,7 @@ begin mem_op_start <= '1'; mem_opcode <= INSERT_ENDPOINT; - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and LEASE_DURATION /= DURATION_INFINITE and reader_flags(READER_IS_BEST_EFFORT_FLAG) = '0') then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and LEASE_DURATION /= DURATION_INFINITE and reader_flags(READER_IS_BEST_EFFORT_FLAG) = '0') then lease_deadline <= time + LEASE_DURATION; -- XXX: Possible Worst Case Path (64-bit addition and comparison in same clock) @@ -772,6 +782,8 @@ begin end if; end if; when OPCODE_ENDPOINT_UNMATCH => + assert check_mask(current_emf, EMF_ACK_SEQ_NR_BASE_FLAG) severity FAILURE; + -- Endpoint not in Memory if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- Ignore @@ -782,7 +794,7 @@ begin mem_opcode <= REMOVE_ENDPOINT; -- Global ACK SN possibly changed - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and global_ack_seq_nr_base /= SEQUENCENUMBER_UNKNOWN and global_ack_seq_nr_base = mem_endpoint_data.ack_seq_nr_base) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and global_ack_seq_nr_base /= SEQUENCENUMBER_UNKNOWN and global_ack_seq_nr_base = mem_endpoint_data.ack_seq_nr_base) then -- Update Global ACK stage_next <= UPDATE_GLOBAL_ACK; cnt_next <= 0; @@ -794,10 +806,12 @@ begin when OPCODE_PARTICIPANT_UNMATCH => case (cnt) is when 0 => + assert check_mask(current_emf, EMF_GUIDPREFIX_FLAG) severity FAILURE; + -- Reached End of Endpoints if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- Global ACK SN possibly changed - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and global_ack_seq_nr_base /= SEQUENCENUMBER_UNKNOWN) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and global_ack_seq_nr_base /= SEQUENCENUMBER_UNKNOWN) then -- NOTE: We are triggering a Global ACK SN Update on each Participant Removal. This should not happen as often, and is therefore acceptable. -- Otherwise we need to check the ack_seq_nr_base in the other substate and mark when equal to current Global ACK SN. -- Update Global ACK @@ -831,7 +845,7 @@ begin end if; when LATCH_SRC_ADDR => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Input FIFO Guard if (empty_user = '0') then rd_user <= '1'; @@ -845,7 +859,7 @@ begin end if; when LATCH_ACKNACK => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Input FIFO Guard if (empty_user = '0') then case (cnt) is @@ -878,7 +892,7 @@ begin else -- NACK Bitmap is not Empty - if (long_latch /= (long_latch'range => '0')) then + if (long_latch /= (long_latch'reverse_range => '0')) then nack_bitmap_pos_next <= 0; stage_next <= PARSE_NACK_BITMAP; cnt_next <= 0; @@ -893,7 +907,7 @@ begin end if; when PARSE_NACK_BITMAP => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then tmp_bitmap := to_slv_bitmap(bitmap_latch); -- NOTE: nack_bitmap_pos is used for the NACK Bitmap, and cnt is used for the Request Bitmap. @@ -912,8 +926,6 @@ begin end if; -- Parse Rest when 1 => - nack_bitmap_pos_next <= nack_bitmap_pos + 1; - req_bitmap_pos_next <= req_bitmap_pos + 1; -- Next Requested Sequence Number if (tmp_bitmap(nack_bitmap_pos) = '1') then req_seq_nr_bitmap_next(req_bitmap_pos) <= '1'; @@ -922,6 +934,9 @@ begin -- End of Bitmap if (nack_bitmap_pos = unsigned(long_latch) or req_bitmap_pos = req_seq_nr_bitmap'length-1) then stage_next <= PROCESS_NACK; + else + nack_bitmap_pos_next <= nack_bitmap_pos + 1; + req_bitmap_pos_next <= req_bitmap_pos + 1; end if; -- Find Requested when others => @@ -929,10 +944,14 @@ begin end case; end if; when PROCESS_NACK => + -- Precondition: mem_endpoint_data set (EMF_RES_TIME_FLAG) + -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Wait for Endpoint Data if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_RES_TIME_FLAG) severity FAILURE; + -- Known Remote Endpoint if (mem_addr_base /= ENDPOINT_MEMORY_MAX_ADDRESS) then @@ -983,10 +1002,14 @@ begin end if; end if; when PROCESS_ACK => + -- Precondition: mem_endpoint_data set (EMF_ACK_SEQ_NR_BASE_FLAG) + -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Wait for Endpoint Search if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_ACK_SEQ_NR_BASE_FLAG) severity FAILURE; + -- DEFAULT stage_next <= SKIP_PACKET; @@ -1014,7 +1037,7 @@ begin end if; when UPDATE_GLOBAL_ACK => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Memory Operation Guard if (mem_op_done = '1') then case (cnt) is @@ -1027,6 +1050,8 @@ begin new_global_ack_next <= SEQUENCENUMBER_UNKNOWN; -- Find new global_ack_seq_nr_base when 1 => + assert check_mask(current_emf, EMF_ACK_SEQ_NR_BASE_FLAG) severity FAILURE; + -- End of Endpoints if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- New SNs have been ACKed by ALL remote Endpoints @@ -1079,7 +1104,7 @@ begin end if; when ENDPOINT_STALE_CHECK => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Memory Operation Guard if (mem_op_done = '1') then case (cnt) is @@ -1091,6 +1116,8 @@ begin cnt_next <= 1; -- Check Endpoint when 1 => + assert check_mask(current_emf, EMF_LEASE_DEADLINE_FLAG or EMF_RES_TIME_FLAG) severity FAILURE; + -- End of Endpoints if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- Reset @@ -1106,7 +1133,7 @@ begin -- Continue Search cnt_next <= 0; -- Synthesis Guard/Response Time Reached - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.res_time <= time) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.res_time <= time) then -- If Suppression Delay passed, zero the time if(mem_endpoint_data.res_time(1)(0) = '1') then -- Disable Suppression @@ -1122,6 +1149,7 @@ begin mem_op_start <= '1'; mem_opcode <= GET_ENDPOINT; mem_field_flags <= EMF_IPV4_ADDR_FLAG or EMF_UDP_PORT_FLAG or EMF_REQ_SEQ_NR_BASE_FLAG or EMF_REQ_SEQ_NR_BITMAP_FLAG; + mem_addr_update <= mem_addr_base; -- Send Requests stage_next <= HANDLE_REQUESTS; @@ -1134,7 +1162,7 @@ begin end if; else -- Update Check Time - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.lease_deadline /= TIME_INVALID and mem_endpoint_data.res_time < mem_endpoint_data.lease_deadline) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID and mem_endpoint_data.lease_deadline /= TIME_INVALID and mem_endpoint_data.res_time < mem_endpoint_data.lease_deadline) then if (mem_endpoint_data.res_time < check_time) then check_time_next <= mem_endpoint_data.res_time; end if; @@ -1142,7 +1170,7 @@ begin if (mem_endpoint_data.lease_deadline < check_time) then check_time_next <= mem_endpoint_data.lease_deadline; end if; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and mem_endpoint_data.res_time /= TIME_INVALID) then if (mem_endpoint_data.res_time < check_time) then check_time_next <= mem_endpoint_data.res_time; end if; @@ -1154,7 +1182,7 @@ begin end if; when 2 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_op_start <= '1'; mem_opcode <= UPDATE_ENDPOINT; mem_field_flags <= EMF_REQ_SEQ_NR_BASE_FLAG or EMF_REQ_SEQ_NR_BITMAP_FLAG or EMF_RES_TIME_FLAG; @@ -1164,15 +1192,16 @@ begin seq_nr <= SEQUENCENUMBER_UNKNOWN; -- Set Acknack Suppression Time if (ACKNACK_SUPPRESSION_DELAY /= DURATION_INFINITE and ACKNACK_SUPPRESSION_DELAY /= DURATION_ZERO) then + tmp_dw := time + ACKNACK_SUPPRESSION_DELAY; -- Set Acknack Suppression Time - res_time <= time + ACKNACK_SUPPRESSION_DELAY; + res_time <= tmp_dw; -- NOTE: Last Bit denotes if this is Response or Suppression Delay res_time(1)(0) <= '1'; -- XXX: Possible Worst Case Path (64-bit addition and comparison in same clock) -- Update Check Time - if ((time + ACKNACK_SUPPRESSION_DELAY) < check_time) then - check_time_next <= time + ACKNACK_SUPPRESSION_DELAY; + if (tmp_dw < check_time) then + check_time_next <= tmp_dw; end if; else -- Disable Suppression @@ -1196,7 +1225,7 @@ begin if (DURABILITY_QOS /= VOLATILE_DURABILITY_QOS and historical_push = '1') then stage_next <= HANDLE_HISTORICAL; cnt_next <= 4; -- Pre-Check Sub-state - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then stage_next <= HANDLE_HEARTBEATS; cnt_next <= 0; else @@ -1232,10 +1261,14 @@ begin end if; end if; when HANDLE_REQUESTS => + -- Precondition: mem_endpoint_data set (EMF_REQ_SEQ_NR_BASE_FLAG, EMF_REQ_SEQ_NR_BITMAP_FLAG) + -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then -- Wait for Endpoint Data if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_REQ_SEQ_NR_BASE_FLAG or EMF_REQ_SEQ_NR_BITMAP_FLAG) severity FAILURE; + case (cnt) is -- Next Bitmap Pos when 0 => @@ -1340,7 +1373,7 @@ begin end if; when HANDLE_HEARTBEATS => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then -- Memory Operation Guard if (mem_op_done = '1') then case (cnt) is @@ -1415,7 +1448,7 @@ begin if (mem_addr_base = ENDPOINT_MEMORY_MAX_ADDRESS) then -- ACK newly sent Cache Changes if Writer is BEST_EFFORT, or if all remore Readers are BEST_EFFORT - if (RELIABILTY_QOS /= RELIABLE_RELIABILITY_QOS or global_ack_seq_nr_base = SEQUENCENUMBER_UNKNOWN) then + if (RELIABILITY_QOS /= RELIABLE_RELIABILITY_QOS or global_ack_seq_nr_base = SEQUENCENUMBER_UNKNOWN) then start_hc <= '1'; opcode_hc <= REMOVE_CACHE_CHANGE when (DURABILITY_QOS = VOLATILE_DURABILITY_QOS) else ACK_CACHE_CHANGE; seq_nr_hc <= last_seq_nr; @@ -1508,12 +1541,12 @@ begin else next_seq_nr_next <= next_seq_nr + 1; -- If remote Reader is RELIABLE, NACK the SN - cnt_next <= (cnt + 1) when (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and reader_flags(READER_IS_BEST_EFFORT_FLAG) = '0') else (cnt + 2); + cnt_next <= (cnt + 1) when (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and reader_flags(READER_IS_BEST_EFFORT_FLAG) = '0') else (cnt + 2); end if; -- NACK SN when 1 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then start_hc <= '1'; opcode_hc <= NACK_CACHE_CHANGE; seq_nr_hc <= next_seq_nr; @@ -1591,64 +1624,79 @@ begin next_seq_nr_next <= min_sn; cnt_next <= cnt + 2; -- Skip Increment -- If remote Reader is RELIABLE, NACK the SN - cnt_next <= 1 when (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and reader_flags(READER_IS_BEST_EFFORT_FLAG) = '0') else 2; + cnt_next <= 1 when (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and reader_flags(READER_IS_BEST_EFFORT_FLAG) = '0') else 2; end if; when others => null; end case; end if; when SEND_HEADER => - -- Output FIFO Guard - if (full_rtps = '0') then - wr_rtps <= '1'; - cnt_next <= cnt + 1; + -- Precondition: mem_endpoint_data set (EMF_IPV4_ADDR_FLAG, EMF_UDP_PORT_FLAG) + + -- Wait for Endpoint Data + if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_IPV4_ADDR_FLAG or EMF_UDP_PORT_FLAG) severity FAILURE; - case (cnt) is - -- OUTPUT HEADER - -- Src IPv4 Address - when 0 => - data_out_rtps <= DEFAULT_IPv4_ADDRESS; - -- Dest IPv4 Address - when 1 => - data_out_rtps <= mem_endpoint_data.addr; - -- Src and Dest UDPv4 Ports - when 2 => - data_out_rtps <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn; - -- RTPS MESSAGE HEADER - when 3 => - data_out_rtps <= PROTOCOL_RTPS; - when 4 => - data_out_rtps <= PROTOCOLVERSION_2_4 & VENDORID; - when 5 => - data_out_rtps <= GUIDPREFIX(0); - when 6 => - data_out_rtps <= GUIDPREFIX(1); - when 7 => - data_out_rtps <= GUIDPREFIX(2); - -- Continue with respective RTPS Submessage - stage_next <= return_stage; - cnt_next <= return_cnt; - when others => - null; - end case; + -- Output FIFO Guard + if (full_rtps = '0') then + wr_rtps <= '1'; + + case (cnt) is + -- OUTPUT HEADER + -- Src IPv4 Address + when 0 => + data_out_rtps <= DEFAULT_IPv4_ADDRESS; + cnt_next <= cnt + 1; + -- Dest IPv4 Address + when 1 => + data_out_rtps <= mem_endpoint_data.addr; + cnt_next <= cnt + 1; + -- Src and Dest UDPv4 Ports + when 2 => + data_out_rtps <= USER_IPv4_UNICAST_PORT & mem_endpoint_data.portn; + cnt_next <= cnt + 1; + -- RTPS MESSAGE HEADER + when 3 => + data_out_rtps <= PROTOCOL_RTPS; + cnt_next <= cnt + 1; + when 4 => + data_out_rtps <= PROTOCOLVERSION_2_4 & VENDORID; + cnt_next <= cnt + 1; + when 5 => + data_out_rtps <= GUIDPREFIX(0); + cnt_next <= cnt + 1; + when 6 => + data_out_rtps <= GUIDPREFIX(1); + cnt_next <= cnt + 1; + when 7 => + data_out_rtps <= GUIDPREFIX(2); + + -- Continue with respective RTPS Submessage + stage_next <= return_stage; + cnt_next <= return_cnt; + when others => + null; + end case; + end if; end if; when SEND_INFO_TS => -- Output FIFO Guard if (full_rtps = '0') then wr_rtps <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- INFO_TS RTPS SUBMESSAGE -- RTPS Submessage Header when 0 => - data_out_rtps <= SID_INFO_TS & "00000000" & std_logic_vector(to_unsigned(8, SUBMESSAGE_LENGTH_WIDTH)); + data_out_rtps <= SID_INFO_TS & "00000000" & std_logic_vector(to_unsigned(8, SUBMESSAGE_LENGTH_WIDTH)); + cnt_next <= cnt + 1; -- Source Timestamp 1/2 when 1 => - data_out_rtps <= std_logic_vector(cc_source_timestamp(0)); + data_out_rtps <= std_logic_vector(cc_source_timestamp(0)); + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out_rtps <= std_logic_vector(cc_source_timestamp(1)); + data_out_rtps <= std_logic_vector(cc_source_timestamp(1)); stage_next <= SEND_DATA_A; cnt_next <= 0; @@ -1657,184 +1705,190 @@ begin end case; end if; when SEND_DATA_A => - -- Output FIFO Guard - if (full_rtps = '0') then - case (cnt) is - -- DATA RTPS SUBMESSAGE - -- RTPS Submessage Header - when 0 => - data_out_rtps <= SID_DATA & "00000000" & std_logic_vector(to_unsigned(0, SUBMESSAGE_LENGTH_WIDTH)); - data_flag <= '1' when (cc_kind = ALIVE) else '0'; - key_flag <= '1' when (WITH_KEY and cc_kind /= ALIVE) else '0'; - qos_flag <= '1' when (cc_kind /= ALIVE or WITH_KEY or mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') else '0'; - wr_rtps <= '1'; - cnt_next <= cnt + 1; - -- extraFlags, octetsToInlineQoS - when 1 => - data_out_rtps <= x"0000" & std_logic_vector(to_unsigned(16, 16)); - wr_rtps <= '1'; - cnt_next <= cnt + 1; - -- Reader Entity ID - when 2 => - data_out_rtps <= ENTITYID_UNKNOWN; - wr_rtps <= '1'; - cnt_next <= cnt + 1; - -- Writer Entity ID - when 3 => - data_out_rtps <= ENTITYID; - wr_rtps <= '1'; - cnt_next <= cnt + 1; - -- Sequence Number 1/2 - when 4 => - data_out_rtps <= std_logic_vector(next_seq_nr(0)); - wr_rtps <= '1'; - cnt_next <= cnt + 1; - -- Sequence Number 2/2 - when 5 => - data_out_rtps <= std_logic_vector(next_seq_nr(1)); - wr_rtps <= '1'; - - -- Need to send Key Hash - if (WITH_KEY) then - cnt_next <= cnt + 1; - -- Need to send Status Info - elsif (cc_kind /= ALIVE) then - cnt_next <= cnt + 6; - -- Reader expect in-line QoS - elsif(mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') then - stage_next <= SEND_INLINE_QOS; - cnt3_next <= 0; - -- Payload Available (DATA or Serialized Key) - elsif (cc_kind = ALIVE or (WITH_KEY and cc_kind /= ALIVE)) then - stage_next <= SEND_DATA_B; - cnt_next <= 0; - else - last_word_out_rtps <= '1'; - -- Continue - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then - stage_next <= HANDLE_REQUESTS; - cnt_next <= 0; - elsif (PUSH_MODE and new_push = '1') then - stage_next <= HANDLE_NEW; - cnt_next <= 4; - elsif (DURABILITY_QOS /= VOLATILE_DURABILITY_QOS and historical_push = '1') then - stage_next <= HANDLE_HISTORICAL; - cnt_next <= 0; - else - assert FALSE severity FAILURE; - end if; - end if; - -- Key Hash PID - when 6 => - -- Synthesis Guard - if (WITH_KEY) then - data_out_rtps <= PID_KEY_HASH & std_logic_vector(to_unsigned(16, SUBMESSAGE_LENGTH_WIDTH)); + -- Precondition: mem_endpoint_data set (EMF_UDP_PORT_FLAG) + + -- Wait for Endpoint Data + if (mem_op_done = '1') then + assert check_mask(current_emf, EMF_UDP_PORT_FLAG) severity FAILURE; + + -- Output FIFO Guard + if (full_rtps = '0') then + case (cnt) is + -- DATA RTPS SUBMESSAGE + -- RTPS Submessage Header + when 0 => + data_out_rtps <= SID_DATA & "00000000" & std_logic_vector(to_unsigned(0, SUBMESSAGE_LENGTH_WIDTH)); + data_flag <= '1' when (cc_kind = ALIVE) else '0'; + key_flag <= '1' when (WITH_KEY and cc_kind /= ALIVE) else '0'; + qos_flag <= '1' when (cc_kind /= ALIVE or WITH_KEY or mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') else '0'; wr_rtps <= '1'; cnt_next <= cnt + 1; - end if; - -- Key Hash 1/4 - when 7 => - -- Synthesis Guard - if (WITH_KEY) then - data_out_rtps <= std_logic_vector(cc_instance_handle(0)); + -- extraFlags, octetsToInlineQoS + when 1 => + data_out_rtps <= x"0000" & std_logic_vector(to_unsigned(16, 16)); wr_rtps <= '1'; cnt_next <= cnt + 1; - end if; - -- Key Hash 2/4 - when 8 => - -- Synthesis Guard - if (WITH_KEY) then - data_out_rtps <= std_logic_vector(cc_instance_handle(1)); + -- Reader Entity ID + when 2 => + data_out_rtps <= ENTITYID_UNKNOWN; wr_rtps <= '1'; cnt_next <= cnt + 1; - end if; - -- Key Hash 3/4 - when 9 => - -- Synthesis Guard - if (WITH_KEY) then - data_out_rtps <= std_logic_vector(cc_instance_handle(2)); + -- Writer Entity ID + when 3 => + data_out_rtps <= ENTITYID; wr_rtps <= '1'; cnt_next <= cnt + 1; - end if; - -- Key Hash 4/4 - when 10 => - -- Synthesis Guard - if (WITH_KEY) then - data_out_rtps <= std_logic_vector(cc_instance_handle(3)); + -- Sequence Number 1/2 + when 4 => + data_out_rtps <= std_logic_vector(next_seq_nr(0)); + wr_rtps <= '1'; + cnt_next <= cnt + 1; + -- Sequence Number 2/2 + when 5 => + data_out_rtps <= std_logic_vector(next_seq_nr(1)); wr_rtps <= '1'; - -- Need to send Status Info - if (cc_kind /= ALIVE) then + -- Need to send Key Hash + if (WITH_KEY) then cnt_next <= cnt + 1; + -- Need to send Status Info + elsif (cc_kind /= ALIVE) then + cnt_next <= cnt + 6; + -- Reader expect in-line QoS + elsif(mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') then + stage_next <= SEND_INLINE_QOS; + cnt3_next <= 0; + -- Payload Available (DATA or Serialized Key) + elsif (cc_kind = ALIVE or (WITH_KEY and cc_kind /= ALIVE)) then + stage_next <= SEND_DATA_B; + cnt_next <= 0; + else + last_word_out_rtps <= '1'; + -- Continue + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then + stage_next <= HANDLE_REQUESTS; + cnt_next <= 0; + elsif (PUSH_MODE and new_push = '1') then + stage_next <= HANDLE_NEW; + cnt_next <= 4; + elsif (DURABILITY_QOS /= VOLATILE_DURABILITY_QOS and historical_push = '1') then + stage_next <= HANDLE_HISTORICAL; + cnt_next <= 0; + else + assert FALSE severity FAILURE; + end if; + end if; + -- Key Hash PID + when 6 => + -- Synthesis Guard + if (WITH_KEY) then + data_out_rtps <= PID_KEY_HASH & std_logic_vector(to_unsigned(16, SUBMESSAGE_LENGTH_WIDTH)); + wr_rtps <= '1'; + cnt_next <= cnt + 1; + end if; + -- Key Hash 1/4 + when 7 => + -- Synthesis Guard + if (WITH_KEY) then + data_out_rtps <= std_logic_vector(cc_instance_handle(0)); + wr_rtps <= '1'; + cnt_next <= cnt + 1; + end if; + -- Key Hash 2/4 + when 8 => + -- Synthesis Guard + if (WITH_KEY) then + data_out_rtps <= std_logic_vector(cc_instance_handle(1)); + wr_rtps <= '1'; + cnt_next <= cnt + 1; + end if; + -- Key Hash 3/4 + when 9 => + -- Synthesis Guard + if (WITH_KEY) then + data_out_rtps <= std_logic_vector(cc_instance_handle(2)); + wr_rtps <= '1'; + cnt_next <= cnt + 1; + end if; + -- Key Hash 4/4 + when 10 => + -- Synthesis Guard + if (WITH_KEY) then + data_out_rtps <= std_logic_vector(cc_instance_handle(3)); + wr_rtps <= '1'; + + -- Need to send Status Info + if (cc_kind /= ALIVE) then + cnt_next <= cnt + 1; + -- Reader expects in-line QoS + elsif (mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') then + stage_next <= SEND_INLINE_QOS; + cnt3_next <= 0; + else + cnt_next <= cnt + 3; + end if; + end if; + -- Status Info PID + when 11 => + data_out_rtps <= PID_STATUS_INFO & std_logic_vector(to_unsigned(4, SUBMESSAGE_LENGTH_WIDTH)); + wr_rtps <= '1'; + cnt_next <= cnt + 1; + -- Status Info + when 12 => + data_out_rtps <= (others => '0'); + wr_rtps <= '1'; + case (cc_kind) is + when ALIVE_FILTERED => + data_out_rtps(STATUS_INFO_FILTERED_FLAG) <= '1'; + when NOT_ALIVE_DISPOSED => + data_out_rtps(STATUS_INFO_DISPOSED_FLAG) <= '1'; + when NOT_ALIVE_UNREGISTERED => + data_out_rtps(STATUS_INFO_UNREGISTERED_FLAG) <= '1'; + when others => + null; + end case; + -- Reader expects in-line QoS - elsif (mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') then + if (mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') then stage_next <= SEND_INLINE_QOS; cnt3_next <= 0; else - cnt_next <= cnt + 3; + cnt_next <= cnt + 1; end if; - end if; - -- Status Info PID - when 11 => - data_out_rtps <= PID_STATUS_INFO & std_logic_vector(to_unsigned(4, SUBMESSAGE_LENGTH_WIDTH)); - wr_rtps <= '1'; - cnt_next <= cnt + 1; - -- Status Info - when 12 => - data_out_rtps <= (others => '0'); - wr_rtps <= '1'; - case (cc_kind) is - when ALIVE_FILTERED => - data_out_rtps(STATUS_INFO_FILTERED_FLAG) <= '1'; - when NOT_ALIVE_DISPOSED => - data_out_rtps(STATUS_INFO_DISPOSED_FLAG) <= '1'; - when NOT_ALIVE_UNREGISTERED => - data_out_rtps(STATUS_INFO_UNREGISTERED_FLAG) <= '1'; - when others => - null; - end case; - - -- Reader expects in-line QoS - if (mem_endpoint_data.flags(READER_EXPECTS_INLINE_QOS_FLAG) = '1') then - stage_next <= SEND_INLINE_QOS; - cnt3_next <= 0; - else - cnt_next <= cnt + 1; - end if; - -- Sentinel - when 13 => - data_out_rtps <= PID_SENTINEL & std_logic_vector(to_unsigned(0, PARAMETER_LENGTH_WIDTH)); - wr_rtps <= '1'; - - -- Payload Available (DATA or Serialized Key) - if (cc_kind = ALIVE or (WITH_KEY and cc_kind /= ALIVE)) then - stage_next <= SEND_DATA_B; - else - last_word_out_rtps <= '1'; - -- Continue - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then - stage_next <= HANDLE_REQUESTS; - cnt_next <= 0; - elsif (PUSH_MODE and new_push = '1') then - stage_next <= HANDLE_NEW; - cnt_next <= 4; - elsif (DURABILITY_QOS /= VOLATILE_DURABILITY_QOS and historical_push = '1') then - stage_next <= HANDLE_HISTORICAL; - cnt_next <= 0; + -- Sentinel + when 13 => + data_out_rtps <= PID_SENTINEL & std_logic_vector(to_unsigned(0, PARAMETER_LENGTH_WIDTH)); + wr_rtps <= '1'; + + -- Payload Available (DATA or Serialized Key) + if (cc_kind = ALIVE or (WITH_KEY and cc_kind /= ALIVE)) then + stage_next <= SEND_DATA_B; else - assert FALSE severity FAILURE; + last_word_out_rtps <= '1'; + -- Continue + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then + stage_next <= HANDLE_REQUESTS; + cnt_next <= 0; + elsif (PUSH_MODE and new_push = '1') then + stage_next <= HANDLE_NEW; + cnt_next <= 4; + elsif (DURABILITY_QOS /= VOLATILE_DURABILITY_QOS and historical_push = '1') then + stage_next <= HANDLE_HISTORICAL; + cnt_next <= 0; + else + assert FALSE severity FAILURE; + end if; end if; - end if; - when others => - null; - end case; + when others => + null; + end case; + end if; end if; when SEND_INLINE_QOS => -- Output FIFO Guard if (full_rtps = '0') then data_out_rtps <= INLINE_QOS.data(cnt3); - wr_rtps <= '1'; - cnt3_next <= cnt3 + 1; + wr_rtps <= '1'; -- Exit Condition if (cnt3 = INLINE_QOS.length-1) then @@ -1844,7 +1898,7 @@ begin else last_word_out_rtps <= '1'; -- Continue - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then stage_next <= HANDLE_REQUESTS; cnt_next <= 0; elsif (PUSH_MODE and new_push = '1') then @@ -1857,6 +1911,8 @@ begin assert FALSE severity FAILURE; end if; end if; + else + cnt3_next <= cnt3 + 1; end if; end if; when SEND_DATA_B => @@ -1872,7 +1928,7 @@ begin last_word_out_rtps <= '1'; -- Continue - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then stage_next <= HANDLE_REQUESTS; cnt_next <= 0; elsif (PUSH_MODE and new_push = '1') then @@ -1891,28 +1947,31 @@ begin -- Output FIFO Guard if (full_rtps = '0') then wr_rtps <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- DATA RTPS SUBMESSAGE (Participant Message) -- RTPS Submessage Header when 0 => - data_out_rtps <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16)); + data_out_rtps <= SID_GAP & "00000000" & std_logic_vector(to_unsigned(28, 16)); + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => - data_out_rtps <= ENTITYID_UNKNOWN; + data_out_rtps <= ENTITYID_UNKNOWN; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out_rtps <= ENTITYID; + data_out_rtps <= ENTITYID; + cnt_next <= cnt + 1; -- GAP Start Sequence Number 1/2 when 3 => - data_out_rtps <= std_logic_vector(next_seq_nr(0)); + data_out_rtps <= std_logic_vector(next_seq_nr(0)); + cnt_next <= cnt + 1; -- GAP Start Sequence Number 2/2 when 4 => - data_out_rtps <= std_logic_vector(next_seq_nr(1)); + data_out_rtps <= std_logic_vector(next_seq_nr(1)); -- Continue - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and stale_check = '1') then stage_next <= HANDLE_REQUESTS; cnt_next <= 0; elsif (DURABILITY_QOS /= VOLATILE_DURABILITY_QOS and historical_push = '1') then @@ -1927,18 +1986,19 @@ begin -- Output FIFO Guard if (full_rtps = '0') then wr_rtps <= '1'; - cnt_next <= cnt + 1; case (cnt) is -- GAP List Sequence Number Set (Bitmap Base 1/2) when 0 => - data_out_rtps <= std_logic_vector(next_seq_nr(0)); + data_out_rtps <= std_logic_vector(next_seq_nr(0)); + cnt_next <= cnt + 1; -- GAP List Sequence Number Set (Bitmap Base 2/2) when 1 => - data_out_rtps <= std_logic_vector(next_seq_nr(1)); + data_out_rtps <= std_logic_vector(next_seq_nr(1)); + cnt_next <= cnt + 1; -- GAP List Sequence Number Set (NumBits) when 2 => - data_out_rtps <= (others => '0'); + data_out_rtps <= (others => '0'); if (gap_is_last = '1') then last_word_out_rtps <= '1'; @@ -1955,11 +2015,10 @@ begin end if; when SEND_HEARTBEAT => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS or LIVELINESS_QOS = MANUAL_BY_TOPIC_LIVELINESS_QOS) then -- Output FIFO Guard if (full_rtps = '0') then - wr_rtps <= '1'; - cnt_next <= cnt + 1; + wr_rtps <= '1'; case (cnt) is -- HEARTBEAT RTPS SUBMESSAGE @@ -1970,24 +2029,31 @@ begin else data_out_rtps <= SID_HEARTBEAT & "00000000" & std_logic_vector(to_unsigned(28, 16)); end if; + cnt_next <= cnt + 1; -- Reader Entity ID when 1 => - data_out_rtps <= ENTITYID_UNKNOWN; + data_out_rtps <= ENTITYID_UNKNOWN; + cnt_next <= cnt + 1; -- Writer Entity ID when 2 => - data_out_rtps <= ENTITYID; + data_out_rtps <= ENTITYID; + cnt_next <= cnt + 1; -- First Sequence Number 1/2 when 3 => - data_out_rtps <= std_logic_vector(min_sn(0)); + data_out_rtps <= std_logic_vector(min_sn(0)); + cnt_next <= cnt + 1; -- First Sequence Number 2/2 when 4 => - data_out_rtps <= std_logic_vector(min_sn(1)); + data_out_rtps <= std_logic_vector(min_sn(1)); + cnt_next <= cnt + 1; -- Last Sequence Number 1/2 when 5 => - data_out_rtps <= std_logic_vector(last_seq_nr(0)); + data_out_rtps <= std_logic_vector(last_seq_nr(0)); + cnt_next <= cnt + 1; -- Last Sequence Number 2/2 when 6 => - data_out_rtps <= std_logic_vector(last_seq_nr(1)); + data_out_rtps <= std_logic_vector(last_seq_nr(1)); + cnt_next <= cnt + 1; -- Count when 7 => data_out_rtps <= std_logic_vector(count); @@ -2052,6 +2118,7 @@ begin max_endpoint_addr_next <= max_endpoint_addr; mem_endpoint_latch_data_next <= mem_endpoint_latch_data; mem_pos_next <= mem_pos; + current_emf_next <= current_emf; -- DEFAULT Unregistered mem_addr <= (others => '0'); mem_write_data <= (others => '0'); @@ -2083,15 +2150,15 @@ begin case(mem_opcode) is when SEARCH_ENDPOINT => + current_emf_next <= mem_field_flags; + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; mem_pos_next <= 0; mem_stage_next <= SEARCH_ENDPOINT; mem_cnt_next <= 0; when INSERT_ENDPOINT => - mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; - mem_pos_next <= 0; - mem_stage_next <= FIND_EMPTY_SLOT; - mem_cnt_next <= 0; + current_emf_next <= (others => '1'); -- Set Endpoint Data mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; mem_endpoint_data_next.guid <= guid_next; @@ -2103,49 +2170,70 @@ begin mem_endpoint_data_next.ack_seq_nr_base <= seq_nr; mem_endpoint_data_next.req_seq_nr_base <= SEQUENCENUMBER_UNKNOWN; mem_endpoint_data_next.req_seq_nr_bitmap <= (others => '0'); + + mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; + mem_pos_next <= 0; + mem_stage_next <= FIND_EMPTY_SLOT; + mem_cnt_next <= 0; when UPDATE_ENDPOINT => - mem_stage_next <= UPDATE_ENDPOINT; + current_emf_next <= current_emf or mem_field_flags; + mem_stage_next <= UPDATE_ENDPOINT; + if check_mask(mem_field_flags,EMF_IPV4_ADDR_FLAG) then mem_cnt_next <= 0; elsif check_mask(mem_field_flags,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 1; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 2; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE mem_stage_next <= IDLE; end if; when REMOVE_ENDPOINT => + current_emf_next <= (others => '0'); + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + mem_stage_next <= REMOVE_ENDPOINT; mem_cnt_next <= 0; when GET_FIRST_ENDPOINT => + current_emf_next <= mem_field_flags; + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + mem_addr_base_next <= FIRST_ENDPOINT_ADDRESS; mem_pos_next <= 0; mem_stage_next <= GET_NEXT_ENDPOINT; mem_cnt_next <= 0; when GET_NEXT_ENDPOINT => + current_emf_next <= mem_field_flags; + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + -- Memory Bound Guard if (mem_addr_base >= max_endpoint_addr) then mem_addr_base_next <= ENDPOINT_MEMORY_MAX_ADDRESS; else - -- Reached End of Memory, No match mem_addr_base_next <= mem_addr_base + ENDPOINT_FRAME_SIZE; mem_pos_next <= mem_pos + 1; mem_stage_next <= GET_NEXT_ENDPOINT; mem_cnt_next <= 0; end if; when GET_ENDPOINT => + if (mem_addr_base /= mem_addr_update) then + mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; + current_emf_next <= mem_field_flags; + else + current_emf_next <= current_emf or mem_field_flags; + end if; + -- Fetch Endpoint Data mem_stage_next <= GET_ENDPOINT_DATA; - mem_endpoint_data_next <= ZERO_ENDPOINT_DATA; if check_mask(mem_field_flags,EMF_ENTITYID_FLAG) then mem_cnt_next <= 0; elsif check_mask(mem_field_flags,EMF_GUIDPREFIX_FLAG) then @@ -2154,15 +2242,15 @@ begin mem_cnt_next <= 4; elsif check_mask(mem_field_flags,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 5; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_field_flags,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else -- DONE @@ -2313,15 +2401,15 @@ begin mem_cnt_next <= 4; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 5; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else -- DONE @@ -2348,15 +2436,15 @@ begin mem_cnt_next <= 4; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 5; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else mem_cnt_next <= 15; @@ -2391,15 +2479,15 @@ begin mem_cnt_next <= 4; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 5; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2418,15 +2506,15 @@ begin if (mem_ready_in = '1') then if check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 5; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2445,15 +2533,15 @@ begin mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2470,7 +2558,7 @@ begin -- GET Lease Deadline 1/2 when 6 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET; mem_read <= '1'; @@ -2482,19 +2570,19 @@ begin -- GET Lease Deadline 2/2 when 7 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET + 1; mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2514,7 +2602,7 @@ begin -- GET Response Time 1/2 when 8 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET; mem_read <= '1'; @@ -2526,17 +2614,17 @@ begin -- GET Response Time 2/2 when 9 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET + 1; mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2547,7 +2635,7 @@ begin mem_cnt_next <= 19; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; else mem_cnt_next <= 23; @@ -2558,7 +2646,7 @@ begin -- GET ACK Sequence Number 1/2 when 10 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_ACK_SEQ_NR_BASE_OFFSET; mem_read <= '1'; @@ -2570,15 +2658,15 @@ begin -- GET ACK Sequence Number 2/2 when 11 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_ACK_SEQ_NR_BASE_OFFSET + 1; mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2589,9 +2677,9 @@ begin mem_cnt_next <= 19; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; else mem_cnt_next <= 25; @@ -2602,7 +2690,7 @@ begin -- GET Request Sequence Number Base 1/2 when 12 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BASE_OFFSET; mem_read <= '1'; @@ -2614,13 +2702,13 @@ begin -- GET Request Sequence Number Base 2/2 when 13 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BASE_OFFSET + 1; mem_read <= '1'; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else if check_mask(mem_endpoint_latch_data.field_flag,EMF_ENTITYID_FLAG) then @@ -2631,11 +2719,11 @@ begin mem_cnt_next <= 19; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; else mem_cnt_next <= 27; @@ -2646,7 +2734,7 @@ begin -- GET Request Bitmap when 14 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BITMAP_OFFSET; mem_read <= '1'; @@ -2660,13 +2748,13 @@ begin mem_cnt_next <= 19; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; else mem_cnt_next <= 29; @@ -2686,15 +2774,15 @@ begin mem_cnt_next <= 19; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2730,15 +2818,15 @@ begin mem_cnt_next <= 19; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2754,15 +2842,15 @@ begin if check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 20; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2777,15 +2865,15 @@ begin mem_endpoint_data_next.portn <= mem_read_data(WORD_WIDTH-1 downto WORD_WIDTH-UDP_PORT_WIDTH); mem_endpoint_data_next.flags <= mem_read_data(CDR_SHORT_WIDTH-1 downto 0); - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 21; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2795,7 +2883,7 @@ begin -- READ Lease Deadline 1/2 when 21 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2807,19 +2895,19 @@ begin -- READ Lease Deadline 2/2 when 22 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then mem_endpoint_data_next.lease_deadline(1) <= unsigned(mem_read_data); - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 23; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2830,7 +2918,7 @@ begin -- READ Response Time 1/2 when 23 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2842,17 +2930,17 @@ begin -- READ Response Time 2/2 when 24 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then mem_endpoint_data_next.res_time(1) <= unsigned(mem_read_data); - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 25; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2863,7 +2951,7 @@ begin -- READ ACK Sequence Number 1/2 when 25 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2875,15 +2963,15 @@ begin -- READ ACK Sequence Number 2/2 when 26 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then mem_endpoint_data_next.ack_seq_nr_base(1) <= unsigned(mem_read_data); - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 27; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2894,7 +2982,7 @@ begin -- READ Request Sequence Number Base 1/2 when 27 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2906,13 +2994,13 @@ begin -- READ Request Sequence Number Base 2/2 when 28 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then mem_endpoint_data_next.req_seq_nr_base(1) <= unsigned(mem_read_data); - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 29; else -- DONE @@ -2923,7 +3011,7 @@ begin -- READ Request Bitmap when 29 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_ready_out <= '1'; -- Memory Flow Control Guard if (mem_valid_out = '1') then @@ -2984,7 +3072,7 @@ begin mem_addr <= mem_addr_base + EMF_UDP_PORT_OFFSET; mem_write_data <= mem_endpoint_latch_data.portn & mem_endpoint_latch_data.flags; if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_cnt_next <= mem_cnt + 1; else -- DONE @@ -2994,7 +3082,7 @@ begin -- Lease Deadline 1/2 when 6 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.lease_deadline(0)); @@ -3005,7 +3093,7 @@ begin -- Lease Deadline 2/2 when 7 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.lease_deadline(1)); @@ -3016,7 +3104,7 @@ begin -- Response Time 1/2 when 8 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET; mem_write_data <= std_logic_vector(TIME_INVALID(0)); @@ -3026,7 +3114,7 @@ begin end if; -- Response Time 2/2 when 9 => - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET + 1; mem_write_data <= std_logic_vector(TIME_INVALID(1)); @@ -3037,7 +3125,7 @@ begin -- ACK Sequence Number 1/2 when 10 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_ACK_SEQ_NR_BASE_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.ack_seq_nr_base(0)); @@ -3048,7 +3136,7 @@ begin -- ACK Sequence Number 2/2 when 11 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_ACK_SEQ_NR_BASE_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.ack_seq_nr_base(1)); @@ -3059,7 +3147,7 @@ begin -- Request Sequence Number Base 1/2 when 12 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BASE_OFFSET; mem_write_data <= std_logic_vector(SEQUENCENUMBER_UNKNOWN(0)); @@ -3070,7 +3158,7 @@ begin -- Request Sequence Number Base 2/2 when 13 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_write_data <= (others => '0'); mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BASE_OFFSET + 1; @@ -3082,7 +3170,7 @@ begin -- Request Bitmap when 14 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BITMAP_OFFSET; mem_write_data <= (others => '0'); @@ -3106,15 +3194,15 @@ begin if (mem_ready_in = '1') then if check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 1; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 2; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -3130,15 +3218,15 @@ begin mem_endpoint_data_next.flags <= mem_endpoint_latch_data.flags; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 2; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -3148,7 +3236,7 @@ begin -- Lease Deadline 1/2 when 2 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.lease_deadline(0)); @@ -3160,20 +3248,20 @@ begin -- Lease Deadline 2/2 when 3 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_LEASE_DEADLINE_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.lease_deadline(1)); mem_endpoint_data_next.lease_deadline <= mem_endpoint_latch_data.lease_deadline; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 4; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -3184,7 +3272,7 @@ begin -- Response Time 1/2 when 4 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.res_time(0)); @@ -3196,18 +3284,18 @@ begin -- Response Time 2/2 when 5 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_RES_TIME_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.res_time(1)); mem_endpoint_data_next.res_time <= mem_endpoint_latch_data.res_time; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -3218,7 +3306,7 @@ begin -- ACK Sequence Number 1/2 when 6 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_ACK_SEQ_NR_BASE_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.ack_seq_nr_base(0)); @@ -3230,16 +3318,16 @@ begin -- ACK Sequence Number 2/2 when 7 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_ACK_SEQ_NR_BASE_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.ack_seq_nr_base(1)); mem_endpoint_data_next.ack_seq_nr_base <= mem_endpoint_latch_data.ack_seq_nr_base; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -3250,7 +3338,7 @@ begin -- Request Sequence Number Base 1/2 when 8 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BASE_OFFSET; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.req_seq_nr_base(0)); @@ -3262,14 +3350,14 @@ begin -- Request Sequence Number Base 2/2 when 9 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BASE_OFFSET + 1; mem_write_data <= std_logic_vector(mem_endpoint_latch_data.req_seq_nr_base(1)); mem_endpoint_data_next.req_seq_nr_base <= mem_endpoint_latch_data.req_seq_nr_base; -- Memory Flow Control Guard if (mem_ready_in = '1') then - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 10; else -- DONE @@ -3280,7 +3368,7 @@ begin -- Request Bitmap when 10 => -- Synthesis Guard - if (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS) then + if (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS) then mem_valid_in <= '1'; mem_addr <= mem_addr_base + EMF_REQ_SEQ_NR_BITMAP_OFFSET; mem_write_data <= mem_endpoint_latch_data.req_seq_nr_bitmap; @@ -3449,15 +3537,15 @@ begin mem_cnt_next <= 4; elsif check_mask(mem_endpoint_latch_data.field_flag,EMF_UDP_PORT_FLAG) then mem_cnt_next <= 5; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_LEASE_DEADLINE_FLAG)) then mem_cnt_next <= 6; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_RES_TIME_FLAG)) then mem_cnt_next <= 8; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_ACK_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 10; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BASE_FLAG)) then mem_cnt_next <= 12; - elsif (RELIABILTY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then + elsif (RELIABILITY_QOS = RELIABLE_RELIABILITY_QOS and check_mask(mem_endpoint_latch_data.field_flag,EMF_REQ_SEQ_NR_BITMAP_FLAG)) then mem_cnt_next <= 14; else -- DONE @@ -3557,6 +3645,7 @@ begin last_addr <= (others => '0'); mem_addr_latch <= (others => '0'); max_endpoint_addr <= (others => '0'); + current_emf <= (others => '0'); global_ack_seq_nr_base <= (others => (others => '0')); last_seq_nr <= (others => (others => '0')); bitmap_latch <= (others => (others => '0')); @@ -3602,6 +3691,7 @@ begin last_addr <= last_addr_next; mem_addr_latch <= mem_addr_latch_next; max_endpoint_addr <= max_endpoint_addr_next; + current_emf <= current_emf_next; global_ack_seq_nr_base <= global_ack_seq_nr_base_next; last_seq_nr <= last_seq_nr_next; bitmap_latch <= bitmap_latch_next; diff --git a/src/user_config.vhd b/src/user_config.vhd index 547021c..f71d94d 100644 --- a/src/user_config.vhd +++ b/src/user_config.vhd @@ -94,7 +94,7 @@ package user_config is constant ENDPOINT_TIME_BASED_FILTER_QOS : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_TIME_BASED_FILTER_QOS); -- XXX: PARTITION QoS Ignored -- Array mapping RELIABILITY QoS to Endpoints - constant ENDPOINT_RELIABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_RELIABILTY_QOS); + constant ENDPOINT_RELIABILITY_QOS : USER_ENUMERATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_RELIABILITY_QOS); -- (Only relevant to Writers) constant ENDPOINT_MAX_BLOCKING_TIME : USER_DURATION_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => DEFAULT_MAX_BLOCKING_TIME); -- Array mapping TRANSPORT_PRIORITY QoS to Endpoints (Only relevant to Writers) @@ -120,4 +120,7 @@ package user_config is -- NOTE: The buffer will not only store participants, but also endpoint data -- Used to determine the size of the builtin endpoint buffer constant MAX_REMOTE_PARTICIPANTS : natural := 50; + + -- Set to TRUE for Simulation Testing (Extra Code generated) + constant SIMULATION_FLAG : boolean := FALSE; end package; \ No newline at end of file