123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360 |
- -- -----------------------------------------------------------------
- --
- -- Copyright 2019 IEEE P1076 WG Authors
- --
- -- See the LICENSE file distributed with this work for copyright and
- -- licensing information and the AUTHORS file.
- --
- -- This file to you under the Apache License, Version 2.0 (the "License").
- -- You may obtain a copy of the License at
- --
- -- http://www.apache.org/licenses/LICENSE-2.0
- --
- -- Unless required by applicable law or agreed to in writing, software
- -- distributed under the License is distributed on an "AS IS" BASIS,
- -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- -- implied. See the License for the specific language governing
- -- permissions and limitations under the License.
- --
- -- Title : Fixed-point package (Generic package body)
- -- :
- -- Library : This package shall be compiled into a library
- -- : symbolically named IEEE.
- -- :
- -- Developers: Accellera VHDL-TC and IEEE P1076 Working Group
- -- :
- -- Purpose : This packages defines basic binary fixed point arithmetic
- -- : arithmetic functions
- -- :
- -- Note : This package may be modified to include additional data
- -- : required by tools, but it must in no way change the
- -- : external interfaces or simulation behavior of the
- -- : description. It is permissible to add comments and/or
- -- : attributes to the package declarations, but not to change
- -- : or delete any original lines of the package declaration.
- -- : The package body may be changed only in accordance with
- -- : the terms of Clause 16 of this standard.
- -- :
- -- --------------------------------------------------------------------
- -- $Revision: 1220 $
- -- $Date: 2008-04-10 17:16:09 +0930 (Thu, 10 Apr 2008) $
- -- --------------------------------------------------------------------
-
- library IEEE;
- use IEEE.MATH_REAL.all;
-
- package body fixed_generic_pkg is
- -- Author David Bishop (dbishop@vhdl.org)
- -- Other contributers: Jim Lewis, Yannick Grugni, Ryan W. Hilton
- -- null array constants
- constant NAUF : UNRESOLVED_ufixed (0 downto 1) := (others => '0');
- constant NASF : UNRESOLVED_sfixed (0 downto 1) := (others => '0');
- constant NSLV : STD_ULOGIC_VECTOR (0 downto 1) := (others => '0');
-
- -- This differed constant will tell you if the package body is synthesizable
- -- or implemented as real numbers, set to "true" if synthesizable.
- constant fixedsynth_or_real : BOOLEAN := true;
-
- -- Special version of "minimum" to do some boundary checking without errors
- function mins (l, r : INTEGER)
- return INTEGER is
- begin -- function mins
- if (l = INTEGER'low or r = INTEGER'low) then
- return 0; -- error condition, silent
- end if;
- return minimum (l, r);
- end function mins;
-
- -- Special version of "minimum" to do some boundary checking with errors
- function mine (l, r : INTEGER)
- return INTEGER is
- begin -- function mine
- if (l = INTEGER'low or r = INTEGER'low) then
- report fixed_generic_pkg'instance_name
- & " Unbounded number passed, was a literal used?"
- severity error;
- return 0;
- end if;
- return minimum (l, r);
- end function mine;
-
- -- The following functions are used only internally. Every function
- -- calls "cleanvec" either directly or indirectly.
- -- purpose: Fixes "downto" problem and resolves meta states
- function cleanvec (
- arg : UNRESOLVED_sfixed) -- input
- return UNRESOLVED_sfixed
- is
- begin -- function cleanvec
- assert not (arg'ascending and (arg'low /= INTEGER'low))
- report fixed_generic_pkg'instance_name
- & " Vector passed using a ""to"" range, expected is ""downto"""
- severity error;
- return arg;
- end function cleanvec;
-
- -- purpose: Fixes "downto" problem and resolves meta states
- function cleanvec (
- arg : UNRESOLVED_ufixed) -- input
- return UNRESOLVED_ufixed
- is
- begin -- function cleanvec
- assert not (arg'ascending and (arg'low /= INTEGER'low))
- report fixed_generic_pkg'instance_name
- & " Vector passed using a ""to"" range, expected is ""downto"""
- severity error;
- return arg;
- end function cleanvec;
-
- -- Type convert a "unsigned" into a "ufixed", used internally
- function to_fixed (
- arg : UNRESOLVED_UNSIGNED; -- shifted vector
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- begin -- function to_fixed
- result := UNRESOLVED_ufixed(arg);
- return result;
- end function to_fixed;
-
- -- Type convert a "signed" into an "sfixed", used internally
- function to_fixed (
- arg : UNRESOLVED_SIGNED; -- shifted vector
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- begin -- function to_fixed
- result := UNRESOLVED_sfixed(arg);
- return result;
- end function to_fixed;
-
- -- Type convert a "ufixed" into an "unsigned", used internally
- function to_uns (
- arg : UNRESOLVED_ufixed) -- fp vector
- return UNRESOLVED_UNSIGNED
- is
- subtype t is UNRESOLVED_UNSIGNED(arg'high - arg'low downto 0);
- variable slv : t;
- begin -- function to_uns
- slv := t(arg);
- return slv;
- end function to_uns;
-
- -- Type convert an "sfixed" into a "signed", used internally
- function to_s (
- arg : UNRESOLVED_sfixed) -- fp vector
- return UNRESOLVED_SIGNED
- is
- subtype t is UNRESOLVED_SIGNED(arg'high - arg'low downto 0);
- variable slv : t;
- begin -- function to_s
- slv := t(arg);
- return slv;
- end function to_s;
-
- -- adds 1 to the LSB of the number
- procedure round_up (arg : in UNRESOLVED_ufixed;
- result : out UNRESOLVED_ufixed;
- overflowx : out BOOLEAN) is
- variable arguns, resuns : UNRESOLVED_UNSIGNED (arg'high-arg'low+1 downto 0)
- := (others => '0');
- begin -- round_up
- arguns (arguns'high-1 downto 0) := to_uns (arg);
- resuns := arguns + 1;
- result := to_fixed(resuns(arg'high-arg'low
- downto 0), arg'high, arg'low);
- overflowx := (resuns(resuns'high) = '1');
- end procedure round_up;
-
- -- adds 1 to the LSB of the number
- procedure round_up (arg : in UNRESOLVED_sfixed;
- result : out UNRESOLVED_sfixed;
- overflowx : out BOOLEAN) is
- variable args, ress : UNRESOLVED_SIGNED (arg'high-arg'low+1 downto 0);
- begin -- round_up
- args (args'high-1 downto 0) := to_s (arg);
- args(args'high) := arg(arg'high); -- sign extend
- ress := args + 1;
- result := to_fixed(ress (ress'high-1
- downto 0), arg'high, arg'low);
- overflowx := ((arg(arg'high) /= ress(ress'high-1))
- and (or (STD_ULOGIC_VECTOR(ress)) /= '0'));
- end procedure round_up;
-
- -- Rounding - Performs a "round_nearest" (IEEE 754) which rounds up
- -- when the remainder is > 0.5. If the remainder IS 0.5 then if the
- -- bottom bit is a "1" it is rounded, otherwise it remains the same.
- function round_fixed (arg : UNRESOLVED_ufixed;
- remainder : UNRESOLVED_ufixed;
- overflow_style : fixed_overflow_style_type := fixed_overflow_style)
- return UNRESOLVED_ufixed
- is
- variable rounds : BOOLEAN;
- variable round_overflow : BOOLEAN;
- variable result : UNRESOLVED_ufixed (arg'range);
- begin
- rounds := false;
- if (remainder'length > 1) then
- if (remainder (remainder'high) = '1') then
- rounds := (arg(arg'low) = '1')
- or (or (to_sulv(remainder(remainder'high-1 downto
- remainder'low))) = '1');
- end if;
- else
- rounds := (arg(arg'low) = '1') and (remainder (remainder'high) = '1');
- end if;
- if rounds then
- round_up(arg => arg,
- result => result,
- overflowx => round_overflow);
- else
- result := arg;
- end if;
- if (overflow_style = fixed_saturate) and round_overflow then
- result := saturate (result'high, result'low);
- end if;
- return result;
- end function round_fixed;
-
- -- Rounding case statement
- function round_fixed (arg : UNRESOLVED_sfixed;
- remainder : UNRESOLVED_sfixed;
- overflow_style : fixed_overflow_style_type := fixed_overflow_style)
- return UNRESOLVED_sfixed
- is
- variable rounds : BOOLEAN;
- variable round_overflow : BOOLEAN;
- variable result : UNRESOLVED_sfixed (arg'range);
- begin
- rounds := false;
- if (remainder'length > 1) then
- if (remainder (remainder'high) = '1') then
- rounds := (arg(arg'low) = '1')
- or (or (to_sulv(remainder(remainder'high-1 downto
- remainder'low))) = '1');
- end if;
- else
- rounds := (arg(arg'low) = '1') and (remainder (remainder'high) = '1');
- end if;
- if rounds then
- round_up(arg => arg,
- result => result,
- overflowx => round_overflow);
- else
- result := arg;
- end if;
- if round_overflow then
- if (overflow_style = fixed_saturate) then
- if arg(arg'high) = '0' then
- result := saturate (result'high, result'low);
- else
- result := not saturate (result'high, result'low);
- end if;
- -- Sign bit not fixed when wrapping
- end if;
- end if;
- return result;
- end function round_fixed;
-
- -- converts an sfixed into a ufixed. The output is the same length as the
- -- input, because abs("1000") = "1000" = 8.
- function to_ufixed (
- arg : UNRESOLVED_sfixed)
- return UNRESOLVED_ufixed
- is
- constant left_index : INTEGER := arg'high;
- constant right_index : INTEGER := mine(arg'low, arg'low);
- variable xarg : UNRESOLVED_sfixed(left_index+1 downto right_index);
- variable result : UNRESOLVED_ufixed(left_index downto right_index);
- begin
- if arg'length < 1 then
- return NAUF;
- end if;
- xarg := abs(arg);
- result := UNRESOLVED_ufixed (xarg (left_index downto right_index));
- return result;
- end function to_ufixed;
-
- -----------------------------------------------------------------------------
- -- Visible functions
- -----------------------------------------------------------------------------
- -- Conversion functions. These are needed for synthesis where typically
- -- the only input and output type is a std_logic_vector.
- function to_sulv (
- arg : UNRESOLVED_ufixed) -- fixed point vector
- return STD_ULOGIC_VECTOR
- is
- variable intermediate_result : UNRESOLVED_ufixed(arg'length-1 downto 0);
- begin
- if arg'length < 1 then
- return NSLV;
- end if;
- intermediate_result := arg;
- return STD_ULOGIC_VECTOR (intermediate_result);
- end function to_sulv;
-
- function to_sulv (
- arg : UNRESOLVED_sfixed) -- fixed point vector
- return STD_ULOGIC_VECTOR
- is
- variable intermediate_result : UNRESOLVED_sfixed(arg'length-1 downto 0);
- begin
- if arg'length < 1 then
- return NSLV;
- end if;
- intermediate_result := arg;
- return STD_ULOGIC_VECTOR (intermediate_result);
- end function to_sulv;
-
- function to_slv (
- arg : UNRESOLVED_ufixed) -- fixed point vector
- return STD_LOGIC_VECTOR is
- begin
- return to_sulv(arg);
- end function to_slv;
-
- function to_slv (
- arg : UNRESOLVED_sfixed) -- fixed point vector
- return STD_LOGIC_VECTOR is
- begin
- return to_sulv(arg);
- end function to_slv;
-
- function to_ufixed (
- arg : STD_ULOGIC_VECTOR; -- shifted vector
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- begin
- if (arg'length < 1 or right_index > left_index) then
- return NAUF;
- end if;
- if (arg'length /= result'length) then
- report fixed_generic_pkg'instance_name & "TO_UFIXED(SLV) "
- & "Vector lengths do not match. Input length is "
- & INTEGER'image(arg'length) & " and output will be "
- & INTEGER'image(result'length) & " wide."
- severity error;
- return NAUF;
- else
- result := to_fixed (arg => UNRESOLVED_UNSIGNED(arg),
- left_index => left_index,
- right_index => right_index);
- return result;
- end if;
- end function to_ufixed;
-
- function to_sfixed (
- arg : STD_ULOGIC_VECTOR; -- shifted vector
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- begin
- if (arg'length < 1 or right_index > left_index) then
- return NASF;
- end if;
- if (arg'length /= result'length) then
- report fixed_generic_pkg'instance_name & "TO_SFIXED(SLV) "
- & "Vector lengths do not match. Input length is "
- & INTEGER'image(arg'length) & " and output will be "
- & INTEGER'image(result'length) & " wide."
- severity error;
- return NASF;
- else
- result := to_fixed (arg => UNRESOLVED_SIGNED(arg),
- left_index => left_index,
- right_index => right_index);
- return result;
- end if;
- end function to_sfixed;
-
- -- Two's complement number, Grows the vector by 1 bit.
- -- because "abs (1000.000) = 01000.000" or abs(-16) = 16.
- function "abs" (
- arg : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed
- is
- constant left_index : INTEGER := arg'high;
- constant right_index : INTEGER := mine(arg'low, arg'low);
- variable ressns : UNRESOLVED_SIGNED (arg'length downto 0);
- variable result : UNRESOLVED_sfixed (left_index+1 downto right_index);
- begin
- if (arg'length < 1 or result'length < 1) then
- return NASF;
- end if;
- ressns (arg'length-1 downto 0) := to_s (cleanvec (arg));
- ressns (arg'length) := ressns (arg'length-1); -- expand sign bit
- result := to_fixed (abs(ressns), left_index+1, right_index);
- return result;
- end function "abs";
-
- -- also grows the vector by 1 bit.
- function "-" (
- arg : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed
- is
- constant left_index : INTEGER := arg'high+1;
- constant right_index : INTEGER := mine(arg'low, arg'low);
- variable ressns : UNRESOLVED_SIGNED (arg'length downto 0);
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- begin
- if (arg'length < 1 or result'length < 1) then
- return NASF;
- end if;
- ressns (arg'length-1 downto 0) := to_s (cleanvec(arg));
- ressns (arg'length) := ressns (arg'length-1); -- expand sign bit
- result := to_fixed (-ressns, left_index, right_index);
- return result;
- end function "-";
-
- -- Addition
- function "+" (
- l, r : UNRESOLVED_ufixed) -- ufixed(a downto b) + ufixed(c downto d) =
- return UNRESOLVED_ufixed -- ufixed(max(a,c)+1 downto min(b,d))
- is
- constant left_index : INTEGER := maximum(l'high, r'high)+1;
- constant right_index : INTEGER := mine(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (left_index-right_index
- downto 0);
- variable result_slv : UNRESOLVED_UNSIGNED (left_index-right_index
- downto 0);
- begin
- if (l'length < 1 or r'length < 1 or result'length < 1) then
- return NAUF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- result_slv := lslv + rslv;
- result := to_fixed(result_slv, left_index, right_index);
- return result;
- end function "+";
-
- function "+" (
- l, r : UNRESOLVED_sfixed) -- sfixed(a downto b) + sfixed(c downto d) =
- return UNRESOLVED_sfixed -- sfixed(max(a,c)+1 downto min(b,d))
- is
- constant left_index : INTEGER := maximum(l'high, r'high)+1;
- constant right_index : INTEGER := mine(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (left_index-right_index downto 0);
- variable result_slv : UNRESOLVED_SIGNED (left_index-right_index downto 0);
- begin
- if (l'length < 1 or r'length < 1 or result'length < 1) then
- return NASF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- result_slv := lslv + rslv;
- result := to_fixed(result_slv, left_index, right_index);
- return result;
- end function "+";
-
- -- Subtraction
- function "-" (
- l, r : UNRESOLVED_ufixed) -- ufixed(a downto b) - ufixed(c downto d) =
- return UNRESOLVED_ufixed -- ufixed(max(a,c)+1 downto min(b,d))
- is
- constant left_index : INTEGER := maximum(l'high, r'high)+1;
- constant right_index : INTEGER := mine(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (left_index-right_index
- downto 0);
- variable result_slv : UNRESOLVED_UNSIGNED (left_index-right_index
- downto 0);
- begin
- if (l'length < 1 or r'length < 1 or result'length < 1) then
- return NAUF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- result_slv := lslv - rslv;
- result := to_fixed(result_slv, left_index, right_index);
- return result;
- end function "-";
-
- function "-" (
- l, r : UNRESOLVED_sfixed) -- sfixed(a downto b) - sfixed(c downto d) =
- return UNRESOLVED_sfixed -- sfixed(max(a,c)+1 downto min(b,d))
- is
- constant left_index : INTEGER := maximum(l'high, r'high)+1;
- constant right_index : INTEGER := mine(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (left_index-right_index downto 0);
- variable result_slv : UNRESOLVED_SIGNED (left_index-right_index downto 0);
- begin
- if (l'length < 1 or r'length < 1 or result'length < 1) then
- return NASF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- result_slv := lslv - rslv;
- result := to_fixed(result_slv, left_index, right_index);
- return result;
- end function "-";
-
- function "*" (
- l, r : UNRESOLVED_ufixed) -- ufixed(a downto b) * ufixed(c downto d) =
- return UNRESOLVED_ufixed -- ufixed(a+c+1 downto b+d)
- is
- variable lslv : UNRESOLVED_UNSIGNED (l'length-1 downto 0);
- variable rslv : UNRESOLVED_UNSIGNED (r'length-1 downto 0);
- variable result_slv : UNRESOLVED_UNSIGNED (r'length+l'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (l'high + r'high+1 downto
- mine(l'low, l'low) + mine(r'low, r'low));
- begin
- if (l'length < 1 or r'length < 1 or
- result'length /= result_slv'length) then
- return NAUF;
- end if;
- lslv := to_uns (cleanvec(l));
- rslv := to_uns (cleanvec(r));
- result_slv := lslv * rslv;
- result := to_fixed (result_slv, result'high, result'low);
- return result;
- end function "*";
-
- function "*" (
- l, r : UNRESOLVED_sfixed) -- sfixed(a downto b) * sfixed(c downto d) =
- return UNRESOLVED_sfixed -- sfixed(a+c+1 downto b+d)
- is
- variable lslv : UNRESOLVED_SIGNED (l'length-1 downto 0);
- variable rslv : UNRESOLVED_SIGNED (r'length-1 downto 0);
- variable result_slv : UNRESOLVED_SIGNED (r'length+l'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (l'high + r'high+1 downto
- mine(l'low, l'low) + mine(r'low, r'low));
- begin
- if (l'length < 1 or r'length < 1 or
- result'length /= result_slv'length) then
- return NASF;
- end if;
- lslv := to_s (cleanvec(l));
- rslv := to_s (cleanvec(r));
- result_slv := lslv * rslv;
- result := to_fixed (result_slv, result'high, result'low);
- return result;
- end function "*";
-
- function "/" (
- l, r : UNRESOLVED_ufixed) -- ufixed(a downto b) / ufixed(c downto d) =
- return UNRESOLVED_ufixed is -- ufixed(a-d downto b-c-1)
- begin
- return divide (l, r);
- end function "/";
-
- function "/" (
- l, r : UNRESOLVED_sfixed) -- sfixed(a downto b) / sfixed(c downto d) =
- return UNRESOLVED_sfixed is -- sfixed(a-d+1 downto b-c)
- begin
- return divide (l, r);
- end function "/";
-
- -- This version of divide gives the user more control
- -- ufixed(a downto b) / ufixed(c downto d) = ufixed(a-d downto b-c-1)
- function divide (
- l, r : UNRESOLVED_ufixed;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (l'high - mine(r'low, r'low) downto
- mine (l'low, l'low) - r'high -1);
- variable dresult : UNRESOLVED_ufixed (result'high downto result'low -guard_bits);
- variable lresize : UNRESOLVED_ufixed (l'high downto l'high - dresult'length+1);
- variable lslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- variable rslv : UNRESOLVED_UNSIGNED (r'length-1 downto 0);
- variable result_slv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1 or
- mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
- return NAUF;
- end if;
- lresize := resize (arg => l,
- left_index => lresize'high,
- right_index => lresize'low,
- overflow_style => fixed_wrap, -- vector only grows
- round_style => fixed_truncate);
- lslv := to_uns (cleanvec (lresize));
- rslv := to_uns (cleanvec (r));
- if (rslv = 0) then
- report fixed_generic_pkg'instance_name
- & "DIVIDE(ufixed) Division by zero" severity error;
- result := saturate (result'high, result'low); -- saturate
- else
- result_slv := lslv / rslv;
- dresult := to_fixed (result_slv, dresult'high, dresult'low);
- result := resize (arg => dresult,
- left_index => result'high,
- right_index => result'low,
- overflow_style => fixed_wrap, -- overflow impossible
- round_style => round_style);
- end if;
- return result;
- end function divide;
-
- -- sfixed(a downto b) / sfixed(c downto d) = sfixed(a-d+1 downto b-c)
- function divide (
- l, r : UNRESOLVED_sfixed;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (l'high - mine(r'low, r'low) + 1 downto
- mine (l'low, l'low) - r'high);
- variable dresult : UNRESOLVED_sfixed (result'high downto result'low-guard_bits);
- variable lresize : UNRESOLVED_sfixed (l'high+1 downto l'high+1 -dresult'length+1);
- variable lslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- variable rslv : UNRESOLVED_SIGNED (r'length-1 downto 0);
- variable result_slv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1 or
- mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
- return NASF;
- end if;
- lresize := resize (arg => l,
- left_index => lresize'high,
- right_index => lresize'low,
- overflow_style => fixed_wrap, -- vector only grows
- round_style => fixed_truncate);
- lslv := to_s (cleanvec (lresize));
- rslv := to_s (cleanvec (r));
- if (rslv = 0) then
- report fixed_generic_pkg'instance_name
- & "DIVIDE(sfixed) Division by zero" severity error;
- result := saturate (result'high, result'low);
- else
- result_slv := lslv / rslv;
- dresult := to_fixed (result_slv, dresult'high, dresult'low);
- result := resize (arg => dresult,
- left_index => result'high,
- right_index => result'low,
- overflow_style => fixed_wrap, -- overflow impossible
- round_style => round_style);
- end if;
- return result;
- end function divide;
-
- -- 1 / ufixed(a downto b) = ufixed(-b downto -a-1)
- function reciprocal (
- arg : UNRESOLVED_ufixed; -- fixed point input
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_ufixed
- is
- constant one : UNRESOLVED_ufixed (0 downto 0) := "1";
- begin
- return divide (l => one,
- r => arg,
- round_style => round_style,
- guard_bits => guard_bits);
- end function reciprocal;
-
- -- 1 / sfixed(a downto b) = sfixed(-b+1 downto -a)
- function reciprocal (
- arg : UNRESOLVED_sfixed; -- fixed point input
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_sfixed
- is
- constant one : UNRESOLVED_sfixed (1 downto 0) := "01"; -- extra bit.
- variable resultx : UNRESOLVED_sfixed (-mine(arg'low, arg'low)+2 downto -arg'high);
- begin
- if (arg'length < 1 or resultx'length < 1) then
- return NASF;
- else
- resultx := divide (l => one,
- r => arg,
- round_style => round_style,
- guard_bits => guard_bits);
- return resultx (resultx'high-1 downto resultx'low); -- remove extra bit
- end if;
- end function reciprocal;
-
- -- ufixed (a downto b) rem ufixed (c downto d)
- -- = ufixed (min(a,c) downto min(b,d))
- function "rem" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return remainder (l, r);
- end function "rem";
-
- -- remainder
- -- sfixed (a downto b) rem sfixed (c downto d)
- -- = sfixed (min(a,c) downto min(b,d))
- function "rem" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return remainder (l, r);
- end function "rem";
-
- -- ufixed (a downto b) rem ufixed (c downto d)
- -- = ufixed (min(a,c) downto min(b,d))
- function remainder (
- l, r : UNRESOLVED_ufixed; -- fixed point input
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (minimum(l'high, r'high) downto
- mine(l'low, r'low));
- variable lresize : UNRESOLVED_ufixed (maximum(l'high, r'low) downto
- mins(r'low, r'low)-guard_bits);
- variable rresize : UNRESOLVED_ufixed (r'high downto r'low-guard_bits);
- variable dresult : UNRESOLVED_ufixed (rresize'range);
- variable lslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- variable rslv : UNRESOLVED_UNSIGNED (rresize'length-1 downto 0);
- variable result_slv : UNRESOLVED_UNSIGNED (rslv'range);
- begin
- if (l'length < 1 or r'length < 1 or
- mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
- return NAUF;
- end if;
- lresize := resize (arg => l,
- left_index => lresize'high,
- right_index => lresize'low,
- overflow_style => fixed_wrap, -- vector only grows
- round_style => fixed_truncate);
- lslv := to_uns (lresize);
- rresize := resize (arg => r,
- left_index => rresize'high,
- right_index => rresize'low,
- overflow_style => fixed_wrap, -- vector only grows
- round_style => fixed_truncate);
- rslv := to_uns (rresize);
- if (rslv = 0) then
- report fixed_generic_pkg'instance_name
- & "remainder(ufixed) Division by zero" severity error;
- result := saturate (result'high, result'low); -- saturate
- else
- if (r'low <= l'high) then
- result_slv := lslv rem rslv;
- dresult := to_fixed (result_slv, dresult'high, dresult'low);
- result := resize (arg => dresult,
- left_index => result'high,
- right_index => result'low,
- overflow_style => fixed_wrap, -- can't overflow
- round_style => round_style);
- end if;
- if l'low < r'low then
- result(mins(r'low-1, l'high) downto l'low) :=
- cleanvec(l(mins(r'low-1, l'high) downto l'low));
- end if;
- end if;
- return result;
- end function remainder;
-
- -- remainder
- -- sfixed (a downto b) rem sfixed (c downto d)
- -- = sfixed (min(a,c) downto min(b,d))
- function remainder (
- l, r : UNRESOLVED_sfixed; -- fixed point input
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_sfixed
- is
- variable l_abs : UNRESOLVED_ufixed (l'range);
- variable r_abs : UNRESOLVED_ufixed (r'range);
- variable result : UNRESOLVED_sfixed (minimum(r'high, l'high) downto
- mine(r'low, l'low));
- variable neg_result : UNRESOLVED_sfixed (minimum(r'high, l'high)+1 downto
- mins(r'low, l'low));
- begin
- if (l'length < 1 or r'length < 1 or
- mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
- return NASF;
- end if;
- l_abs := to_ufixed (l);
- r_abs := to_ufixed (r);
- result := UNRESOLVED_sfixed (remainder (
- l => l_abs,
- r => r_abs,
- round_style => round_style));
- neg_result := -result;
- if l(l'high) = '1' then
- result := neg_result(result'range);
- end if;
- return result;
- end function remainder;
-
- -- modulo
- -- ufixed (a downto b) mod ufixed (c downto d)
- -- = ufixed (min(a,c) downto min(b, d))
- function "mod" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return modulo (l, r);
- end function "mod";
-
- -- sfixed (a downto b) mod sfixed (c downto d)
- -- = sfixed (c downto min(b, d))
- function "mod" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return modulo(l, r);
- end function "mod";
-
- -- modulo
- -- ufixed (a downto b) mod ufixed (c downto d)
- -- = ufixed (min(a,c) downto min(b, d))
- function modulo (
- l, r : UNRESOLVED_ufixed; -- fixed point input
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_ufixed is
- begin
- return remainder(l => l,
- r => r,
- round_style => round_style,
- guard_bits => guard_bits);
- end function modulo;
-
- -- sfixed (a downto b) mod sfixed (c downto d)
- -- = sfixed (c downto min(b, d))
- function modulo (
- l, r : UNRESOLVED_sfixed; -- fixed point input
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits)
- return UNRESOLVED_sfixed
- is
- variable l_abs : UNRESOLVED_ufixed (l'range);
- variable r_abs : UNRESOLVED_ufixed (r'range);
- variable result : UNRESOLVED_sfixed (r'high downto
- mine(r'low, l'low));
- variable dresult : UNRESOLVED_sfixed (minimum(r'high, l'high)+1 downto
- mins(r'low, l'low));
- variable dresult_not_zero : BOOLEAN;
- begin
- if (l'length < 1 or r'length < 1 or
- mins(r'low, r'low) /= r'low or mins(l'low, l'low) /= l'low) then
- return NASF;
- end if;
- l_abs := to_ufixed (l);
- r_abs := to_ufixed (r);
- dresult := "0" & UNRESOLVED_sfixed(remainder (l => l_abs,
- r => r_abs,
- round_style => round_style));
- if (to_s(dresult) = 0) then
- dresult_not_zero := false;
- else
- dresult_not_zero := true;
- end if;
- if to_x01(l(l'high)) = '1' and to_x01(r(r'high)) = '0'
- and dresult_not_zero then
- result := resize (arg => r - dresult,
- left_index => result'high,
- right_index => result'low,
- overflow_style => overflow_style,
- round_style => round_style);
- elsif to_x01(l(l'high)) = '1' and to_x01(r(r'high)) = '1' then
- result := resize (arg => -dresult,
- left_index => result'high,
- right_index => result'low,
- overflow_style => overflow_style,
- round_style => round_style);
- elsif to_x01(l(l'high)) = '0' and to_x01(r(r'high)) = '1'
- and dresult_not_zero then
- result := resize (arg => dresult + r,
- left_index => result'high,
- right_index => result'low,
- overflow_style => overflow_style,
- round_style => round_style);
- else
- result := resize (arg => dresult,
- left_index => result'high,
- right_index => result'low,
- overflow_style => overflow_style,
- round_style => round_style);
- end if;
- return result;
- end function modulo;
-
- -- Procedure for those who need an "accumulator" function
- procedure add_carry (
- L, R : in UNRESOLVED_ufixed;
- c_in : in STD_ULOGIC;
- result : out UNRESOLVED_ufixed;
- c_out : out STD_ULOGIC) is
- constant left_index : INTEGER := maximum(L'high, R'high)+1;
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (left_index-right_index
- downto 0);
- variable result_slv : UNRESOLVED_UNSIGNED (left_index-right_index
- downto 0);
- variable cx : UNRESOLVED_UNSIGNED (0 downto 0); -- Carry in
- begin
- if (L'length < 1 or R'length < 1) then
- result := NAUF;
- c_out := '0';
- else
- cx (0) := c_in;
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- result_slv := lslv + rslv + cx;
- c_out := result_slv(left_index-right_index);
- result := to_fixed(result_slv (left_index-right_index-1 downto 0),
- left_index-1, right_index);
- end if;
- end procedure add_carry;
-
- procedure add_carry (
- L, R : in UNRESOLVED_sfixed;
- c_in : in STD_ULOGIC;
- result : out UNRESOLVED_sfixed;
- c_out : out STD_ULOGIC) is
- constant left_index : INTEGER := maximum(L'high, R'high)+1;
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (left_index-right_index
- downto 0);
- variable result_slv : UNRESOLVED_SIGNED (left_index-right_index
- downto 0);
- variable cx : UNRESOLVED_SIGNED (1 downto 0); -- Carry in
- begin
- if (L'length < 1 or R'length < 1) then
- result := NASF;
- c_out := '0';
- else
- cx (1) := '0';
- cx (0) := c_in;
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- result_slv := lslv + rslv + cx;
- c_out := result_slv(left_index-right_index);
- result := to_fixed(result_slv (left_index-right_index-1 downto 0),
- left_index-1, right_index);
- end if;
- end procedure add_carry;
-
- -- Scales the result by a power of 2. Width of input = width of output with
- -- the decimal point moved.
- function scalb (y : UNRESOLVED_ufixed; N : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (y'high+N downto y'low+N);
- begin
- if y'length < 1 then
- return NAUF;
- else
- result := y;
- return result;
- end if;
- end function scalb;
-
- function scalb (y : UNRESOLVED_ufixed; N : UNRESOLVED_SIGNED)
- return UNRESOLVED_ufixed is
- begin
- return scalb (y => y,
- N => to_integer(N));
- end function scalb;
-
- function scalb (y : UNRESOLVED_sfixed; N : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (y'high+N downto y'low+N);
- begin
- if y'length < 1 then
- return NASF;
- else
- result := y;
- return result;
- end if;
- end function scalb;
-
- function scalb (y : UNRESOLVED_sfixed; N : UNRESOLVED_SIGNED)
- return UNRESOLVED_sfixed is
- begin
- return scalb (y => y,
- N => to_integer(N));
- end function scalb;
-
- function Is_Negative (arg : UNRESOLVED_sfixed) return BOOLEAN is
- begin
- if to_X01(arg(arg'high)) = '1' then
- return true;
- else
- return false;
- end if;
- end function Is_Negative;
-
- function find_rightmost (arg : UNRESOLVED_ufixed; y : STD_ULOGIC)
- return INTEGER is
- begin
- for_loop : for i in arg'reverse_range loop
- if arg(i) ?= y then
- return i;
- end if;
- end loop;
- return arg'high+1; -- return out of bounds 'high
- end function find_rightmost;
-
- function find_leftmost (arg : UNRESOLVED_ufixed; y : STD_ULOGIC)
- return INTEGER is
- begin
- for_loop : for i in arg'range loop
- if arg(i) ?= y then
- return i;
- end if;
- end loop;
- return arg'low-1; -- return out of bounds 'low
- end function find_leftmost;
-
- function find_rightmost (arg : UNRESOLVED_sfixed; y : STD_ULOGIC)
- return INTEGER is
- begin
- for_loop : for i in arg'reverse_range loop
- if arg(i) ?= y then
- return i;
- end if;
- end loop;
- return arg'high+1; -- return out of bounds 'high
- end function find_rightmost;
-
- function find_leftmost (arg : UNRESOLVED_sfixed; y : STD_ULOGIC)
- return INTEGER is
- begin
- for_loop : for i in arg'range loop
- if arg(i) ?= y then
- return i;
- end if;
- end loop;
- return arg'low-1; -- return out of bounds 'low
- end function find_leftmost;
-
- function "sll" (ARG : UNRESOLVED_ufixed; COUNT : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable argslv : UNRESOLVED_UNSIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (ARG'range);
- begin
- argslv := to_uns (ARG);
- argslv := argslv sll COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "sll";
-
- function "srl" (ARG : UNRESOLVED_ufixed; COUNT : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable argslv : UNRESOLVED_UNSIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (ARG'range);
- begin
- argslv := to_uns (ARG);
- argslv := argslv srl COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "srl";
-
- function "rol" (ARG : UNRESOLVED_ufixed; COUNT : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable argslv : UNRESOLVED_UNSIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (ARG'range);
- begin
- argslv := to_uns (ARG);
- argslv := argslv rol COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "rol";
-
- function "ror" (ARG : UNRESOLVED_ufixed; COUNT : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable argslv : UNRESOLVED_UNSIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (ARG'range);
- begin
- argslv := to_uns (ARG);
- argslv := argslv ror COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "ror";
-
- function "sla" (ARG : UNRESOLVED_ufixed; COUNT : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable argslv : UNRESOLVED_UNSIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (ARG'range);
- begin
- argslv := to_uns (ARG);
- -- Arithmetic shift on an unsigned is a logical shift
- argslv := argslv sll COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "sla";
-
- function "sra" (ARG : UNRESOLVED_ufixed; COUNT : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable argslv : UNRESOLVED_UNSIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_ufixed (ARG'range);
- begin
- argslv := to_uns (ARG);
- -- Arithmetic shift on an unsigned is a logical shift
- argslv := argslv srl COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "sra";
-
- function "sll" (ARG : UNRESOLVED_sfixed; COUNT : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable argslv : UNRESOLVED_SIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (ARG'range);
- begin
- argslv := to_s (ARG);
- argslv := argslv sll COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "sll";
-
- function "srl" (ARG : UNRESOLVED_sfixed; COUNT : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable argslv : UNRESOLVED_SIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (ARG'range);
- begin
- argslv := to_s (ARG);
- argslv := argslv srl COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "srl";
-
- function "rol" (ARG : UNRESOLVED_sfixed; COUNT : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable argslv : UNRESOLVED_SIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (ARG'range);
- begin
- argslv := to_s (ARG);
- argslv := argslv rol COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "rol";
-
- function "ror" (ARG : UNRESOLVED_sfixed; COUNT : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable argslv : UNRESOLVED_SIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (ARG'range);
- begin
- argslv := to_s (ARG);
- argslv := argslv ror COUNT;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "ror";
-
- function "sla" (ARG : UNRESOLVED_sfixed; COUNT : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable argslv : UNRESOLVED_SIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (ARG'range);
- begin
- argslv := to_s (ARG);
- if COUNT > 0 then
- -- Arithmetic shift left on a 2's complement number is a logic shift
- argslv := argslv sll COUNT;
- else
- argslv := argslv sra -COUNT;
- end if;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "sla";
-
- function "sra" (ARG : UNRESOLVED_sfixed; COUNT : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable argslv : UNRESOLVED_SIGNED (ARG'length-1 downto 0);
- variable result : UNRESOLVED_sfixed (ARG'range);
- begin
- argslv := to_s (ARG);
- if COUNT > 0 then
- argslv := argslv sra COUNT;
- else
- -- Arithmetic shift left on a 2's complement number is a logic shift
- argslv := argslv sll -COUNT;
- end if;
- result := to_fixed (argslv, result'high, result'low);
- return result;
- end function "sra";
-
- -- Because some people want the older functions.
- function SHIFT_LEFT (ARG : UNRESOLVED_ufixed; COUNT : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- if (ARG'length < 1) then
- return NAUF;
- end if;
- return ARG sla COUNT;
- end function SHIFT_LEFT;
-
- function SHIFT_RIGHT (ARG : UNRESOLVED_ufixed; COUNT : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- if (ARG'length < 1) then
- return NAUF;
- end if;
- return ARG sra COUNT;
- end function SHIFT_RIGHT;
-
- function SHIFT_LEFT (ARG : UNRESOLVED_sfixed; COUNT : NATURAL)
- return UNRESOLVED_sfixed is
- begin
- if (ARG'length < 1) then
- return NASF;
- end if;
- return ARG sla COUNT;
- end function SHIFT_LEFT;
-
- function SHIFT_RIGHT (ARG : UNRESOLVED_sfixed; COUNT : NATURAL)
- return UNRESOLVED_sfixed is
- begin
- if (ARG'length < 1) then
- return NASF;
- end if;
- return ARG sra COUNT;
- end function SHIFT_RIGHT;
-
- ----------------------------------------------------------------------------
- -- logical functions
- ----------------------------------------------------------------------------
- function "not" (L : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- RESULT := not to_sulv(L);
- return to_ufixed(RESULT, L'high, L'low);
- end function "not";
-
- function "and" (L, R : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) and to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """and"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_ufixed(RESULT, L'high, L'low);
- end function "and";
-
- function "or" (L, R : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) or to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """or"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_ufixed(RESULT, L'high, L'low);
- end function "or";
-
- function "nand" (L, R : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) nand to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """nand"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_ufixed(RESULT, L'high, L'low);
- end function "nand";
-
- function "nor" (L, R : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) nor to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """nor"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_ufixed(RESULT, L'high, L'low);
- end function "nor";
-
- function "xor" (L, R : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) xor to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """xor"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_ufixed(RESULT, L'high, L'low);
- end function "xor";
-
- function "xnor" (L, R : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) xnor to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """xnor"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_ufixed(RESULT, L'high, L'low);
- end function "xnor";
-
- function "not" (L : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- RESULT := not to_sulv(L);
- return to_sfixed(RESULT, L'high, L'low);
- end function "not";
-
- function "and" (L, R : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) and to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """and"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_sfixed(RESULT, L'high, L'low);
- end function "and";
-
- function "or" (L, R : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) or to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """or"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_sfixed(RESULT, L'high, L'low);
- end function "or";
-
- function "nand" (L, R : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) nand to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """nand"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_sfixed(RESULT, L'high, L'low);
- end function "nand";
-
- function "nor" (L, R : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) nor to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """nor"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_sfixed(RESULT, L'high, L'low);
- end function "nor";
-
- function "xor" (L, R : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) xor to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """xor"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_sfixed(RESULT, L'high, L'low);
- end function "xor";
-
- function "xnor" (L, R : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- variable RESULT : STD_ULOGIC_VECTOR(L'length-1 downto 0); -- force downto
- begin
- if (L'high = R'high and L'low = R'low) then
- RESULT := to_sulv(L) xnor to_sulv(R);
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """xnor"": Range error L'RANGE /= R'RANGE"
- severity warning;
- RESULT := (others => 'X');
- end if;
- return to_sfixed(RESULT, L'high, L'low);
- end function "xnor";
-
- -- Vector and std_ulogic functions, same as functions in numeric_std
- function "and" (L : STD_ULOGIC; R : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (R'range);
- begin
- for i in result'range loop
- result(i) := L and R(i);
- end loop;
- return result;
- end function "and";
-
- function "and" (L : UNRESOLVED_ufixed; R : STD_ULOGIC)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) and R;
- end loop;
- return result;
- end function "and";
-
- function "or" (L : STD_ULOGIC; R : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (R'range);
- begin
- for i in result'range loop
- result(i) := L or R(i);
- end loop;
- return result;
- end function "or";
-
- function "or" (L : UNRESOLVED_ufixed; R : STD_ULOGIC)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) or R;
- end loop;
- return result;
- end function "or";
-
- function "nand" (L : STD_ULOGIC; R : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (R'range);
- begin
- for i in result'range loop
- result(i) := L nand R(i);
- end loop;
- return result;
- end function "nand";
-
- function "nand" (L : UNRESOLVED_ufixed; R : STD_ULOGIC)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) nand R;
- end loop;
- return result;
- end function "nand";
-
- function "nor" (L : STD_ULOGIC; R : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (R'range);
- begin
- for i in result'range loop
- result(i) := L nor R(i);
- end loop;
- return result;
- end function "nor";
-
- function "nor" (L : UNRESOLVED_ufixed; R : STD_ULOGIC)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) nor R;
- end loop;
- return result;
- end function "nor";
-
- function "xor" (L : STD_ULOGIC; R : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (R'range);
- begin
- for i in result'range loop
- result(i) := L xor R(i);
- end loop;
- return result;
- end function "xor";
-
- function "xor" (L : UNRESOLVED_ufixed; R : STD_ULOGIC)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) xor R;
- end loop;
- return result;
- end function "xor";
-
- function "xnor" (L : STD_ULOGIC; R : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (R'range);
- begin
- for i in result'range loop
- result(i) := L xnor R(i);
- end loop;
- return result;
- end function "xnor";
-
- function "xnor" (L : UNRESOLVED_ufixed; R : STD_ULOGIC)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) xnor R;
- end loop;
- return result;
- end function "xnor";
-
- function "and" (L : STD_ULOGIC; R : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (R'range);
- begin
- for i in result'range loop
- result(i) := L and R(i);
- end loop;
- return result;
- end function "and";
-
- function "and" (L : UNRESOLVED_sfixed; R : STD_ULOGIC)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) and R;
- end loop;
- return result;
- end function "and";
-
- function "or" (L : STD_ULOGIC; R : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (R'range);
- begin
- for i in result'range loop
- result(i) := L or R(i);
- end loop;
- return result;
- end function "or";
-
- function "or" (L : UNRESOLVED_sfixed; R : STD_ULOGIC)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) or R;
- end loop;
- return result;
- end function "or";
-
- function "nand" (L : STD_ULOGIC; R : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (R'range);
- begin
- for i in result'range loop
- result(i) := L nand R(i);
- end loop;
- return result;
- end function "nand";
-
- function "nand" (L : UNRESOLVED_sfixed; R : STD_ULOGIC)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) nand R;
- end loop;
- return result;
- end function "nand";
-
- function "nor" (L : STD_ULOGIC; R : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (R'range);
- begin
- for i in result'range loop
- result(i) := L nor R(i);
- end loop;
- return result;
- end function "nor";
-
- function "nor" (L : UNRESOLVED_sfixed; R : STD_ULOGIC)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) nor R;
- end loop;
- return result;
- end function "nor";
-
- function "xor" (L : STD_ULOGIC; R : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (R'range);
- begin
- for i in result'range loop
- result(i) := L xor R(i);
- end loop;
- return result;
- end function "xor";
-
- function "xor" (L : UNRESOLVED_sfixed; R : STD_ULOGIC)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) xor R;
- end loop;
- return result;
- end function "xor";
-
- function "xnor" (L : STD_ULOGIC; R : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (R'range);
- begin
- for i in result'range loop
- result(i) := L xnor R(i);
- end loop;
- return result;
- end function "xnor";
-
- function "xnor" (L : UNRESOLVED_sfixed; R : STD_ULOGIC)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (L'range);
- begin
- for i in result'range loop
- result(i) := L(i) xnor R;
- end loop;
- return result;
- end function "xnor";
-
- -- Reduction operators
- function "and" (l : UNRESOLVED_ufixed) return STD_ULOGIC is
- begin
- return and to_sulv(l);
- end function "and";
-
- function "nand" (l : UNRESOLVED_ufixed) return STD_ULOGIC is
- begin
- return nand to_sulv(l);
- end function "nand";
-
- function "or" (l : UNRESOLVED_ufixed) return STD_ULOGIC is
- begin
- return or to_sulv(l);
- end function "or";
-
- function "nor" (l : UNRESOLVED_ufixed) return STD_ULOGIC is
- begin
- return nor to_sulv(l);
- end function "nor";
-
- function "xor" (l : UNRESOLVED_ufixed) return STD_ULOGIC is
- begin
- return xor to_sulv(l);
- end function "xor";
-
- function "xnor" (l : UNRESOLVED_ufixed) return STD_ULOGIC is
- begin
- return xnor to_sulv(l);
- end function "xnor";
-
- function "and" (l : UNRESOLVED_sfixed) return STD_ULOGIC is
- begin
- return and to_sulv(l);
- end function "and";
-
- function "nand" (l : UNRESOLVED_sfixed) return STD_ULOGIC is
- begin
- return nand to_sulv(l);
- end function "nand";
-
- function "or" (l : UNRESOLVED_sfixed) return STD_ULOGIC is
- begin
- return or to_sulv(l);
- end function "or";
-
- function "nor" (l : UNRESOLVED_sfixed) return STD_ULOGIC is
- begin
- return nor to_sulv(l);
- end function "nor";
-
- function "xor" (l : UNRESOLVED_sfixed) return STD_ULOGIC is
- begin
- return xor to_sulv(l);
- end function "xor";
-
- function "xnor" (l : UNRESOLVED_sfixed) return STD_ULOGIC is
- begin
- return xnor to_sulv(l);
- end function "xnor";
- -- End reduction operators
-
- function "?=" (L, R : UNRESOLVED_ufixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin -- ?=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv ?= rslv;
- end if;
- end function "?=";
-
- function "?/=" (L, R : UNRESOLVED_ufixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin -- ?/=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?/="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv ?/= rslv;
- end if;
- end function "?/=";
-
- function "?>" (L, R : UNRESOLVED_ufixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin -- ?>
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?>"": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv ?> rslv;
- end if;
- end function "?>";
-
- function "?>=" (L, R : UNRESOLVED_ufixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin -- ?>=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?>="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv ?>= rslv;
- end if;
- end function "?>=";
-
- function "?<" (L, R : UNRESOLVED_ufixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin -- ?<
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?<"": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv ?< rslv;
- end if;
- end function "?<";
-
- function "?<=" (L, R : UNRESOLVED_ufixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin -- ?<=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?<="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv ?<= rslv;
- end if;
- end function "?<=";
-
- function "?=" (L, R : UNRESOLVED_sfixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin -- ?=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv ?= rslv;
- end if;
- end function "?=";
-
- function "?/=" (L, R : UNRESOLVED_sfixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin -- ?/=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?/="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv ?/= rslv;
- end if;
- end function "?/=";
-
- function "?>" (L, R : UNRESOLVED_sfixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin -- ?>
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?>"": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv ?> rslv;
- end if;
- end function "?>";
-
- function "?>=" (L, R : UNRESOLVED_sfixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin -- ?>=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?>="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv ?>= rslv;
- end if;
- end function "?>=";
-
- function "?<" (L, R : UNRESOLVED_sfixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin -- ?<
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?<"": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv ?< rslv;
- end if;
- end function "?<";
-
- function "?<=" (L, R : UNRESOLVED_sfixed) return STD_ULOGIC is
- constant left_index : INTEGER := maximum(L'high, R'high);
- constant right_index : INTEGER := mins(L'low, R'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin -- ?<=
- if ((L'length < 1) or (R'length < 1)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """?<="": null detected, returning X"
- severity warning;
- return 'X';
- else
- lresize := resize (L, left_index, right_index);
- rresize := resize (R, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv ?<= rslv;
- end if;
- end function "?<=";
-
- -- Match function, similar to "std_match" from numeric_std
- function std_match (L, R : UNRESOLVED_ufixed) return BOOLEAN is
- begin
- if (L'high = R'high and L'low = R'low) then
- return std_match(to_sulv(L), to_sulv(R));
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "STD_MATCH: L'RANGE /= R'RANGE, returning FALSE"
- severity warning;
- return false;
- end if;
- end function std_match;
-
- function std_match (L, R : UNRESOLVED_sfixed) return BOOLEAN is
- begin
- if (L'high = R'high and L'low = R'low) then
- return std_match(to_sulv(L), to_sulv(R));
- else
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "STD_MATCH: L'RANGE /= R'RANGE, returning FALSE"
- severity warning;
- return false;
- end if;
- end function std_match;
-
- -- compare functions
- function "=" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """="": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """="": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv = rslv;
- end function "=";
-
- function "=" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """="": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """="": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv = rslv;
- end function "=";
-
- function "/=" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """/="": null argument detected, returning TRUE"
- severity warning;
- return true;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """/="": metavalue detected, returning TRUE"
- severity warning;
- return true;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv /= rslv;
- end function "/=";
-
- function "/=" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """/="": null argument detected, returning TRUE"
- severity warning;
- return true;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """/="": metavalue detected, returning TRUE"
- severity warning;
- return true;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv /= rslv;
- end function "/=";
-
- function ">" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>"": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>"": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv > rslv;
- end function ">";
-
- function ">" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>"": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>"": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv > rslv;
- end function ">";
-
- function "<" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<"": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<"": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv < rslv;
- end function "<";
-
- function "<" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<"": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<"": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv < rslv;
- end function "<";
-
- function ">=" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>="": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>="": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv >= rslv;
- end function ">=";
-
- function ">=" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>="": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """>="": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv >= rslv;
- end function ">=";
-
- function "<=" (
- l, r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_UNSIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<="": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<="": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_uns (lresize);
- rslv := to_uns (rresize);
- return lslv <= rslv;
- end function "<=";
-
- function "<=" (
- l, r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN
- is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- variable lslv, rslv : UNRESOLVED_SIGNED (lresize'length-1 downto 0);
- begin
- if (l'length < 1 or r'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<="": null argument detected, returning FALSE"
- severity warning;
- return false;
- elsif (Is_X(l) or Is_X(r)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & """<="": metavalue detected, returning FALSE"
- severity warning;
- return false;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- lslv := to_s (lresize);
- rslv := to_s (rresize);
- return lslv <= rslv;
- end function "<=";
-
- -- overloads of the default maximum and minimum functions
- function maximum (l, r : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- begin
- if (l'length < 1 or r'length < 1) then
- return NAUF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- return to_fixed(maximum(to_uns(lresize), to_uns(rresize)),
- left_index, right_index);
- end function maximum;
-
- function maximum (l, r : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- begin
- if (l'length < 1 or r'length < 1) then
- return NASF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- return to_fixed(maximum(to_s(lresize), to_s(rresize)),
- left_index, right_index);
- end function maximum;
-
- function minimum (l, r : UNRESOLVED_ufixed) return UNRESOLVED_ufixed is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_ufixed (left_index downto right_index);
- begin
- if (l'length < 1 or r'length < 1) then
- return NAUF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- return to_fixed(minimum(to_uns(lresize), to_uns(rresize)),
- left_index, right_index);
- end function minimum;
-
- function minimum (l, r : UNRESOLVED_sfixed) return UNRESOLVED_sfixed is
- constant left_index : INTEGER := maximum(l'high, r'high);
- constant right_index : INTEGER := mins(l'low, r'low);
- variable lresize, rresize : UNRESOLVED_sfixed (left_index downto right_index);
- begin
- if (l'length < 1 or r'length < 1) then
- return NASF;
- end if;
- lresize := resize (l, left_index, right_index);
- rresize := resize (r, left_index, right_index);
- return to_fixed(minimum(to_s(lresize), to_s(rresize)),
- left_index, right_index);
- end function minimum;
-
- function to_ufixed (
- arg : NATURAL; -- integer
- constant left_index : INTEGER; -- left index (high index)
- constant right_index : INTEGER := 0; -- right index
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mins (right_index, right_index); -- catch literals
- variable result : UNRESOLVED_ufixed (left_index downto fw);
- variable sresult : UNRESOLVED_ufixed (left_index downto 0) :=
- (others => '0'); -- integer portion
- variable argx : NATURAL; -- internal version of arg
- begin
- if (result'length < 1) then
- return NAUF;
- end if;
- if arg /= 0 then
- argx := arg;
- for I in 0 to sresult'left loop
- if (argx mod 2) = 0 then
- sresult(I) := '0';
- else
- sresult(I) := '1';
- end if;
- argx := argx/2;
- end loop;
- if argx /= 0 then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_UFIXED(NATURAL): vector truncated"
- severity warning;
- if overflow_style = fixed_saturate then
- return saturate (left_index, right_index);
- end if;
- end if;
- result := resize (arg => sresult,
- left_index => left_index,
- right_index => right_index,
- round_style => round_style,
- overflow_style => overflow_style);
- else
- result := (others => '0');
- end if;
- return result;
- end function to_ufixed;
-
- function to_sfixed (
- arg : INTEGER; -- integer
- constant left_index : INTEGER; -- left index (high index)
- constant right_index : INTEGER := 0; -- right index
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mins (right_index, right_index); -- catch literals
- variable result : UNRESOLVED_sfixed (left_index downto fw);
- variable sresult : UNRESOLVED_sfixed (left_index downto 0) :=
- (others => '0'); -- integer portion
- variable argx : INTEGER; -- internal version of arg
- variable sign : STD_ULOGIC; -- sign of input
- begin
- if (result'length < 1) then -- null range
- return NASF;
- end if;
- if arg /= 0 then
- if (arg < 0) then
- sign := '1';
- argx := -(arg + 1);
- else
- sign := '0';
- argx := arg;
- end if;
- for I in 0 to sresult'left loop
- if (argx mod 2) = 0 then
- sresult(I) := sign;
- else
- sresult(I) := not sign;
- end if;
- argx := argx/2;
- end loop;
- if argx /= 0 or left_index < 0 or sign /= sresult(sresult'left) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_SFIXED(INTEGER): vector truncated"
- severity warning;
- if overflow_style = fixed_saturate then -- saturate
- if arg < 0 then
- result := not saturate (result'high, result'low); -- underflow
- else
- result := saturate (result'high, result'low); -- overflow
- end if;
- return result;
- end if;
- end if;
- result := resize (arg => sresult,
- left_index => left_index,
- right_index => right_index,
- round_style => round_style,
- overflow_style => overflow_style);
- else
- result := (others => '0');
- end if;
- return result;
- end function to_sfixed;
-
- function to_ufixed (
- arg : REAL; -- real
- constant left_index : INTEGER; -- left index (high index)
- constant right_index : INTEGER; -- right index
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mins (right_index, right_index); -- catch literals
- variable result : UNRESOLVED_ufixed (left_index downto fw) :=
- (others => '0');
- variable Xresult : UNRESOLVED_ufixed (left_index downto
- fw-guard_bits) :=
- (others => '0');
- variable presult : REAL;
- begin
- -- If negative or null range, return.
- if (left_index < fw) then
- return NAUF;
- end if;
- if (arg < 0.0) then
- report fixed_generic_pkg'instance_name
- & "TO_UFIXED: Negative argument passed "
- & REAL'image(arg) severity error;
- return result;
- end if;
- presult := arg;
- if presult >= (2.0**(left_index+1)) then
- assert no_warning report fixed_generic_pkg'instance_name
- & "TO_UFIXED(REAL): vector truncated"
- severity warning;
- if overflow_style = fixed_wrap then
- presult := presult mod (2.0**(left_index+1)); -- wrap
- else
- return saturate (result'high, result'low);
- end if;
- end if;
- for i in Xresult'range loop
- if presult >= 2.0**i then
- Xresult(i) := '1';
- presult := presult - 2.0**i;
- else
- Xresult(i) := '0';
- end if;
- end loop;
- if guard_bits > 0 and round_style = fixed_round then
- result := round_fixed (arg => Xresult (left_index
- downto right_index),
- remainder => Xresult (right_index-1 downto
- right_index-guard_bits),
- overflow_style => overflow_style);
- else
- result := Xresult (result'range);
- end if;
- return result;
- end function to_ufixed;
-
- function to_sfixed (
- arg : REAL; -- real
- constant left_index : INTEGER; -- left index (high index)
- constant right_index : INTEGER; -- right index
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mins (right_index, right_index); -- catch literals
- variable result : UNRESOLVED_sfixed (left_index downto fw) :=
- (others => '0');
- variable Xresult : UNRESOLVED_sfixed (left_index+1 downto fw-guard_bits) :=
- (others => '0');
- variable presult : REAL;
- begin
- if (left_index < fw) then -- null range
- return NASF;
- end if;
- if (arg >= (2.0**left_index) or arg < -(2.0**left_index)) then
- assert no_warning report fixed_generic_pkg'instance_name
- & "TO_SFIXED(REAL): vector truncated"
- severity warning;
- if overflow_style = fixed_saturate then
- if arg < 0.0 then -- saturate
- result := not saturate (result'high, result'low); -- underflow
- else
- result := saturate (result'high, result'low); -- overflow
- end if;
- return result;
- else
- presult := abs(arg) mod (2.0**(left_index+1)); -- wrap
- end if;
- else
- presult := abs(arg);
- end if;
- for i in Xresult'range loop
- if presult >= 2.0**i then
- Xresult(i) := '1';
- presult := presult - 2.0**i;
- else
- Xresult(i) := '0';
- end if;
- end loop;
- if arg < 0.0 then
- Xresult := to_fixed(-to_s(Xresult), Xresult'high, Xresult'low);
- end if;
- if guard_bits > 0 and round_style = fixed_round then
- result := round_fixed (arg => Xresult (left_index
- downto right_index),
- remainder => Xresult (right_index-1 downto
- right_index-guard_bits),
- overflow_style => overflow_style);
- else
- result := Xresult (result'range);
- end if;
- return result;
- end function to_sfixed;
-
- function to_ufixed (
- arg : UNRESOLVED_UNSIGNED; -- unsigned
- constant left_index : INTEGER; -- left index (high index)
- constant right_index : INTEGER := 0; -- right index
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_ufixed
- is
- constant ARG_LEFT : INTEGER := arg'length-1;
- alias XARG : UNRESOLVED_UNSIGNED(ARG_LEFT downto 0) is arg;
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- begin
- if arg'length < 1 or (left_index < right_index) then
- return NAUF;
- end if;
- result := resize (arg => UNRESOLVED_ufixed (XARG),
- left_index => left_index,
- right_index => right_index,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end function to_ufixed;
-
- -- converted version
- function to_ufixed (
- arg : UNRESOLVED_UNSIGNED) -- unsigned
- return UNRESOLVED_ufixed
- is
- constant ARG_LEFT : INTEGER := arg'length-1;
- alias XARG : UNRESOLVED_UNSIGNED(ARG_LEFT downto 0) is arg;
- begin
- if arg'length < 1 then
- return NAUF;
- end if;
- return UNRESOLVED_ufixed(XARG);
- end function to_ufixed;
-
- function to_sfixed (
- arg : UNRESOLVED_SIGNED; -- signed
- constant left_index : INTEGER; -- left index (high index)
- constant right_index : INTEGER := 0; -- right index
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_sfixed
- is
- constant ARG_LEFT : INTEGER := arg'length-1;
- alias XARG : UNRESOLVED_SIGNED(ARG_LEFT downto 0) is arg;
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- begin
- if arg'length < 1 or (left_index < right_index) then
- return NASF;
- end if;
- result := resize (arg => UNRESOLVED_sfixed (XARG),
- left_index => left_index,
- right_index => right_index,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end function to_sfixed;
-
- -- converted version
- function to_sfixed (
- arg : UNRESOLVED_SIGNED) -- signed
- return UNRESOLVED_sfixed
- is
- constant ARG_LEFT : INTEGER := arg'length-1;
- alias XARG : UNRESOLVED_SIGNED(ARG_LEFT downto 0) is arg;
- begin
- if arg'length < 1 then
- return NASF;
- end if;
- return UNRESOLVED_sfixed(XARG);
- end function to_sfixed;
-
- function to_sfixed (arg : UNRESOLVED_ufixed) return UNRESOLVED_sfixed is
- variable result : UNRESOLVED_sfixed (arg'high+1 downto arg'low);
- begin
- if arg'length < 1 then
- return NASF;
- end if;
- result (arg'high downto arg'low) := UNRESOLVED_sfixed(cleanvec(arg));
- result (arg'high+1) := '0';
- return result;
- end function to_sfixed;
-
- -- Because of the fairly complicated sizing rules in the fixed point
- -- packages these functions are provided to compute the result ranges
- -- Example:
- -- signal uf1 : ufixed (3 downto -3);
- -- signal uf2 : ufixed (4 downto -2);
- -- signal uf1multuf2 : ufixed (ufixed_high (3, -3, '*', 4, -2) downto
- -- ufixed_low (3, -3, '*', 4, -2));
- -- uf1multuf2 <= uf1 * uf2;
- -- Valid characters: '+', '-', '*', '/', 'r' or 'R' (rem), 'm' or 'M' (mod),
- -- '1' (reciprocal), 'A', 'a' (abs), 'N', 'n' (-sfixed)
- function ufixed_high (left_index, right_index : INTEGER;
- operation : CHARACTER := 'X';
- left_index2, right_index2 : INTEGER := 0)
- return INTEGER is
- begin
- case operation is
- when '+'| '-' => return maximum (left_index, left_index2) + 1;
- when '*' => return left_index + left_index2 + 1;
- when '/' => return left_index - right_index2;
- when '1' => return -right_index; -- reciprocal
- when 'R'|'r' => return mins (left_index, left_index2); -- "rem"
- when 'M'|'m' => return mins (left_index, left_index2); -- "mod"
- when others => return left_index; -- For abs and default
- end case;
- end function ufixed_high;
-
- function ufixed_low (left_index, right_index : INTEGER;
- operation : CHARACTER := 'X';
- left_index2, right_index2 : INTEGER := 0)
- return INTEGER is
- begin
- case operation is
- when '+'| '-' => return mins (right_index, right_index2);
- when '*' => return right_index + right_index2;
- when '/' => return right_index - left_index2 - 1;
- when '1' => return -left_index - 1; -- reciprocal
- when 'R'|'r' => return mins (right_index, right_index2); -- "rem"
- when 'M'|'m' => return mins (right_index, right_index2); -- "mod"
- when others => return right_index; -- for abs and default
- end case;
- end function ufixed_low;
-
- function sfixed_high (left_index, right_index : INTEGER;
- operation : CHARACTER := 'X';
- left_index2, right_index2 : INTEGER := 0)
- return INTEGER is
- begin
- case operation is
- when '+'| '-' => return maximum (left_index, left_index2) + 1;
- when '*' => return left_index + left_index2 + 1;
- when '/' => return left_index - right_index2 + 1;
- when '1' => return -right_index + 1; -- reciprocal
- when 'R'|'r' => return mins (left_index, left_index2); -- "rem"
- when 'M'|'m' => return left_index2; -- "mod"
- when 'A'|'a' => return left_index + 1; -- "abs"
- when 'N'|'n' => return left_index + 1; -- -sfixed
- when others => return left_index;
- end case;
- end function sfixed_high;
-
- function sfixed_low (left_index, right_index : INTEGER;
- operation : CHARACTER := 'X';
- left_index2, right_index2 : INTEGER := 0)
- return INTEGER is
- begin
- case operation is
- when '+'| '-' => return mins (right_index, right_index2);
- when '*' => return right_index + right_index2;
- when '/' => return right_index - left_index2;
- when '1' => return -left_index; -- reciprocal
- when 'R'|'r' => return mins (right_index, right_index2); -- "rem"
- when 'M'|'m' => return mins (right_index, right_index2); -- "mod"
- when others => return right_index; -- default for abs, neg and default
- end case;
- end function sfixed_low;
-
- -- Same as above, but using the "size_res" input only for their ranges:
- -- signal uf1multuf2 : ufixed (ufixed_high (uf1, '*', uf2) downto
- -- ufixed_low (uf1, '*', uf2));
- -- uf1multuf2 <= uf1 * uf2;
- function ufixed_high (size_res : UNRESOLVED_ufixed;
- operation : CHARACTER := 'X';
- size_res2 : UNRESOLVED_ufixed)
- return INTEGER is
- begin
- return ufixed_high (left_index => size_res'high,
- right_index => size_res'low,
- operation => operation,
- left_index2 => size_res2'high,
- right_index2 => size_res2'low);
- end function ufixed_high;
-
- function ufixed_low (size_res : UNRESOLVED_ufixed;
- operation : CHARACTER := 'X';
- size_res2 : UNRESOLVED_ufixed)
- return INTEGER is
- begin
- return ufixed_low (left_index => size_res'high,
- right_index => size_res'low,
- operation => operation,
- left_index2 => size_res2'high,
- right_index2 => size_res2'low);
- end function ufixed_low;
-
- function sfixed_high (size_res : UNRESOLVED_sfixed;
- operation : CHARACTER := 'X';
- size_res2 : UNRESOLVED_sfixed)
- return INTEGER is
- begin
- return sfixed_high (left_index => size_res'high,
- right_index => size_res'low,
- operation => operation,
- left_index2 => size_res2'high,
- right_index2 => size_res2'low);
- end function sfixed_high;
-
- function sfixed_low (size_res : UNRESOLVED_sfixed;
- operation : CHARACTER := 'X';
- size_res2 : UNRESOLVED_sfixed)
- return INTEGER is
- begin
- return sfixed_low (left_index => size_res'high,
- right_index => size_res'low,
- operation => operation,
- left_index2 => size_res2'high,
- right_index2 => size_res2'low);
- end function sfixed_low;
-
- -- purpose: returns a saturated number
- function saturate (
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_ufixed
- is
- constant sat : UNRESOLVED_ufixed (left_index downto right_index) :=
- (others => '1');
- begin
- return sat;
- end function saturate;
-
- -- purpose: returns a saturated number
- function saturate (
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable sat : UNRESOLVED_sfixed (left_index downto right_index) :=
- (others => '1');
- begin
- -- saturate positive, to saturate negative, just do "not saturate()"
- sat (left_index) := '0';
- return sat;
- end function saturate;
-
- function saturate (
- size_res : UNRESOLVED_ufixed) -- only the size of this is used
- return UNRESOLVED_ufixed is
- begin
- return saturate (size_res'high, size_res'low);
- end function saturate;
-
- function saturate (
- size_res : UNRESOLVED_sfixed) -- only the size of this is used
- return UNRESOLVED_sfixed is
- begin
- return saturate (size_res'high, size_res'low);
- end function saturate;
-
- -- As a concession to those who use a graphical DSP environment,
- -- these functions take parameters in those tools format and create
- -- fixed point numbers. These functions are designed to convert from
- -- a std_logic_vector to the VHDL fixed point format using the conventions
- -- of these packages. In a pure VHDL environment you should use the
- -- "to_ufixed" and "to_sfixed" routines.
- -- Unsigned fixed point
- function to_UFix (
- arg : STD_ULOGIC_VECTOR;
- width : NATURAL; -- width of vector
- fraction : NATURAL) -- width of fraction
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (width-fraction-1 downto -fraction);
- begin
- if (arg'length /= result'length) then
- report fixed_generic_pkg'instance_name
- & "TO_UFIX (STD_ULOGIC_VECTOR) "
- & "Vector lengths do not match. Input length is "
- & INTEGER'image(arg'length) & " and output will be "
- & INTEGER'image(result'length) & " wide."
- severity error;
- return NAUF;
- else
- result := to_ufixed (arg, result'high, result'low);
- return result;
- end if;
- end function to_UFix;
-
- -- signed fixed point
- function to_SFix (
- arg : STD_ULOGIC_VECTOR;
- width : NATURAL; -- width of vector
- fraction : NATURAL) -- width of fraction
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (width-fraction-1 downto -fraction);
- begin
- if (arg'length /= result'length) then
- report fixed_generic_pkg'instance_name
- & "TO_SFIX (STD_ULOGIC_VECTOR) "
- & "Vector lengths do not match. Input length is "
- & INTEGER'image(arg'length) & " and output will be "
- & INTEGER'image(result'length) & " wide."
- severity error;
- return NASF;
- else
- result := to_sfixed (arg, result'high, result'low);
- return result;
- end if;
- end function to_SFix;
-
- -- finding the bounds of a number. These functions can be used like this:
- -- signal xxx : ufixed (7 downto -3);
- -- -- Which is the same as "ufixed (UFix_high (11,3) downto UFix_low(11,3))"
- -- signal yyy : ufixed (UFix_high (11, 3, "+", 11, 3)
- -- downto UFix_low(11, 3, "+", 11, 3));
- -- Where "11" is the width of xxx (xxx'length),
- -- and 3 is the lower bound (abs (xxx'low))
- -- In a pure VHDL environment use "ufixed_high" and "ufixed_low"
- function ufix_high (
- width, fraction : NATURAL;
- operation : CHARACTER := 'X';
- width2, fraction2 : NATURAL := 0)
- return INTEGER is
- begin
- return ufixed_high (left_index => width - 1 - fraction,
- right_index => -fraction,
- operation => operation,
- left_index2 => width2 - 1 - fraction2,
- right_index2 => -fraction2);
- end function ufix_high;
-
- function ufix_low (
- width, fraction : NATURAL;
- operation : CHARACTER := 'X';
- width2, fraction2 : NATURAL := 0)
- return INTEGER is
- begin
- return ufixed_low (left_index => width - 1 - fraction,
- right_index => -fraction,
- operation => operation,
- left_index2 => width2 - 1 - fraction2,
- right_index2 => -fraction2);
- end function ufix_low;
-
- function sfix_high (
- width, fraction : NATURAL;
- operation : CHARACTER := 'X';
- width2, fraction2 : NATURAL := 0)
- return INTEGER is
- begin
- return sfixed_high (left_index => width - fraction,
- right_index => -fraction,
- operation => operation,
- left_index2 => width2 - fraction2,
- right_index2 => -fraction2);
- end function sfix_high;
-
- function sfix_low (
- width, fraction : NATURAL;
- operation : CHARACTER := 'X';
- width2, fraction2 : NATURAL := 0)
- return INTEGER is
- begin
- return sfixed_low (left_index => width - fraction,
- right_index => -fraction,
- operation => operation,
- left_index2 => width2 - fraction2,
- right_index2 => -fraction2);
- end function sfix_low;
-
- function to_unsigned (
- arg : UNRESOLVED_ufixed; -- ufixed point input
- constant size : NATURAL; -- length of output
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_UNSIGNED is
- begin
- return to_uns(resize (arg => arg,
- left_index => size-1,
- right_index => 0,
- round_style => round_style,
- overflow_style => overflow_style));
- end function to_unsigned;
-
- function to_unsigned (
- arg : UNRESOLVED_ufixed; -- ufixed point input
- size_res : UNRESOLVED_UNSIGNED; -- length of output
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_UNSIGNED is
- begin
- return to_unsigned (arg => arg,
- size => size_res'length,
- round_style => round_style,
- overflow_style => overflow_style);
- end function to_unsigned;
-
- function to_signed (
- arg : UNRESOLVED_sfixed; -- sfixed point input
- constant size : NATURAL; -- length of output
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_SIGNED is
- begin
- return to_s(resize (arg => arg,
- left_index => size-1,
- right_index => 0,
- round_style => round_style,
- overflow_style => overflow_style));
- end function to_signed;
-
- function to_signed (
- arg : UNRESOLVED_sfixed; -- sfixed point input
- size_res : UNRESOLVED_SIGNED; -- used for length of output
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_SIGNED is
- begin
- return to_signed (arg => arg,
- size => size_res'length,
- round_style => round_style,
- overflow_style => overflow_style);
- end function to_signed;
-
- function to_real (
- arg : UNRESOLVED_ufixed) -- ufixed point input
- return REAL
- is
- constant left_index : INTEGER := arg'high;
- constant right_index : INTEGER := arg'low;
- variable result : REAL; -- result
- variable arg_int : UNRESOLVED_ufixed (left_index downto right_index);
- begin
- if (arg'length < 1) then
- return 0.0;
- end if;
- arg_int := To_X01(cleanvec(arg));
- if (Is_X(arg_int)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_REAL (ufixed): metavalue detected, returning 0.0"
- severity warning;
- return 0.0;
- end if;
- result := 0.0;
- for i in arg_int'range loop
- if (arg_int(i) = '1') then
- result := result + (2.0**i);
- end if;
- end loop;
- return result;
- end function to_real;
-
- function to_real (
- arg : UNRESOLVED_sfixed) -- ufixed point input
- return REAL
- is
- constant left_index : INTEGER := arg'high;
- constant right_index : INTEGER := arg'low;
- variable result : REAL; -- result
- variable arg_int : UNRESOLVED_sfixed (left_index downto right_index);
- -- unsigned version of argument
- variable arg_uns : UNRESOLVED_ufixed (left_index downto right_index);
- -- absolute of argument
- begin
- if (arg'length < 1) then
- return 0.0;
- end if;
- arg_int := to_X01(cleanvec(arg));
- if (Is_X(arg_int)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_REAL (sfixed): metavalue detected, returning 0.0"
- severity warning;
- return 0.0;
- end if;
- arg_uns := to_ufixed (arg_int);
- result := to_real (arg_uns);
- if (arg_int(arg_int'high) = '1') then
- result := -result;
- end if;
- return result;
- end function to_real;
-
- function to_integer (
- arg : UNRESOLVED_ufixed; -- fixed point input
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return NATURAL
- is
- constant left_index : INTEGER := arg'high;
- variable arg_uns : UNRESOLVED_UNSIGNED (left_index+1 downto 0)
- := (others => '0');
- begin
- if (arg'length < 1) then
- return 0;
- end if;
- if (Is_X (arg)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_INTEGER (ufixed): metavalue detected, returning 0"
- severity warning;
- return 0;
- end if;
- if (left_index < -1) then
- return 0;
- end if;
- arg_uns := to_uns(resize (arg => arg,
- left_index => arg_uns'high,
- right_index => 0,
- round_style => round_style,
- overflow_style => overflow_style));
- return to_integer (arg_uns);
- end function to_integer;
-
- function to_integer (
- arg : UNRESOLVED_sfixed; -- fixed point input
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return INTEGER
- is
- constant left_index : INTEGER := arg'high;
- variable arg_s : UNRESOLVED_SIGNED (left_index+1 downto 0);
- begin
- if (arg'length < 1) then
- return 0;
- end if;
- if (Is_X (arg)) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_INTEGER (sfixed): metavalue detected, returning 0"
- severity warning;
- return 0;
- end if;
- if (left_index < -1) then
- return 0;
- end if;
- arg_s := to_s(resize (arg => arg,
- left_index => arg_s'high,
- right_index => 0,
- round_style => round_style,
- overflow_style => overflow_style));
- return to_integer (arg_s);
- end function to_integer;
-
- function to_01 (
- s : UNRESOLVED_ufixed; -- ufixed point input
- constant XMAP : STD_ULOGIC := '0') -- Map x to
- return UNRESOLVED_ufixed
- is
- begin
- if (s'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_01(ufixed): null detected, returning NULL"
- severity warning;
- return NAUF;
- end if;
- return to_fixed (to_01(to_uns(s), XMAP), s'high, s'low);
- end function to_01;
-
- function to_01 (
- s : UNRESOLVED_sfixed; -- sfixed point input
- constant XMAP : STD_ULOGIC := '0') -- Map x to
- return UNRESOLVED_sfixed
- is
- begin
- if (s'length < 1) then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "TO_01(sfixed): null detected, returning NULL"
- severity warning;
- return NASF;
- end if;
- return to_fixed (to_01(to_s(s), XMAP), s'high, s'low);
- end function to_01;
-
- function Is_X (
- arg : UNRESOLVED_ufixed)
- return BOOLEAN
- is
- variable argslv : STD_ULOGIC_VECTOR (arg'length-1 downto 0); -- slv
- begin
- argslv := to_sulv(arg);
- return Is_X (argslv);
- end function Is_X;
-
- function Is_X (
- arg : UNRESOLVED_sfixed)
- return BOOLEAN
- is
- variable argslv : STD_ULOGIC_VECTOR (arg'length-1 downto 0); -- slv
- begin
- argslv := to_sulv(arg);
- return Is_X (argslv);
- end function Is_X;
-
- function To_X01 (
- arg : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed is
- begin
- return to_ufixed (To_X01(to_sulv(arg)), arg'high, arg'low);
- end function To_X01;
-
- function to_X01 (
- arg : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return to_sfixed (To_X01(to_sulv(arg)), arg'high, arg'low);
- end function to_X01;
-
- function To_X01Z (
- arg : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed is
- begin
- return to_ufixed (To_X01Z(to_sulv(arg)), arg'high, arg'low);
- end function To_X01Z;
-
- function to_X01Z (
- arg : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return to_sfixed (To_X01Z(to_sulv(arg)), arg'high, arg'low);
- end function to_X01Z;
-
- function To_UX01 (
- arg : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed is
- begin
- return to_ufixed (To_UX01(to_sulv(arg)), arg'high, arg'low);
- end function To_UX01;
-
- function to_UX01 (
- arg : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return to_sfixed (To_UX01(to_sulv(arg)), arg'high, arg'low);
- end function to_UX01;
-
- function resize (
- arg : UNRESOLVED_ufixed; -- input
- constant left_index : INTEGER; -- integer portion
- constant right_index : INTEGER; -- size of fraction
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_ufixed
- is
- constant arghigh : INTEGER := maximum (arg'high, arg'low);
- constant arglow : INTEGER := mine (arg'high, arg'low);
- variable invec : UNRESOLVED_ufixed (arghigh downto arglow);
- variable result : UNRESOLVED_ufixed(left_index downto right_index) :=
- (others => '0');
- variable needs_rounding : BOOLEAN := false;
- begin -- resize
- if (arg'length < 1) or (result'length < 1) then
- return NAUF;
- elsif (invec'length < 1) then
- return result; -- string literal value
- else
- invec := cleanvec(arg);
- if (right_index > arghigh) then -- return top zeros
- needs_rounding := (round_style = fixed_round) and
- (right_index = arghigh+1);
- elsif (left_index < arglow) then -- return overflow
- if (overflow_style = fixed_saturate) and
- (or(to_sulv(invec)) = '1') then
- result := saturate (result'high, result'low); -- saturate
- end if;
- elsif (arghigh > left_index) then
- -- wrap or saturate?
- if (overflow_style = fixed_saturate and
- or (to_sulv(invec(arghigh downto left_index+1))) = '1')
- then
- result := saturate (result'high, result'low); -- saturate
- else
- if (arglow >= right_index) then
- result (left_index downto arglow) :=
- invec(left_index downto arglow);
- else
- result (left_index downto right_index) :=
- invec (left_index downto right_index);
- needs_rounding := (round_style = fixed_round); -- round
- end if;
- end if;
- else -- arghigh <= integer width
- if (arglow >= right_index) then
- result (arghigh downto arglow) := invec;
- else
- result (arghigh downto right_index) :=
- invec (arghigh downto right_index);
- needs_rounding := (round_style = fixed_round); -- round
- end if;
- end if;
- -- Round result
- if needs_rounding then
- result := round_fixed (arg => result,
- remainder => invec (right_index-1
- downto arglow),
- overflow_style => overflow_style);
- end if;
- return result;
- end if;
- end function resize;
-
- function resize (
- arg : UNRESOLVED_sfixed; -- input
- constant left_index : INTEGER; -- integer portion
- constant right_index : INTEGER; -- size of fraction
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_sfixed
- is
- constant arghigh : INTEGER := maximum (arg'high, arg'low);
- constant arglow : INTEGER := mine (arg'high, arg'low);
- variable invec : UNRESOLVED_sfixed (arghigh downto arglow);
- variable result : UNRESOLVED_sfixed(left_index downto right_index) :=
- (others => '0');
- variable reduced : STD_ULOGIC;
- variable needs_rounding : BOOLEAN := false; -- rounding
- begin -- resize
- if (arg'length < 1) or (result'length < 1) then
- return NASF;
- elsif (invec'length < 1) then
- return result; -- string literal value
- else
- invec := cleanvec(arg);
- if (right_index > arghigh) then -- return top zeros
- if (arg'low /= INTEGER'low) then -- check for a literal
- result := (others => arg(arghigh)); -- sign extend
- end if;
- needs_rounding := (round_style = fixed_round) and
- (right_index = arghigh+1);
- elsif (left_index < arglow) then -- return overflow
- if (overflow_style = fixed_saturate) then
- reduced := or (to_sulv(invec));
- if (reduced = '1') then
- if (invec(arghigh) = '0') then
- -- saturate POSITIVE
- result := saturate (result'high, result'low);
- else
- -- saturate negative
- result := not saturate (result'high, result'low);
- end if;
- -- else return 0 (input was 0)
- end if;
- -- else return 0 (wrap)
- end if;
- elsif (arghigh > left_index) then
- if (invec(arghigh) = '0') then
- reduced := or (to_sulv(invec(arghigh-1 downto
- left_index)));
- if overflow_style = fixed_saturate and reduced = '1' then
- -- saturate positive
- result := saturate (result'high, result'low);
- else
- if (right_index > arglow) then
- result := invec (left_index downto right_index);
- needs_rounding := (round_style = fixed_round);
- else
- result (left_index downto arglow) :=
- invec (left_index downto arglow);
- end if;
- end if;
- else
- reduced := and (to_sulv(invec(arghigh-1 downto
- left_index)));
- if overflow_style = fixed_saturate and reduced = '0' then
- result := not saturate (result'high, result'low);
- else
- if (right_index > arglow) then
- result := invec (left_index downto right_index);
- needs_rounding := (round_style = fixed_round);
- else
- result (left_index downto arglow) :=
- invec (left_index downto arglow);
- end if;
- end if;
- end if;
- else -- arghigh <= integer width
- if (arglow >= right_index) then
- result (arghigh downto arglow) := invec;
- else
- result (arghigh downto right_index) :=
- invec (arghigh downto right_index);
- needs_rounding := (round_style = fixed_round); -- round
- end if;
- if (left_index > arghigh) then -- sign extend
- result(left_index downto arghigh+1) := (others => invec(arghigh));
- end if;
- end if;
- -- Round result
- if (needs_rounding) then
- result := round_fixed (arg => result,
- remainder => invec (right_index-1
- downto arglow),
- overflow_style => overflow_style);
- end if;
- return result;
- end if;
- end function resize;
-
- -- size_res functions
- -- These functions compute the size from a passed variable named "size_res"
- -- The only part of this variable used it it's size, it is never passed
- -- to a lower level routine.
- function to_ufixed (
- arg : STD_ULOGIC_VECTOR; -- shifted vector
- size_res : UNRESOLVED_ufixed) -- for size only
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_ufixed (size_res'left downto fw);
- begin
- if (result'length < 1 or arg'length < 1) then
- return NAUF;
- else
- result := to_ufixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low);
- return result;
- end if;
- end function to_ufixed;
-
- function to_sfixed (
- arg : STD_ULOGIC_VECTOR; -- shifted vector
- size_res : UNRESOLVED_sfixed) -- for size only
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_sfixed (size_res'left downto fw);
- begin
- if (result'length < 1 or arg'length < 1) then
- return NASF;
- else
- result := to_sfixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low);
- return result;
- end if;
- end function to_sfixed;
-
- function to_ufixed (
- arg : NATURAL; -- integer
- size_res : UNRESOLVED_ufixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_ufixed (size_res'left downto fw);
- begin
- if (result'length < 1) then
- return NAUF;
- else
- result := to_ufixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function to_ufixed;
-
- function to_sfixed (
- arg : INTEGER; -- integer
- size_res : UNRESOLVED_sfixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_sfixed (size_res'left downto fw);
- begin
- if (result'length < 1) then
- return NASF;
- else
- result := to_sfixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function to_sfixed;
-
- function to_ufixed (
- arg : REAL; -- real
- size_res : UNRESOLVED_ufixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_ufixed (size_res'left downto fw);
- begin
- if (result'length < 1) then
- return NAUF;
- else
- result := to_ufixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- guard_bits => guard_bits,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function to_ufixed;
-
- function to_sfixed (
- arg : REAL; -- real
- size_res : UNRESOLVED_sfixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style;
- constant guard_bits : NATURAL := fixed_guard_bits) -- # of guard bits
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_sfixed (size_res'left downto fw);
- begin
- if (result'length < 1) then
- return NASF;
- else
- result := to_sfixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- guard_bits => guard_bits,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function to_sfixed;
-
- function to_ufixed (
- arg : UNRESOLVED_UNSIGNED; -- unsigned
- size_res : UNRESOLVED_ufixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_ufixed (size_res'left downto fw);
- begin
- if (result'length < 1 or arg'length < 1) then
- return NAUF;
- else
- result := to_ufixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function to_ufixed;
-
- function to_sfixed (
- arg : UNRESOLVED_SIGNED; -- signed
- size_res : UNRESOLVED_sfixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_sfixed (size_res'left downto fw);
- begin
- if (result'length < 1 or arg'length < 1) then
- return NASF;
- else
- result := to_sfixed (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function to_sfixed;
-
- function resize (
- arg : UNRESOLVED_ufixed; -- input
- size_res : UNRESOLVED_ufixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_ufixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_ufixed (size_res'high downto fw);
- begin
- if (result'length < 1 or arg'length < 1) then
- return NAUF;
- else
- result := resize (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function resize;
-
- function resize (
- arg : UNRESOLVED_sfixed; -- input
- size_res : UNRESOLVED_sfixed; -- for size only
- constant overflow_style : fixed_overflow_style_type := fixed_overflow_style;
- constant round_style : fixed_round_style_type := fixed_round_style)
- return UNRESOLVED_sfixed
- is
- constant fw : INTEGER := mine (size_res'low, size_res'low); -- catch literals
- variable result : UNRESOLVED_sfixed (size_res'high downto fw);
- begin
- if (result'length < 1 or arg'length < 1) then
- return NASF;
- else
- result := resize (arg => arg,
- left_index => size_res'high,
- right_index => size_res'low,
- round_style => round_style,
- overflow_style => overflow_style);
- return result;
- end if;
- end function resize;
-
- -- Overloaded math functions for real
- function "+" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return (l + to_ufixed (r, l'high, l'low));
- end function "+";
-
- function "+" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, r'low) + r);
- end function "+";
-
- function "+" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return (l + to_sfixed (r, l'high, l'low));
- end function "+";
-
- function "+" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, r'low) + r);
- end function "+";
-
- function "-" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return (l - to_ufixed (r, l'high, l'low));
- end function "-";
-
- function "-" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, r'low) - r);
- end function "-";
-
- function "-" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return (l - to_sfixed (r, l'high, l'low));
- end function "-";
-
- function "-" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, r'low) - r);
- end function "-";
-
- function "*" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return (l * to_ufixed (r, l'high, l'low));
- end function "*";
-
- function "*" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, r'low) * r);
- end function "*";
-
- function "*" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return (l * to_sfixed (r, l'high, l'low));
- end function "*";
-
- function "*" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, r'low) * r);
- end function "*";
-
- function "/" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return (l / to_ufixed (r, l'high, l'low));
- end function "/";
-
- function "/" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, r'low) / r);
- end function "/";
-
- function "/" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return (l / to_sfixed (r, l'high, l'low));
- end function "/";
-
- function "/" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, r'low) / r);
- end function "/";
-
- function "rem" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return (l rem to_ufixed (r, l'high, l'low));
- end function "rem";
-
- function "rem" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, r'low) rem r);
- end function "rem";
-
- function "rem" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return (l rem to_sfixed (r, l'high, l'low));
- end function "rem";
-
- function "rem" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, r'low) rem r);
- end function "rem";
-
- function "mod" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return (l mod to_ufixed (r, l'high, l'low));
- end function "mod";
-
- function "mod" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, r'low) mod r);
- end function "mod";
-
- function "mod" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return (l mod to_sfixed (r, l'high, l'low));
- end function "mod";
-
- function "mod" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, r'low) mod r);
- end function "mod";
-
- -- Overloaded math functions for integers
- function "+" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return (l + to_ufixed (r, l'high, 0));
- end function "+";
-
- function "+" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, 0) + r);
- end function "+";
-
- function "+" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return (l + to_sfixed (r, l'high, 0));
- end function "+";
-
- function "+" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, 0) + r);
- end function "+";
-
- -- Overloaded functions
- function "-" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return (l - to_ufixed (r, l'high, 0));
- end function "-";
-
- function "-" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, 0) - r);
- end function "-";
-
- function "-" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return (l - to_sfixed (r, l'high, 0));
- end function "-";
-
- function "-" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, 0) - r);
- end function "-";
-
- -- Overloaded functions
- function "*" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return (l * to_ufixed (r, l'high, 0));
- end function "*";
-
- function "*" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, 0) * r);
- end function "*";
-
- function "*" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return (l * to_sfixed (r, l'high, 0));
- end function "*";
-
- function "*" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, 0) * r);
- end function "*";
-
- -- Overloaded functions
- function "/" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return (l / to_ufixed (r, l'high, 0));
- end function "/";
-
- function "/" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, 0) / r);
- end function "/";
-
- function "/" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return (l / to_sfixed (r, l'high, 0));
- end function "/";
-
- function "/" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, 0) / r);
- end function "/";
-
- function "rem" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return (l rem to_ufixed (r, l'high, 0));
- end function "rem";
-
- function "rem" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, 0) rem r);
- end function "rem";
-
- function "rem" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return (l rem to_sfixed (r, l'high, 0));
- end function "rem";
-
- function "rem" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, 0) rem r);
- end function "rem";
-
- function "mod" (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return (l mod to_ufixed (r, l'high, 0));
- end function "mod";
-
- function "mod" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return (to_ufixed (l, r'high, 0) mod r);
- end function "mod";
-
- function "mod" (
- l : UNRESOLVED_sfixed; -- fixed point input
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return (l mod to_sfixed (r, l'high, 0));
- end function "mod";
-
- function "mod" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return UNRESOLVED_sfixed is
- begin
- return (to_sfixed (l, r'high, 0) mod r);
- end function "mod";
-
- -- overloaded ufixed compare functions with integer
- function "=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return BOOLEAN is
- begin
- return (l = to_ufixed (r, l'high, l'low));
- end function "=";
-
- function "/=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return BOOLEAN is
- begin
- return (l /= to_ufixed (r, l'high, l'low));
- end function "/=";
-
- function ">=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return BOOLEAN is
- begin
- return (l >= to_ufixed (r, l'high, l'low));
- end function ">=";
-
- function "<=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return BOOLEAN is
- begin
- return (l <= to_ufixed (r, l'high, l'low));
- end function "<=";
-
- function ">" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return BOOLEAN is
- begin
- return (l > to_ufixed (r, l'high, l'low));
- end function ">";
-
- function "<" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return BOOLEAN is
- begin
- return (l < to_ufixed (r, l'high, l'low));
- end function "<";
-
- function "?=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return STD_ULOGIC is
- begin
- return (l ?= to_ufixed (r, l'high, l'low));
- end function "?=";
-
- function "?/=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return STD_ULOGIC is
- begin
- return (l ?/= to_ufixed (r, l'high, l'low));
- end function "?/=";
-
- function "?>=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return STD_ULOGIC is
- begin
- return (l ?>= to_ufixed (r, l'high, l'low));
- end function "?>=";
-
- function "?<=" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return STD_ULOGIC is
- begin
- return (l ?<= to_ufixed (r, l'high, l'low));
- end function "?<=";
-
- function "?>" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return STD_ULOGIC is
- begin
- return (l ?> to_ufixed (r, l'high, l'low));
- end function "?>";
-
- function "?<" (
- l : UNRESOLVED_ufixed;
- r : NATURAL) -- fixed point input
- return STD_ULOGIC is
- begin
- return (l ?< to_ufixed (r, l'high, l'low));
- end function "?<";
-
- function maximum (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return maximum (l, to_ufixed (r, l'high, l'low));
- end function maximum;
-
- function minimum (
- l : UNRESOLVED_ufixed; -- fixed point input
- r : NATURAL)
- return UNRESOLVED_ufixed is
- begin
- return minimum (l, to_ufixed (r, l'high, l'low));
- end function minimum;
-
- -- NATURAL to ufixed
- function "=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) = r);
- end function "=";
-
- function "/=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) /= r);
- end function "/=";
-
- function ">=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) >= r);
- end function ">=";
-
- function "<=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) <= r);
- end function "<=";
-
- function ">" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) > r);
- end function ">";
-
- function "<" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) < r);
- end function "<";
-
- function "?=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?= r);
- end function "?=";
-
- function "?/=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?/= r);
- end function "?/=";
-
- function "?>=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?>= r);
- end function "?>=";
-
- function "?<=" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?<= r);
- end function "?<=";
-
- function "?>" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?> r);
- end function "?>";
-
- function "?<" (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?< r);
- end function "?<";
-
- function maximum (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return maximum (to_ufixed (l, r'high, r'low), r);
- end function maximum;
-
- function minimum (
- l : NATURAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return minimum (to_ufixed (l, r'high, r'low), r);
- end function minimum;
-
- -- overloaded ufixed compare functions with real
- function "=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l = to_ufixed (r, l'high, l'low));
- end function "=";
-
- function "/=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l /= to_ufixed (r, l'high, l'low));
- end function "/=";
-
- function ">=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l >= to_ufixed (r, l'high, l'low));
- end function ">=";
-
- function "<=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l <= to_ufixed (r, l'high, l'low));
- end function "<=";
-
- function ">" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l > to_ufixed (r, l'high, l'low));
- end function ">";
-
- function "<" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l < to_ufixed (r, l'high, l'low));
- end function "<";
-
- function "?=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?= to_ufixed (r, l'high, l'low));
- end function "?=";
-
- function "?/=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?/= to_ufixed (r, l'high, l'low));
- end function "?/=";
-
- function "?>=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?>= to_ufixed (r, l'high, l'low));
- end function "?>=";
-
- function "?<=" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?<= to_ufixed (r, l'high, l'low));
- end function "?<=";
-
- function "?>" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?> to_ufixed (r, l'high, l'low));
- end function "?>";
-
- function "?<" (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?< to_ufixed (r, l'high, l'low));
- end function "?<";
-
- function maximum (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return maximum (l, to_ufixed (r, l'high, l'low));
- end function maximum;
-
- function minimum (
- l : UNRESOLVED_ufixed;
- r : REAL)
- return UNRESOLVED_ufixed is
- begin
- return minimum (l, to_ufixed (r, l'high, l'low));
- end function minimum;
-
- -- real and ufixed
- function "=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) = r);
- end function "=";
-
- function "/=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) /= r);
- end function "/=";
-
- function ">=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) >= r);
- end function ">=";
-
- function "<=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) <= r);
- end function "<=";
-
- function ">" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) > r);
- end function ">";
-
- function "<" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_ufixed (l, r'high, r'low) < r);
- end function "<";
-
- function "?=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?= r);
- end function "?=";
-
- function "?/=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?/= r);
- end function "?/=";
-
- function "?>=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?>= r);
- end function "?>=";
-
- function "?<=" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?<= r);
- end function "?<=";
-
- function "?>" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?> r);
- end function "?>";
-
- function "?<" (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_ufixed (l, r'high, r'low) ?< r);
- end function "?<";
-
- function maximum (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return maximum (to_ufixed (l, r'high, r'low), r);
- end function maximum;
-
- function minimum (
- l : REAL;
- r : UNRESOLVED_ufixed) -- fixed point input
- return UNRESOLVED_ufixed is
- begin
- return minimum (to_ufixed (l, r'high, r'low), r);
- end function minimum;
-
- -- overloaded sfixed compare functions with integer
- function "=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return BOOLEAN is
- begin
- return (l = to_sfixed (r, l'high, l'low));
- end function "=";
-
- function "/=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return BOOLEAN is
- begin
- return (l /= to_sfixed (r, l'high, l'low));
- end function "/=";
-
- function ">=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return BOOLEAN is
- begin
- return (l >= to_sfixed (r, l'high, l'low));
- end function ">=";
-
- function "<=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return BOOLEAN is
- begin
- return (l <= to_sfixed (r, l'high, l'low));
- end function "<=";
-
- function ">" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return BOOLEAN is
- begin
- return (l > to_sfixed (r, l'high, l'low));
- end function ">";
-
- function "<" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return BOOLEAN is
- begin
- return (l < to_sfixed (r, l'high, l'low));
- end function "<";
-
- function "?=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return STD_ULOGIC is
- begin
- return (l ?= to_sfixed (r, l'high, l'low));
- end function "?=";
-
- function "?/=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return STD_ULOGIC is
- begin
- return (l ?/= to_sfixed (r, l'high, l'low));
- end function "?/=";
-
- function "?>=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return STD_ULOGIC is
- begin
- return (l ?>= to_sfixed (r, l'high, l'low));
- end function "?>=";
-
- function "?<=" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return STD_ULOGIC is
- begin
- return (l ?<= to_sfixed (r, l'high, l'low));
- end function "?<=";
-
- function "?>" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return STD_ULOGIC is
- begin
- return (l ?> to_sfixed (r, l'high, l'low));
- end function "?>";
-
- function "?<" (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return STD_ULOGIC is
- begin
- return (l ?< to_sfixed (r, l'high, l'low));
- end function "?<";
-
- function maximum (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return maximum (l, to_sfixed (r, l'high, l'low));
- end function maximum;
-
- function minimum (
- l : UNRESOLVED_sfixed;
- r : INTEGER)
- return UNRESOLVED_sfixed is
- begin
- return minimum (l, to_sfixed (r, l'high, l'low));
- end function minimum;
-
- -- integer and sfixed
- function "=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) = r);
- end function "=";
-
- function "/=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) /= r);
- end function "/=";
-
- function ">=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) >= r);
- end function ">=";
-
- function "<=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) <= r);
- end function "<=";
-
- function ">" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) > r);
- end function ">";
-
- function "<" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) < r);
- end function "<";
-
- function "?=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?= r);
- end function "?=";
-
- function "?/=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?/= r);
- end function "?/=";
-
- function "?>=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?>= r);
- end function "?>=";
-
- function "?<=" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?<= r);
- end function "?<=";
-
- function "?>" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?> r);
- end function "?>";
-
- function "?<" (
- l : INTEGER;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?< r);
- end function "?<";
-
- function maximum (
- l : INTEGER;
- r : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return maximum (to_sfixed (l, r'high, r'low), r);
- end function maximum;
-
- function minimum (
- l : INTEGER;
- r : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return minimum (to_sfixed (l, r'high, r'low), r);
- end function minimum;
-
- -- overloaded sfixed compare functions with real
- function "=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l = to_sfixed (r, l'high, l'low));
- end function "=";
-
- function "/=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l /= to_sfixed (r, l'high, l'low));
- end function "/=";
-
- function ">=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l >= to_sfixed (r, l'high, l'low));
- end function ">=";
-
- function "<=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l <= to_sfixed (r, l'high, l'low));
- end function "<=";
-
- function ">" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l > to_sfixed (r, l'high, l'low));
- end function ">";
-
- function "<" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return BOOLEAN is
- begin
- return (l < to_sfixed (r, l'high, l'low));
- end function "<";
-
- function "?=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?= to_sfixed (r, l'high, l'low));
- end function "?=";
-
- function "?/=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?/= to_sfixed (r, l'high, l'low));
- end function "?/=";
-
- function "?>=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?>= to_sfixed (r, l'high, l'low));
- end function "?>=";
-
- function "?<=" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?<= to_sfixed (r, l'high, l'low));
- end function "?<=";
-
- function "?>" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?> to_sfixed (r, l'high, l'low));
- end function "?>";
-
- function "?<" (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return STD_ULOGIC is
- begin
- return (l ?< to_sfixed (r, l'high, l'low));
- end function "?<";
-
- function maximum (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return maximum (l, to_sfixed (r, l'high, l'low));
- end function maximum;
-
- function minimum (
- l : UNRESOLVED_sfixed;
- r : REAL)
- return UNRESOLVED_sfixed is
- begin
- return minimum (l, to_sfixed (r, l'high, l'low));
- end function minimum;
-
- -- REAL and sfixed
- function "=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) = r);
- end function "=";
-
- function "/=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) /= r);
- end function "/=";
-
- function ">=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) >= r);
- end function ">=";
-
- function "<=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) <= r);
- end function "<=";
-
- function ">" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) > r);
- end function ">";
-
- function "<" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return BOOLEAN is
- begin
- return (to_sfixed (l, r'high, r'low) < r);
- end function "<";
-
- function "?=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?= r);
- end function "?=";
-
- function "?/=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?/= r);
- end function "?/=";
-
- function "?>=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?>= r);
- end function "?>=";
-
- function "?<=" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?<= r);
- end function "?<=";
-
- function "?>" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?> r);
- end function "?>";
-
- function "?<" (
- l : REAL;
- r : UNRESOLVED_sfixed) -- fixed point input
- return STD_ULOGIC is
- begin
- return (to_sfixed (l, r'high, r'low) ?< r);
- end function "?<";
-
- function maximum (
- l : REAL;
- r : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return maximum (to_sfixed (l, r'high, r'low), r);
- end function maximum;
-
- function minimum (
- l : REAL;
- r : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return minimum (to_sfixed (l, r'high, r'low), r);
- end function minimum;
-
- -- copied from std_logic_textio
- type MVL9plus is ('U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-', error);
- type char_indexed_by_MVL9 is array (STD_ULOGIC) of CHARACTER;
- type MVL9_indexed_by_char is array (CHARACTER) of STD_ULOGIC;
- type MVL9plus_indexed_by_char is array (CHARACTER) of MVL9plus;
-
- constant MVL9_to_char : char_indexed_by_MVL9 := "UX01ZWLH-";
- constant char_to_MVL9 : MVL9_indexed_by_char :=
- ('U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
- 'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-', others => 'U');
- constant char_to_MVL9plus : MVL9plus_indexed_by_char :=
- ('U' => 'U', 'X' => 'X', '0' => '0', '1' => '1', 'Z' => 'Z',
- 'W' => 'W', 'L' => 'L', 'H' => 'H', '-' => '-', others => error);
- constant NBSP : CHARACTER := CHARACTER'val(160); -- space character
- constant NUS : STRING(2 to 1) := (others => ' ');
-
- -- purpose: Skips white space
- procedure skip_whitespace (
- L : inout LINE) is
- variable c : CHARACTER;
- variable left : positive;
- begin
- while L /= null and L.all'length /= 0 loop
- left := L.all'left;
- c := L.all(left);
- if (c = ' ' or c = NBSP or c = HT) then
- read (L, c);
- else
- exit;
- end if;
- end loop;
- end procedure skip_whitespace;
-
- -- purpose: writes fixed point into a line
- procedure write (
- L : inout LINE; -- input line
- VALUE : in UNRESOLVED_ufixed; -- fixed point input
- JUSTIFIED : in SIDE := right;
- FIELD : in WIDTH := 0) is
- variable s : STRING(1 to VALUE'length +1) := (others => ' ');
- variable sindx : INTEGER;
- begin -- function write Example: 0011.1100
- sindx := 1;
- for i in VALUE'high downto VALUE'low loop
- if i = -1 then
- s(sindx) := '.';
- sindx := sindx + 1;
- end if;
- s(sindx) := MVL9_to_char(STD_ULOGIC(VALUE(i)));
- sindx := sindx + 1;
- end loop;
- write(L, s, JUSTIFIED, FIELD);
- end procedure write;
-
- -- purpose: writes fixed point into a line
- procedure write (
- L : inout LINE; -- input line
- VALUE : in UNRESOLVED_sfixed; -- fixed point input
- JUSTIFIED : in SIDE := right;
- FIELD : in WIDTH := 0) is
- variable s : STRING(1 to VALUE'length +1);
- variable sindx : INTEGER;
- begin -- function write Example: 0011.1100
- sindx := 1;
- for i in VALUE'high downto VALUE'low loop
- if i = -1 then
- s(sindx) := '.';
- sindx := sindx + 1;
- end if;
- s(sindx) := MVL9_to_char(STD_ULOGIC(VALUE(i)));
- sindx := sindx + 1;
- end loop;
- write(L, s, JUSTIFIED, FIELD);
- end procedure write;
-
- procedure READ(L : inout LINE;
- VALUE : out UNRESOLVED_ufixed) is
- -- Possible data: 00000.0000000
- -- 000000000000
- variable c : CHARACTER;
- variable readOk : BOOLEAN;
- variable i : INTEGER; -- index variable
- variable mv : ufixed (VALUE'range);
- variable lastu : BOOLEAN := false; -- last character was an "_"
- variable founddot : BOOLEAN := false; -- found a "."
- begin -- READ
- VALUE := (VALUE'range => 'U');
- skip_whitespace (L);
- if VALUE'length > 0 then -- non Null input string
- read (L, c, readOk);
- i := VALUE'high;
- while i >= VALUE'low loop
- if readOk = false then -- Bail out if there was a bad read
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "End of string encountered"
- severity error;
- return;
- elsif c = '_' then
- if i = VALUE'high then
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "String begins with an ""_""" severity error;
- return;
- elsif lastu then
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "Two underscores detected in input string ""__"""
- severity error;
- return;
- else
- lastu := true;
- end if;
- elsif c = '.' then -- binary point
- if founddot then
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "Two binary points found in input string" severity error;
- return;
- elsif i /= -1 then -- Seperator in the wrong spot
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "Decimal point does not match number format "
- severity error;
- return;
- end if;
- founddot := true;
- lastu := false;
- elsif c = ' ' or c = NBSP or c = HT then -- reading done.
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "Short read, Space encounted in input string"
- severity error;
- return;
- elsif char_to_MVL9plus(c) = error then
- report fixed_generic_pkg'instance_name & "READ(ufixed) "
- & "Character '" &
- c & "' read, expected STD_ULOGIC literal."
- severity error;
- return;
- else
- mv(i) := char_to_MVL9(c);
- i := i - 1;
- if i < mv'low then
- VALUE := mv;
- return;
- end if;
- lastu := false;
- end if;
- read(L, c, readOk);
- end loop;
- end if;
- end procedure READ;
-
- procedure READ(L : inout LINE;
- VALUE : out UNRESOLVED_ufixed;
- GOOD : out BOOLEAN) is
- -- Possible data: 00000.0000000
- -- 000000000000
- variable c : CHARACTER;
- variable readOk : BOOLEAN;
- variable mv : ufixed (VALUE'range);
- variable i : INTEGER; -- index variable
- variable lastu : BOOLEAN := false; -- last character was an "_"
- variable founddot : BOOLEAN := false; -- found a "."
- begin -- READ
- VALUE := (VALUE'range => 'U');
- skip_whitespace (L);
- if VALUE'length > 0 then
- read (L, c, readOk);
- i := VALUE'high;
- GOOD := false;
- while i >= VALUE'low loop
- if not readOk then -- Bail out if there was a bad read
- return;
- elsif c = '_' then
- if i = VALUE'high then -- Begins with an "_"
- return;
- elsif lastu then -- "__" detected
- return;
- else
- lastu := true;
- end if;
- elsif c = '.' then -- binary point
- if founddot then
- return;
- elsif i /= -1 then -- Seperator in the wrong spot
- return;
- end if;
- founddot := true;
- lastu := false;
- elsif (char_to_MVL9plus(c) = error) then -- Illegal character/short read
- return;
- else
- mv(i) := char_to_MVL9(c);
- i := i - 1;
- if i < mv'low then -- reading done
- GOOD := true;
- VALUE := mv;
- return;
- end if;
- lastu := false;
- end if;
- read(L, c, readOk);
- end loop;
- else
- GOOD := true; -- read into a null array
- end if;
- end procedure READ;
-
- procedure READ(L : inout LINE;
- VALUE : out UNRESOLVED_sfixed) is
- variable c : CHARACTER;
- variable readOk : BOOLEAN;
- variable i : INTEGER; -- index variable
- variable mv : sfixed (VALUE'range);
- variable lastu : BOOLEAN := false; -- last character was an "_"
- variable founddot : BOOLEAN := false; -- found a "."
- begin -- READ
- VALUE := (VALUE'range => 'U');
- skip_whitespace (L);
- if VALUE'length > 0 then -- non Null input string
- read (L, c, readOk);
- i := VALUE'high;
- while i >= VALUE'low loop
- if readOk = false then -- Bail out if there was a bad read
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "End of string encountered"
- severity error;
- return;
- elsif c = '_' then
- if i = VALUE'high then
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "String begins with an ""_""" severity error;
- return;
- elsif lastu then
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "Two underscores detected in input string ""__"""
- severity error;
- return;
- else
- lastu := true;
- end if;
- elsif c = '.' then -- binary point
- if founddot then
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "Two binary points found in input string" severity error;
- return;
- elsif i /= -1 then -- Seperator in the wrong spot
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "Decimal point does not match number format "
- severity error;
- return;
- end if;
- founddot := true;
- lastu := false;
- elsif c = ' ' or c = NBSP or c = HT then -- reading done.
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "Short read, Space encounted in input string"
- severity error;
- return;
- elsif char_to_MVL9plus(c) = error then
- report fixed_generic_pkg'instance_name & "READ(sfixed) "
- & "Character '" &
- c & "' read, expected STD_ULOGIC literal."
- severity error;
- return;
- else
- mv(i) := char_to_MVL9(c);
- i := i - 1;
- if i < mv'low then
- VALUE := mv;
- return;
- end if;
- lastu := false;
- end if;
- read(L, c, readOk);
- end loop;
- end if;
- end procedure READ;
-
- procedure READ(L : inout LINE;
- VALUE : out UNRESOLVED_sfixed;
- GOOD : out BOOLEAN) is
- variable value_ufixed : UNRESOLVED_ufixed (VALUE'range);
- begin -- READ
- READ (L => L, VALUE => value_ufixed, GOOD => GOOD);
- VALUE := UNRESOLVED_sfixed (value_ufixed);
- end procedure READ;
-
- -- octal read and write
- procedure owrite (
- L : inout LINE; -- input line
- VALUE : in UNRESOLVED_ufixed; -- fixed point input
- JUSTIFIED : in SIDE := right;
- FIELD : in WIDTH := 0) is
- begin -- Example 03.30
- write (L => L,
- VALUE => TO_OSTRING (VALUE),
- JUSTIFIED => JUSTIFIED,
- FIELD => FIELD);
- end procedure owrite;
-
- procedure owrite (
- L : inout LINE; -- input line
- VALUE : in UNRESOLVED_sfixed; -- fixed point input
- JUSTIFIED : in SIDE := right;
- FIELD : in WIDTH := 0) is
- begin -- Example 03.30
- write (L => L,
- VALUE => TO_OSTRING (VALUE),
- JUSTIFIED => JUSTIFIED,
- FIELD => FIELD);
- end procedure owrite;
-
- -- Note that for Octal and Hex read, you can not start with a ".",
- -- the read is for numbers formatted "A.BC". These routines go to
- -- the nearest bounds, so "F.E" will fit into an sfixed (2 downto -3).
- procedure Char2TriBits (C : CHARACTER;
- RESULT : out STD_ULOGIC_VECTOR(2 downto 0);
- GOOD : out BOOLEAN;
- ISSUE_ERROR : in BOOLEAN) is
- begin
- case C is
- when '0' => RESULT := o"0"; GOOD := true;
- when '1' => RESULT := o"1"; GOOD := true;
- when '2' => RESULT := o"2"; GOOD := true;
- when '3' => RESULT := o"3"; GOOD := true;
- when '4' => RESULT := o"4"; GOOD := true;
- when '5' => RESULT := o"5"; GOOD := true;
- when '6' => RESULT := o"6"; GOOD := true;
- when '7' => RESULT := o"7"; GOOD := true;
- when 'Z' => RESULT := "ZZZ"; GOOD := true;
- when 'X' => RESULT := "XXX"; GOOD := true;
- when others =>
- assert not ISSUE_ERROR
- report fixed_generic_pkg'instance_name
- & "OREAD Error: Read a '" & C &
- "', expected an Octal character (0-7)."
- severity error;
- RESULT := "UUU";
- GOOD := false;
- end case;
- end procedure Char2TriBits;
-
- -- purpose: Routines common to the OREAD routines
- procedure OREAD_common (
- L : inout LINE;
- slv : out STD_ULOGIC_VECTOR;
- igood : out BOOLEAN;
- idex : out INTEGER;
- constant bpoint : in INTEGER; -- binary point
- constant message : in BOOLEAN;
- constant smath : in BOOLEAN) is
-
- -- purpose: error message routine
- procedure errmes (
- constant mess : in STRING) is -- error message
- begin
- if message then
- if smath then
- report fixed_generic_pkg'instance_name
- & "OREAD(sfixed) "
- & mess
- severity error;
- else
- report fixed_generic_pkg'instance_name
- & "OREAD(ufixed) "
- & mess
- severity error;
- end if;
- end if;
- end procedure errmes;
- variable xgood : BOOLEAN;
- variable nybble : STD_ULOGIC_VECTOR (2 downto 0); -- 3 bits
- variable c : CHARACTER;
- variable i : INTEGER;
- variable lastu : BOOLEAN := false; -- last character was an "_"
- variable founddot : BOOLEAN := false; -- found a dot.
- begin
- skip_whitespace (L);
- if slv'length > 0 then
- i := slv'high;
- read (L, c, xgood);
- while i > 0 loop
- if xgood = false then
- errmes ("Error: end of string encountered");
- exit;
- elsif c = '_' then
- if i = slv'length then
- errmes ("Error: String begins with an ""_""");
- xgood := false;
- exit;
- elsif lastu then
- errmes ("Error: Two underscores detected in input string ""__""");
- xgood := false;
- exit;
- else
- lastu := true;
- end if;
- elsif (c = '.') then
- if (i + 1 /= bpoint) then
- errmes ("encountered ""."" at wrong index");
- xgood := false;
- exit;
- elsif i = slv'length then
- errmes ("encounted a ""."" at the beginning of the line");
- xgood := false;
- exit;
- elsif founddot then
- errmes ("Two ""."" encounted in input string");
- xgood := false;
- exit;
- end if;
- founddot := true;
- lastu := false;
- else
- Char2TriBits(c, nybble, xgood, message);
- if not xgood then
- exit;
- end if;
- slv (i downto i-2) := nybble;
- i := i - 3;
- lastu := false;
- end if;
- if i > 0 then
- read (L, c, xgood);
- end if;
- end loop;
- idex := i;
- igood := xgood;
- else
- igood := true; -- read into a null array
- idex := -1;
- end if;
- end procedure OREAD_common;
-
- -- Note that for Octal and Hex read, you can not start with a ".",
- -- the read is for numbers formatted "A.BC". These routines go to
- -- the nearest bounds, so "F.E" will fit into an sfixed (2 downto -3).
- procedure OREAD (L : inout LINE;
- VALUE : out UNRESOLVED_ufixed) is
- constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-2)/3)*3;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_ufixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- OREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => true,
- smath => false);
- if igood then -- We did not get another error
- if not ((i = -1) and -- We read everything, and high bits 0
- (or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0')) then
- report fixed_generic_pkg'instance_name
- & "OREAD(ufixed): Vector truncated."
- severity error;
- else
- if (or (slv(VALUE'low-lbv-1 downto 0)) = '1') then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "OREAD(ufixed): Vector truncated"
- severity warning;
- end if;
- valuex := to_ufixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- end if;
- end if;
- end procedure OREAD;
-
- procedure OREAD(L : inout LINE;
- VALUE : out UNRESOLVED_ufixed;
- GOOD : out BOOLEAN) is
- constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-2)/3)*3;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_ufixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- OREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => false,
- smath => false);
- if (igood and -- We did not get another error
- (i = -1) and -- We read everything, and high bits 0
- (or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0')) then
- valuex := to_ufixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- GOOD := true;
- else
- GOOD := false;
- end if;
- end procedure OREAD;
-
- procedure OREAD(L : inout LINE;
- VALUE : out UNRESOLVED_sfixed) is
- constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-2)/3)*3;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_sfixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- OREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => true,
- smath => true);
- if igood then -- We did not get another error
- if not ((i = -1) and -- We read everything
- ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
- or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
- (slv(VALUE'high-lbv) = '1' and
- and (slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'))) then
- report fixed_generic_pkg'instance_name
- & "OREAD(sfixed): Vector truncated."
- severity error;
- else
- if (or (slv(VALUE'low-lbv-1 downto 0)) = '1') then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "OREAD(sfixed): Vector truncated"
- severity warning;
- end if;
- valuex := to_sfixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- end if;
- end if;
- end procedure OREAD;
-
- procedure OREAD(L : inout LINE;
- VALUE : out UNRESOLVED_sfixed;
- GOOD : out BOOLEAN) is
- constant hbv : INTEGER := (((maximum(3, (VALUE'high+1))+2)/3)*3)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-2)/3)*3;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_sfixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- OREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => false,
- smath => true);
- if (igood -- We did not get another error
- and (i = -1) -- We read everything
- and ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
- or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
- (slv(VALUE'high-lbv) = '1' and
- and (slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'))) then
- valuex := to_sfixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- GOOD := true;
- else
- GOOD := false;
- end if;
- end procedure OREAD;
-
- -- hex read and write
- procedure hwrite (
- L : inout LINE; -- input line
- VALUE : in UNRESOLVED_ufixed; -- fixed point input
- JUSTIFIED : in SIDE := right;
- FIELD : in WIDTH := 0) is
- begin -- Example 03.30
- write (L => L,
- VALUE => TO_HSTRING (VALUE),
- JUSTIFIED => JUSTIFIED,
- FIELD => FIELD);
- end procedure hwrite;
-
- -- purpose: writes fixed point into a line
- procedure hwrite (
- L : inout LINE; -- input line
- VALUE : in UNRESOLVED_sfixed; -- fixed point input
- JUSTIFIED : in SIDE := right;
- FIELD : in WIDTH := 0) is
- begin -- Example 03.30
- write (L => L,
- VALUE => TO_HSTRING (VALUE),
- JUSTIFIED => JUSTIFIED,
- FIELD => FIELD);
- end procedure hwrite;
-
- -- Hex Read and Write procedures for STD_ULOGIC_VECTOR.
- -- Modified from the original to be more forgiving.
-
- procedure Char2QuadBits (C : CHARACTER;
- RESULT : out STD_ULOGIC_VECTOR(3 downto 0);
- GOOD : out BOOLEAN;
- ISSUE_ERROR : in BOOLEAN) is
- begin
- case C is
- when '0' => RESULT := x"0"; GOOD := true;
- when '1' => RESULT := x"1"; GOOD := true;
- when '2' => RESULT := x"2"; GOOD := true;
- when '3' => RESULT := x"3"; GOOD := true;
- when '4' => RESULT := x"4"; GOOD := true;
- when '5' => RESULT := x"5"; GOOD := true;
- when '6' => RESULT := x"6"; GOOD := true;
- when '7' => RESULT := x"7"; GOOD := true;
- when '8' => RESULT := x"8"; GOOD := true;
- when '9' => RESULT := x"9"; GOOD := true;
- when 'A' | 'a' => RESULT := x"A"; GOOD := true;
- when 'B' | 'b' => RESULT := x"B"; GOOD := true;
- when 'C' | 'c' => RESULT := x"C"; GOOD := true;
- when 'D' | 'd' => RESULT := x"D"; GOOD := true;
- when 'E' | 'e' => RESULT := x"E"; GOOD := true;
- when 'F' | 'f' => RESULT := x"F"; GOOD := true;
- when 'Z' => RESULT := "ZZZZ"; GOOD := true;
- when 'X' => RESULT := "XXXX"; GOOD := true;
- when others =>
- assert not ISSUE_ERROR
- report fixed_generic_pkg'instance_name
- & "HREAD Error: Read a '" & C &
- "', expected a Hex character (0-F)."
- severity error;
- RESULT := "UUUU";
- GOOD := false;
- end case;
- end procedure Char2QuadBits;
-
- -- purpose: Routines common to the HREAD routines
- procedure HREAD_common (
- L : inout LINE;
- slv : out STD_ULOGIC_VECTOR;
- igood : out BOOLEAN;
- idex : out INTEGER;
- constant bpoint : in INTEGER; -- binary point
- constant message : in BOOLEAN;
- constant smath : in BOOLEAN) is
-
- -- purpose: error message routine
- procedure errmes (
- constant mess : in STRING) is -- error message
- begin
- if message then
- if smath then
- report fixed_generic_pkg'instance_name
- & "HREAD(sfixed) "
- & mess
- severity error;
- else
- report fixed_generic_pkg'instance_name
- & "HREAD(ufixed) "
- & mess
- severity error;
- end if;
- end if;
- end procedure errmes;
- variable xgood : BOOLEAN;
- variable nybble : STD_ULOGIC_VECTOR (3 downto 0); -- 4 bits
- variable c : CHARACTER;
- variable i : INTEGER;
- variable lastu : BOOLEAN := false; -- last character was an "_"
- variable founddot : BOOLEAN := false; -- found a dot.
- begin
- skip_whitespace (L);
- if slv'length > 0 then
- i := slv'high;
- read (L, c, xgood);
- while i > 0 loop
- if xgood = false then
- errmes ("Error: end of string encountered");
- exit;
- elsif c = '_' then
- if i = slv'length then
- errmes ("Error: String begins with an ""_""");
- xgood := false;
- exit;
- elsif lastu then
- errmes ("Error: Two underscores detected in input string ""__""");
- xgood := false;
- exit;
- else
- lastu := true;
- end if;
- elsif (c = '.') then
- if (i + 1 /= bpoint) then
- errmes ("encountered ""."" at wrong index");
- xgood := false;
- exit;
- elsif i = slv'length then
- errmes ("encounted a ""."" at the beginning of the line");
- xgood := false;
- exit;
- elsif founddot then
- errmes ("Two ""."" encounted in input string");
- xgood := false;
- exit;
- end if;
- founddot := true;
- lastu := false;
- else
- Char2QuadBits(c, nybble, xgood, message);
- if not xgood then
- exit;
- end if;
- slv (i downto i-3) := nybble;
- i := i - 4;
- lastu := false;
- end if;
- if i > 0 then
- read (L, c, xgood);
- end if;
- end loop;
- idex := i;
- igood := xgood;
- else
- idex := -1;
- igood := true; -- read null string
- end if;
- end procedure HREAD_common;
-
- procedure HREAD(L : inout LINE;
- VALUE : out UNRESOLVED_ufixed) is
- constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-3)/4)*4;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_ufixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- HREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => true,
- smath => false);
- if igood then
- if not ((i = -1) and -- We read everything, and high bits 0
- (or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0')) then
- report fixed_generic_pkg'instance_name
- & "HREAD(ufixed): Vector truncated."
- severity error;
- else
- if (or (slv(VALUE'low-lbv-1 downto 0)) = '1') then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "HREAD(ufixed): Vector truncated"
- severity warning;
- end if;
- valuex := to_ufixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- end if;
- end if;
- end procedure HREAD;
-
- procedure HREAD(L : inout LINE;
- VALUE : out UNRESOLVED_ufixed;
- GOOD : out BOOLEAN) is
- constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-3)/4)*4;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_ufixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- HREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => false,
- smath => false);
- if (igood and -- We did not get another error
- (i = -1) and -- We read everything, and high bits 0
- (or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0')) then
- valuex := to_ufixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- GOOD := true;
- else
- GOOD := false;
- end if;
- end procedure HREAD;
-
- procedure HREAD(L : inout LINE;
- VALUE : out UNRESOLVED_sfixed) is
- constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-3)/4)*4;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_sfixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- HREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => true,
- smath => true);
- if igood then -- We did not get another error
- if not ((i = -1) -- We read everything
- and ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
- or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
- (slv(VALUE'high-lbv) = '1' and
- and (slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'))) then
- report fixed_generic_pkg'instance_name
- & "HREAD(sfixed): Vector truncated."
- severity error;
- else
- if (or (slv(VALUE'low-lbv-1 downto 0)) = '1') then
- assert no_warning
- report fixed_generic_pkg'instance_name
- & "HREAD(sfixed): Vector truncated"
- severity warning;
- end if;
- valuex := to_sfixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- end if;
- end if;
- end procedure HREAD;
-
- procedure HREAD(L : inout LINE;
- VALUE : out UNRESOLVED_sfixed;
- GOOD : out BOOLEAN) is
- constant hbv : INTEGER := (((maximum(4, (VALUE'high+1))+3)/4)*4)-1;
- constant lbv : INTEGER := ((mine(0, VALUE'low)-3)/4)*4;
- variable slv : STD_ULOGIC_VECTOR (hbv-lbv downto 0); -- high bits
- variable valuex : UNRESOLVED_sfixed (hbv downto lbv);
- variable igood : BOOLEAN;
- variable i : INTEGER;
- begin
- VALUE := (VALUE'range => 'U');
- HREAD_common ( L => L,
- slv => slv,
- igood => igood,
- idex => i,
- bpoint => -lbv,
- message => false,
- smath => true);
- if (igood and -- We did not get another error
- (i = -1) and -- We read everything
- ((slv(VALUE'high-lbv) = '0' and -- sign bits = extra bits
- or (slv(hbv-lbv downto VALUE'high+1-lbv)) = '0') or
- (slv(VALUE'high-lbv) = '1' and
- and (slv(hbv-lbv downto VALUE'high+1-lbv)) = '1'))) then
- valuex := to_sfixed (slv, hbv, lbv);
- VALUE := valuex (VALUE'range);
- GOOD := true;
- else
- GOOD := false;
- end if;
- end procedure HREAD;
-
- -- TO_STRING functions. Useful in "report" statements.
- -- Example: report "result was " & TO_STRING(result);
- function TO_STRING (value : UNRESOLVED_ufixed) return STRING is
- variable s : STRING(1 to value'length +1) := (others => ' ');
- variable subval : UNRESOLVED_ufixed (value'high downto -1);
- variable sindx : INTEGER;
- begin
- if value'length < 1 then
- return NUS;
- else
- if value'high < 0 then
- if value(value'high) = 'Z' then
- return TO_STRING (resize (sfixed(value), 0, value'low));
- else
- return TO_STRING (resize (value, 0, value'low));
- end if;
- elsif value'low >= 0 then
- if Is_X (value(value'low)) then
- subval := (others => value(value'low));
- subval (value'range) := value;
- return TO_STRING(subval);
- else
- return TO_STRING (resize (value, value'high, -1));
- end if;
- else
- sindx := 1;
- for i in value'high downto value'low loop
- if i = -1 then
- s(sindx) := '.';
- sindx := sindx + 1;
- end if;
- s(sindx) := MVL9_to_char(STD_ULOGIC(value(i)));
- sindx := sindx + 1;
- end loop;
- return s;
- end if;
- end if;
- end function TO_STRING;
-
- function TO_STRING (value : UNRESOLVED_sfixed) return STRING is
- variable s : STRING(1 to value'length + 1) := (others => ' ');
- variable subval : UNRESOLVED_sfixed (value'high downto -1);
- variable sindx : INTEGER;
- begin
- if value'length < 1 then
- return NUS;
- else
- if value'high < 0 then
- return TO_STRING (resize (value, 0, value'low));
- elsif value'low >= 0 then
- if Is_X (value(value'low)) then
- subval := (others => value(value'low));
- subval (value'range) := value;
- return TO_STRING(subval);
- else
- return TO_STRING (resize (value, value'high, -1));
- end if;
- else
- sindx := 1;
- for i in value'high downto value'low loop
- if i = -1 then
- s(sindx) := '.';
- sindx := sindx + 1;
- end if;
- s(sindx) := MVL9_to_char(STD_ULOGIC(value(i)));
- sindx := sindx + 1;
- end loop;
- return s;
- end if;
- end if;
- end function TO_STRING;
-
- function TO_OSTRING (value : UNRESOLVED_ufixed) return STRING is
- constant lne : INTEGER := (-value'low+2)/3;
- variable subval : UNRESOLVED_ufixed (value'high downto -3);
- variable lpad : STD_ULOGIC_VECTOR (0 to (lne*3 + value'low) -1);
- variable slv : STD_ULOGIC_VECTOR (value'length-1 downto 0);
- begin
- if value'length < 1 then
- return NUS;
- else
- if value'high < 0 then
- if value(value'high) = 'Z' then
- return TO_OSTRING (resize (sfixed(value), 2, value'low));
- else
- return TO_OSTRING (resize (value, 2, value'low));
- end if;
- elsif value'low >= 0 then
- if Is_X (value(value'low)) then
- subval := (others => value(value'low));
- subval (value'range) := value;
- return TO_OSTRING(subval);
- else
- return TO_OSTRING (resize (value, value'high, -3));
- end if;
- else
- slv := to_sulv (value);
- if Is_X (value (value'low)) then
- lpad := (others => value (value'low));
- else
- lpad := (others => '0');
- end if;
- return TO_OSTRING(slv(slv'high downto slv'high-value'high))
- & "."
- & TO_OSTRING(slv(slv'high-value'high-1 downto 0) & lpad);
- end if;
- end if;
- end function TO_OSTRING;
-
- function TO_HSTRING (value : UNRESOLVED_ufixed) return STRING is
- constant lne : INTEGER := (-value'low+3)/4;
- variable subval : UNRESOLVED_ufixed (value'high downto -4);
- variable lpad : STD_ULOGIC_VECTOR (0 to (lne*4 + value'low) -1);
- variable slv : STD_ULOGIC_VECTOR (value'length-1 downto 0);
- begin
- if value'length < 1 then
- return NUS;
- else
- if value'high < 0 then
- if value(value'high) = 'Z' then
- return TO_HSTRING (resize (sfixed(value), 3, value'low));
- else
- return TO_HSTRING (resize (value, 3, value'low));
- end if;
- elsif value'low >= 0 then
- if Is_X (value(value'low)) then
- subval := (others => value(value'low));
- subval (value'range) := value;
- return TO_HSTRING(subval);
- else
- return TO_HSTRING (resize (value, value'high, -4));
- end if;
- else
- slv := to_sulv (value);
- if Is_X (value (value'low)) then
- lpad := (others => value(value'low));
- else
- lpad := (others => '0');
- end if;
- return TO_HSTRING(slv(slv'high downto slv'high-value'high))
- & "."
- & TO_HSTRING(slv(slv'high-value'high-1 downto 0)&lpad);
- end if;
- end if;
- end function TO_HSTRING;
-
- function TO_OSTRING (value : UNRESOLVED_sfixed) return STRING is
- constant ne : INTEGER := ((value'high+1)+2)/3;
- variable pad : STD_ULOGIC_VECTOR(0 to (ne*3 - (value'high+1)) - 1);
- constant lne : INTEGER := (-value'low+2)/3;
- variable subval : UNRESOLVED_sfixed (value'high downto -3);
- variable lpad : STD_ULOGIC_VECTOR (0 to (lne*3 + value'low) -1);
- variable slv : STD_ULOGIC_VECTOR (value'high - value'low downto 0);
- begin
- if value'length < 1 then
- return NUS;
- else
- if value'high < 0 then
- return TO_OSTRING (resize (value, 2, value'low));
- elsif value'low >= 0 then
- if Is_X (value(value'low)) then
- subval := (others => value(value'low));
- subval (value'range) := value;
- return TO_OSTRING(subval);
- else
- return TO_OSTRING (resize (value, value'high, -3));
- end if;
- else
- pad := (others => value(value'high));
- slv := to_sulv (value);
- if Is_X (value (value'low)) then
- lpad := (others => value(value'low));
- else
- lpad := (others => '0');
- end if;
- return TO_OSTRING(pad & slv(slv'high downto slv'high-value'high))
- & "."
- & TO_OSTRING(slv(slv'high-value'high-1 downto 0) & lpad);
- end if;
- end if;
- end function TO_OSTRING;
-
- function TO_HSTRING (value : UNRESOLVED_sfixed) return STRING is
- constant ne : INTEGER := ((value'high+1)+3)/4;
- variable pad : STD_ULOGIC_VECTOR(0 to (ne*4 - (value'high+1)) - 1);
- constant lne : INTEGER := (-value'low+3)/4;
- variable subval : UNRESOLVED_sfixed (value'high downto -4);
- variable lpad : STD_ULOGIC_VECTOR (0 to (lne*4 + value'low) -1);
- variable slv : STD_ULOGIC_VECTOR (value'length-1 downto 0);
- begin
- if value'length < 1 then
- return NUS;
- else
- if value'high < 0 then
- return TO_HSTRING (resize (value, 3, value'low));
- elsif value'low >= 0 then
- if Is_X (value(value'low)) then
- subval := (others => value(value'low));
- subval (value'range) := value;
- return TO_HSTRING(subval);
- else
- return TO_HSTRING (resize (value, value'high, -4));
- end if;
- else
- slv := to_sulv (value);
- pad := (others => value(value'high));
- if Is_X (value (value'low)) then
- lpad := (others => value(value'low));
- else
- lpad := (others => '0');
- end if;
- return TO_HSTRING(pad & slv(slv'high downto slv'high-value'high))
- & "."
- & TO_HSTRING(slv(slv'high-value'high-1 downto 0) & lpad);
- end if;
- end if;
- end function TO_HSTRING;
-
- -- From string functions allow you to convert a string into a fixed
- -- point number. Example:
- -- signal uf1 : ufixed (3 downto -3);
- -- uf1 <= from_string ("0110.100", uf1'high, uf1'low); -- 6.5
- -- The "." is optional in this syntax, however it exist and is
- -- in the wrong location an error is produced. Overflow will
- -- result in saturation.
- function from_string (
- bstring : STRING; -- binary string
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- variable L : LINE;
- variable good : BOOLEAN;
- begin
- L := new STRING'(bstring);
- READ (L, result, good);
- deallocate (L);
- assert (good)
- report fixed_generic_pkg'instance_name
- & "from_string: Bad string "& bstring severity error;
- return result;
- end function from_string;
-
- -- Octal and hex conversions work as follows:
- -- uf1 <= from_hstring ("6.8", 3, -3); -- 6.5 (bottom zeros dropped)
- -- uf1 <= from_ostring ("06.4", 3, -3); -- 6.5 (top zeros dropped)
- function from_ostring (
- ostring : STRING; -- Octal string
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- variable L : LINE;
- variable good : BOOLEAN;
- begin
- L := new STRING'(ostring);
- OREAD (L, result, good);
- deallocate (L);
- assert (good)
- report fixed_generic_pkg'instance_name
- & "from_ostring: Bad string "& ostring severity error;
- return result;
- end function from_ostring;
-
- function from_hstring (
- hstring : STRING; -- hex string
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_ufixed
- is
- variable result : UNRESOLVED_ufixed (left_index downto right_index);
- variable L : LINE;
- variable good : BOOLEAN;
- begin
- L := new STRING'(hstring);
- HREAD (L, result, good);
- deallocate (L);
- assert (good)
- report fixed_generic_pkg'instance_name
- & "from_hstring: Bad string "& hstring severity error;
- return result;
- end function from_hstring;
-
- function from_string (
- bstring : STRING; -- binary string
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- variable L : LINE;
- variable good : BOOLEAN;
- begin
- L := new STRING'(bstring);
- READ (L, result, good);
- deallocate (L);
- assert (good)
- report fixed_generic_pkg'instance_name
- & "from_string: Bad string "& bstring severity error;
- return result;
- end function from_string;
-
- function from_ostring (
- ostring : STRING; -- Octal string
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- variable L : LINE;
- variable good : BOOLEAN;
- begin
- L := new STRING'(ostring);
- OREAD (L, result, good);
- deallocate (L);
- assert (good)
- report fixed_generic_pkg'instance_name
- & "from_ostring: Bad string "& ostring severity error;
- return result;
- end function from_ostring;
-
- function from_hstring (
- hstring : STRING; -- hex string
- constant left_index : INTEGER;
- constant right_index : INTEGER)
- return UNRESOLVED_sfixed
- is
- variable result : UNRESOLVED_sfixed (left_index downto right_index);
- variable L : LINE;
- variable good : BOOLEAN;
- begin
- L := new STRING'(hstring);
- HREAD (L, result, good);
- deallocate (L);
- assert (good)
- report fixed_generic_pkg'instance_name
- & "from_hstring: Bad string "& hstring severity error;
- return result;
- end function from_hstring;
-
- -- Same as above, "size_res" is used for it's range only.
- function from_string (
- bstring : STRING; -- binary string
- size_res : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed is
- begin
- return from_string (bstring, size_res'high, size_res'low);
- end function from_string;
-
- function from_ostring (
- ostring : STRING; -- Octal string
- size_res : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed is
- begin
- return from_ostring (ostring, size_res'high, size_res'low);
- end function from_ostring;
-
- function from_hstring (
- hstring : STRING; -- hex string
- size_res : UNRESOLVED_ufixed)
- return UNRESOLVED_ufixed is
- begin
- return from_hstring(hstring, size_res'high, size_res'low);
- end function from_hstring;
-
- function from_string (
- bstring : STRING; -- binary string
- size_res : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return from_string (bstring, size_res'high, size_res'low);
- end function from_string;
-
- function from_ostring (
- ostring : STRING; -- Octal string
- size_res : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return from_ostring (ostring, size_res'high, size_res'low);
- end function from_ostring;
-
- function from_hstring (
- hstring : STRING; -- hex string
- size_res : UNRESOLVED_sfixed)
- return UNRESOLVED_sfixed is
- begin
- return from_hstring (hstring, size_res'high, size_res'low);
- end function from_hstring;
-
- -- Direct conversion functions. Example:
- -- signal uf1 : ufixed (3 downto -3);
- -- uf1 <= from_string ("0110.100"); -- 6.5
- -- In this case the "." is not optional, and the size of
- -- the output must match exactly.
- -- purpose: Calculate the string boundaries
- procedure calculate_string_boundry (
- arg : in STRING; -- input string
- left_index : out INTEGER; -- left
- right_index : out INTEGER) is -- right
- -- examples "10001.111" would return +4, -3
- -- "07X.44" would return +2, -2 (then the octal routine would multiply)
- -- "A_B_._C" would return +1, -1 (then the hex routine would multiply)
- alias xarg : STRING (arg'length downto 1) is arg; -- make it downto range
- variable l, r : INTEGER; -- internal indexes
- variable founddot : BOOLEAN := false;
- begin
- if arg'length > 0 then
- l := xarg'high - 1;
- r := 0;
- for i in xarg'range loop
- if xarg(i) = '_' then
- if r = 0 then
- l := l - 1;
- else
- r := r + 1;
- end if;
- elsif xarg(i) = ' ' or xarg(i) = NBSP or xarg(i) = HT then
- report fixed_generic_pkg'instance_name
- & "Found a space in the input STRING " & xarg
- severity error;
- elsif xarg(i) = '.' then
- if founddot then
- report fixed_generic_pkg'instance_name
- & "Found two binary points in input string " & xarg
- severity error;
- else
- l := l - i;
- r := -i + 1;
- founddot := true;
- end if;
- end if;
- end loop;
- left_index := l;
- right_index := r;
- else
- left_index := 0;
- right_index := 0;
- end if;
- end procedure calculate_string_boundry;
-
- -- Direct conversion functions. Example:
- -- signal uf1 : ufixed (3 downto -3);
- -- uf1 <= from_string ("0110.100"); -- 6.5
- -- In this case the "." is not optional, and the size of
- -- the output must match exactly.
- function from_string (
- bstring : STRING) -- binary string
- return UNRESOLVED_ufixed
- is
- variable left_index, right_index : INTEGER;
- begin
- calculate_string_boundry (bstring, left_index, right_index);
- return from_string (bstring, left_index, right_index);
- end function from_string;
-
- -- Direct octal and hex conversion functions. In this case
- -- the string lengths must match. Example:
- -- signal sf1 := sfixed (5 downto -3);
- -- sf1 <= from_ostring ("71.4") -- -6.5
- function from_ostring (
- ostring : STRING) -- Octal string
- return UNRESOLVED_ufixed
- is
- variable left_index, right_index : INTEGER;
- begin
- calculate_string_boundry (ostring, left_index, right_index);
- return from_ostring (ostring, ((left_index+1)*3)-1, right_index*3);
- end function from_ostring;
-
- function from_hstring (
- hstring : STRING) -- hex string
- return UNRESOLVED_ufixed
- is
- variable left_index, right_index : INTEGER;
- begin
- calculate_string_boundry (hstring, left_index, right_index);
- return from_hstring (hstring, ((left_index+1)*4)-1, right_index*4);
- end function from_hstring;
-
- function from_string (
- bstring : STRING) -- binary string
- return UNRESOLVED_sfixed
- is
- variable left_index, right_index : INTEGER;
- begin
- calculate_string_boundry (bstring, left_index, right_index);
- return from_string (bstring, left_index, right_index);
- end function from_string;
-
- function from_ostring (
- ostring : STRING) -- Octal string
- return UNRESOLVED_sfixed
- is
- variable left_index, right_index : INTEGER;
- begin
- calculate_string_boundry (ostring, left_index, right_index);
- return from_ostring (ostring, ((left_index+1)*3)-1, right_index*3);
- end function from_ostring;
-
- function from_hstring (
- hstring : STRING) -- hex string
- return UNRESOLVED_sfixed
- is
- variable left_index, right_index : INTEGER;
- begin
- calculate_string_boundry (hstring, left_index, right_index);
- return from_hstring (hstring, ((left_index+1)*4)-1, right_index*4);
- end function from_hstring;
-
- end package body fixed_generic_pkg;
|