cuddObj.cc 116 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169
  1. /**
  2. @file
  3. @ingroup cplusplus
  4. @brief Functions for the C++ object-oriented encapsulation of CUDD.
  5. @author Fabio Somenzi
  6. @copyright@parblock
  7. Copyright (c) 1995-2015, Regents of the University of Colorado
  8. All rights reserved.
  9. Redistribution and use in source and binary forms, with or without
  10. modification, are permitted provided that the following conditions
  11. are met:
  12. Redistributions of source code must retain the above copyright
  13. notice, this list of conditions and the following disclaimer.
  14. Redistributions in binary form must reproduce the above copyright
  15. notice, this list of conditions and the following disclaimer in the
  16. documentation and/or other materials provided with the distribution.
  17. Neither the name of the University of Colorado nor the names of its
  18. contributors may be used to endorse or promote products derived from
  19. this software without specific prior written permission.
  20. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  22. LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  23. FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  24. COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  25. INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  26. BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  27. LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28. CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  30. ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  31. POSSIBILITY OF SUCH DAMAGE.
  32. @endparblock
  33. */
  34. #include <iostream>
  35. #include <sstream>
  36. #include <cassert>
  37. #include <cstdlib>
  38. #include <cstring>
  39. #include <algorithm>
  40. #include <stdexcept>
  41. #include "epdInt.h"
  42. #include "cuddInt.h"
  43. #include "cuddObj.hh"
  44. using std::cout;
  45. using std::cerr;
  46. using std::ostream;
  47. using std::endl;
  48. using std::hex;
  49. using std::dec;
  50. using std::string;
  51. using std::vector;
  52. using std::sort;
  53. // ---------------------------------------------------------------------------
  54. // Variable declarations
  55. // ---------------------------------------------------------------------------
  56. // ---------------------------------------------------------------------------
  57. // Members of class Capsule
  58. // ---------------------------------------------------------------------------
  59. /**
  60. @brief Class for reference counting of CUDD managers.
  61. @see Cudd DD ABDD ADD BDD ZDD
  62. */
  63. class Capsule {
  64. public:
  65. Capsule(unsigned int numVars, unsigned int numVarsZ,
  66. unsigned int numSlots, unsigned int cacheSize,
  67. unsigned long maxMemory, PFC defaultHandler);
  68. ~Capsule();
  69. #if HAVE_MODERN_CXX == 1
  70. Capsule(Capsule const &) = delete;
  71. Capsule & operator=(Capsule const &) = delete;
  72. #else
  73. private:
  74. Capsule(Capsule const &); // not defined
  75. Capsule & operator=(Capsule const &); // not defined
  76. public:
  77. #endif
  78. DdManager *manager;
  79. PFC errorHandler;
  80. PFC timeoutHandler;
  81. PFC terminationHandler;
  82. std::vector<char *> varnames;
  83. int ref;
  84. bool verbose;
  85. };
  86. Capsule::Capsule(
  87. unsigned int numVars,
  88. unsigned int numVarsZ,
  89. unsigned int numSlots,
  90. unsigned int cacheSize,
  91. unsigned long maxMemory,
  92. PFC defaultHandler)
  93. {
  94. errorHandler = defaultHandler;
  95. timeoutHandler = defaultHandler;
  96. terminationHandler = defaultHandler;
  97. manager = Cudd_Init(numVars, numVarsZ, numSlots, cacheSize, maxMemory);
  98. if (!manager)
  99. errorHandler("Out of memory");
  100. verbose = 0; // initially terse
  101. ref = 1;
  102. } // Capsule::Capsule
  103. Capsule::~Capsule()
  104. {
  105. #ifdef DD_DEBUG
  106. if (manager) {
  107. int retval = Cudd_CheckZeroRef(manager);
  108. if (retval != 0) {
  109. cerr << retval << " unexpected non-zero reference counts" << endl;
  110. } else if (verbose) {
  111. cerr << "All went well" << endl;
  112. }
  113. }
  114. #endif
  115. for (vector<char *>::iterator it = varnames.begin();
  116. it != varnames.end(); ++it) {
  117. delete [] *it;
  118. }
  119. Cudd_Quit(manager);
  120. } // Capsule::~Capsule
  121. // ---------------------------------------------------------------------------
  122. // Members of class DD
  123. // ---------------------------------------------------------------------------
  124. DD::DD() : p(0), node(0) {}
  125. DD::DD(Capsule *cap, DdNode *ddNode) : p(cap), node(ddNode) {
  126. if (node) Cudd_Ref(node);
  127. if (p->verbose) {
  128. cout << "Standard DD constructor for node " << hex << node << dec <<
  129. " ref = " << Cudd_Regular(node)->ref << "\n";
  130. }
  131. } // DD::DD
  132. DD::DD(Cudd const & manager, DdNode *ddNode) : p(manager.p), node(ddNode) {
  133. checkReturnValue(ddNode);
  134. if (node) Cudd_Ref(node);
  135. if (p->verbose) {
  136. cout << "Standard DD constructor for node " << hex << node << dec <<
  137. " ref = " << Cudd_Regular(node)->ref << "\n";
  138. }
  139. } // DD::DD
  140. DD::DD(const DD &from) {
  141. p = from.p;
  142. node = from.node;
  143. if (node) {
  144. Cudd_Ref(node);
  145. if (p->verbose) {
  146. cout << "Copy DD constructor for node " << hex << node << dec <<
  147. " ref = " << Cudd_Regular(node)->ref << "\n";
  148. }
  149. }
  150. } // DD::DD
  151. DD::~DD() {}
  152. inline DdManager *
  153. DD::checkSameManager(
  154. const DD &other) const
  155. {
  156. DdManager *mgr = p->manager;
  157. if (mgr != other.p->manager) {
  158. p->errorHandler("Operands come from different manager.");
  159. }
  160. return mgr;
  161. } // DD::checkSameManager
  162. inline void
  163. DD::checkReturnValue(
  164. const void *result) const
  165. {
  166. if (result == 0) {
  167. DdManager *mgr = p->manager;
  168. Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
  169. switch (errType) {
  170. case CUDD_MEMORY_OUT:
  171. p->errorHandler("Out of memory.");
  172. break;
  173. case CUDD_TOO_MANY_NODES:
  174. break;
  175. case CUDD_MAX_MEM_EXCEEDED:
  176. p->errorHandler("Maximum memory exceeded.");
  177. break;
  178. case CUDD_TIMEOUT_EXPIRED:
  179. {
  180. std::ostringstream msg;
  181. unsigned long lag =
  182. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  183. msg << "Timeout expired. Lag = " << lag << " ms.";
  184. p->timeoutHandler(msg.str());
  185. }
  186. break;
  187. case CUDD_TERMINATION:
  188. {
  189. std::ostringstream msg;
  190. msg << "Terminated.\n";
  191. p->terminationHandler(msg.str());
  192. }
  193. break;
  194. case CUDD_INVALID_ARG:
  195. p->errorHandler("Invalid argument.");
  196. break;
  197. case CUDD_INTERNAL_ERROR:
  198. p->errorHandler("Internal error.");
  199. break;
  200. case CUDD_NO_ERROR:
  201. p->errorHandler("Unexpected error.");
  202. break;
  203. }
  204. }
  205. } // DD::checkReturnValue
  206. inline void
  207. DD::checkReturnValue(
  208. int result,
  209. int expected) const
  210. {
  211. if (result != expected) {
  212. DdManager *mgr = p->manager;
  213. Cudd_ErrorType errType = Cudd_ReadErrorCode(mgr);
  214. switch (errType) {
  215. case CUDD_MEMORY_OUT:
  216. p->errorHandler("Out of memory.");
  217. break;
  218. case CUDD_TOO_MANY_NODES:
  219. break;
  220. case CUDD_MAX_MEM_EXCEEDED:
  221. p->errorHandler("Maximum memory exceeded.");
  222. break;
  223. case CUDD_TIMEOUT_EXPIRED:
  224. {
  225. std::ostringstream msg;
  226. unsigned long lag =
  227. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  228. msg << "Timeout expired. Lag = " << lag << " ms.\n";
  229. p->timeoutHandler(msg.str());
  230. }
  231. break;
  232. case CUDD_TERMINATION:
  233. {
  234. std::ostringstream msg;
  235. msg << "Terminated.\n";
  236. p->terminationHandler(msg.str());
  237. }
  238. break;
  239. case CUDD_INVALID_ARG:
  240. p->errorHandler("Invalid argument.");
  241. break;
  242. case CUDD_INTERNAL_ERROR:
  243. p->errorHandler("Internal error.");
  244. break;
  245. case CUDD_NO_ERROR:
  246. p->errorHandler("Unexpected error.");
  247. break;
  248. }
  249. }
  250. } // DD::checkReturnValue
  251. DdManager *
  252. DD::manager() const
  253. {
  254. return p->manager;
  255. } // DD::manager
  256. DdNode *
  257. DD::getNode() const
  258. {
  259. return node;
  260. } // DD::getNode
  261. DdNode *
  262. DD::getRegularNode() const
  263. {
  264. return Cudd_Regular(node);
  265. } // DD::getRegularNode
  266. int
  267. DD::nodeCount() const
  268. {
  269. return Cudd_DagSize(node);
  270. } // DD::nodeCount
  271. unsigned int
  272. DD::NodeReadIndex() const
  273. {
  274. return Cudd_NodeReadIndex(node);
  275. } // DD::NodeReadIndex
  276. // ---------------------------------------------------------------------------
  277. // Members of class ABDD
  278. // ---------------------------------------------------------------------------
  279. ABDD::ABDD() : DD() {}
  280. ABDD::ABDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {}
  281. ABDD::ABDD(Cudd const & manager, DdNode *bddNode) : DD(manager,bddNode) {}
  282. ABDD::ABDD(const ABDD &from) : DD(from) {}
  283. ABDD::~ABDD() {
  284. if (node) {
  285. Cudd_RecursiveDeref(p->manager,node);
  286. if (p->verbose) {
  287. cout << "ADD/BDD destructor called for node " << hex << dec <<
  288. node << " ref = " << Cudd_Regular(node)->ref << "\n";
  289. }
  290. }
  291. } // ABDD::~ABDD
  292. bool
  293. ABDD::operator==(
  294. const ABDD& other) const
  295. {
  296. checkSameManager(other);
  297. return node == other.node;
  298. } // ABDD::operator==
  299. bool
  300. ABDD::operator!=(
  301. const ABDD& other) const
  302. {
  303. checkSameManager(other);
  304. return node != other.node;
  305. } // ABDD::operator!=
  306. bool
  307. ABDD::IsOne() const
  308. {
  309. return node == Cudd_ReadOne(p->manager);
  310. } // ABDD::IsOne
  311. void
  312. ABDD::print(
  313. int nvars,
  314. int verbosity) const
  315. {
  316. cout.flush();
  317. if (!node) defaultError("empty DD.");
  318. int retval = Cudd_PrintDebug(p->manager,node,nvars,verbosity);
  319. fflush(Cudd_ReadStdout(p->manager));
  320. checkReturnValue(retval);
  321. //if (retval == 0) p->errorHandler("print failed");
  322. } // ABDD::print
  323. void
  324. ABDD::summary(
  325. int nvars,
  326. int mode) const
  327. {
  328. cout.flush();
  329. if (!node) defaultError("empty DD.");
  330. int retval = Cudd_PrintSummary(p->manager,node,nvars,mode);
  331. fflush(Cudd_ReadStdout(p->manager));
  332. checkReturnValue(retval);
  333. } // ABDD::summary
  334. // ---------------------------------------------------------------------------
  335. // Members of class BDD
  336. // ---------------------------------------------------------------------------
  337. BDD::BDD() : ABDD() {}
  338. BDD::BDD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {}
  339. BDD::BDD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {}
  340. BDD::BDD(const BDD &from) : ABDD(from) {}
  341. BDD
  342. BDD::operator=(
  343. const BDD& right)
  344. {
  345. if (this == &right) return *this;
  346. if (right.node) Cudd_Ref(right.node);
  347. if (node) {
  348. Cudd_RecursiveDeref(p->manager,node);
  349. if (p->verbose) {
  350. cout << "BDD dereferencing for node " << hex << node << dec <<
  351. " ref = " << Cudd_Regular(node)->ref << "\n";
  352. }
  353. }
  354. node = right.node;
  355. p = right.p;
  356. if (node && p->verbose) {
  357. cout << "BDD assignment for node " << hex << node << dec <<
  358. " ref = " << Cudd_Regular(node)->ref << "\n";
  359. }
  360. return *this;
  361. } // BDD::operator=
  362. bool
  363. BDD::operator<=(
  364. const BDD& other) const
  365. {
  366. DdManager *mgr = checkSameManager(other);
  367. return Cudd_bddLeq(mgr,node,other.node);
  368. } // BDD::operator<=
  369. bool
  370. BDD::operator>=(
  371. const BDD& other) const
  372. {
  373. DdManager *mgr = checkSameManager(other);
  374. return Cudd_bddLeq(mgr,other.node,node);
  375. } // BDD::operator>=
  376. bool
  377. BDD::operator<(
  378. const BDD& other) const
  379. {
  380. DdManager *mgr = checkSameManager(other);
  381. return node != other.node && Cudd_bddLeq(mgr,node,other.node);
  382. } // BDD::operator<
  383. bool
  384. BDD::operator>(
  385. const BDD& other) const
  386. {
  387. DdManager *mgr = checkSameManager(other);
  388. return node != other.node && Cudd_bddLeq(mgr,other.node,node);
  389. } // BDD::operator>
  390. BDD
  391. BDD::operator!() const
  392. {
  393. return BDD(p, Cudd_Not(node));
  394. } // BDD::operator!
  395. BDD
  396. BDD::operator~() const
  397. {
  398. return BDD(p, Cudd_Not(node));
  399. } // BDD::operator~
  400. BDD
  401. BDD::operator*(
  402. const BDD& other) const
  403. {
  404. DdManager *mgr = checkSameManager(other);
  405. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  406. checkReturnValue(result);
  407. return BDD(p, result);
  408. } // BDD::operator*
  409. BDD
  410. BDD::operator*=(
  411. const BDD& other)
  412. {
  413. DdManager *mgr = checkSameManager(other);
  414. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  415. checkReturnValue(result);
  416. Cudd_Ref(result);
  417. Cudd_RecursiveDeref(mgr,node);
  418. node = result;
  419. return *this;
  420. } // BDD::operator*=
  421. BDD
  422. BDD::operator&(
  423. const BDD& other) const
  424. {
  425. DdManager *mgr = checkSameManager(other);
  426. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  427. checkReturnValue(result);
  428. return BDD(p, result);
  429. } // BDD::operator&
  430. BDD
  431. BDD::operator&=(
  432. const BDD& other)
  433. {
  434. DdManager *mgr = checkSameManager(other);
  435. DdNode *result = Cudd_bddAnd(mgr,node,other.node);
  436. checkReturnValue(result);
  437. Cudd_Ref(result);
  438. Cudd_RecursiveDeref(mgr,node);
  439. node = result;
  440. return *this;
  441. } // BDD::operator&=
  442. BDD
  443. BDD::operator+(
  444. const BDD& other) const
  445. {
  446. DdManager *mgr = checkSameManager(other);
  447. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  448. checkReturnValue(result);
  449. return BDD(p, result);
  450. } // BDD::operator+
  451. BDD
  452. BDD::operator+=(
  453. const BDD& other)
  454. {
  455. DdManager *mgr = checkSameManager(other);
  456. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  457. checkReturnValue(result);
  458. Cudd_Ref(result);
  459. Cudd_RecursiveDeref(mgr,node);
  460. node = result;
  461. return *this;
  462. } // BDD::operator+=
  463. BDD
  464. BDD::operator|(
  465. const BDD& other) const
  466. {
  467. DdManager *mgr = checkSameManager(other);
  468. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  469. checkReturnValue(result);
  470. return BDD(p, result);
  471. } // BDD::operator|
  472. BDD
  473. BDD::operator|=(
  474. const BDD& other)
  475. {
  476. DdManager *mgr = checkSameManager(other);
  477. DdNode *result = Cudd_bddOr(mgr,node,other.node);
  478. checkReturnValue(result);
  479. Cudd_Ref(result);
  480. Cudd_RecursiveDeref(mgr,node);
  481. node = result;
  482. return *this;
  483. } // BDD::operator|=
  484. BDD
  485. BDD::operator^(
  486. const BDD& other) const
  487. {
  488. DdManager *mgr = checkSameManager(other);
  489. DdNode *result = Cudd_bddXor(mgr,node,other.node);
  490. checkReturnValue(result);
  491. return BDD(p, result);
  492. } // BDD::operator^
  493. BDD
  494. BDD::operator^=(
  495. const BDD& other)
  496. {
  497. DdManager *mgr = checkSameManager(other);
  498. DdNode *result = Cudd_bddXor(mgr,node,other.node);
  499. checkReturnValue(result);
  500. Cudd_Ref(result);
  501. Cudd_RecursiveDeref(mgr,node);
  502. node = result;
  503. return *this;
  504. } // BDD::operator^=
  505. BDD
  506. BDD::operator-(
  507. const BDD& other) const
  508. {
  509. DdManager *mgr = checkSameManager(other);
  510. DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
  511. checkReturnValue(result);
  512. return BDD(p, result);
  513. } // BDD::operator-
  514. BDD
  515. BDD::operator-=(
  516. const BDD& other)
  517. {
  518. DdManager *mgr = checkSameManager(other);
  519. DdNode *result = Cudd_bddAnd(mgr,node,Cudd_Not(other.node));
  520. checkReturnValue(result);
  521. Cudd_Ref(result);
  522. Cudd_RecursiveDeref(mgr,node);
  523. node = result;
  524. return *this;
  525. } // BDD::operator-=
  526. ostream & operator<<(ostream & os, BDD const & f)
  527. {
  528. if (!f.node) defaultError("empty DD.");
  529. DdManager *mgr = f.p->manager;
  530. vector<char *> const & vn = f.p->varnames;
  531. char const * const *inames = vn.size() == (size_t) Cudd_ReadSize(mgr) ?
  532. &vn[0] : 0;
  533. char * str = Cudd_FactoredFormString(mgr, f.node, inames);
  534. f.checkReturnValue(str);
  535. os << string(str);
  536. free(str);
  537. return os;
  538. } // operator<<
  539. bool
  540. BDD::IsZero() const
  541. {
  542. return node == Cudd_ReadLogicZero(p->manager);
  543. } // BDD::IsZero
  544. bool
  545. BDD::IsVar() const
  546. {
  547. return Cudd_bddIsVar(p->manager, node);
  548. } // BDD::IsVar
  549. // ---------------------------------------------------------------------------
  550. // Members of class ADD
  551. // ---------------------------------------------------------------------------
  552. ADD::ADD() : ABDD() {}
  553. ADD::ADD(Capsule *cap, DdNode *bddNode) : ABDD(cap,bddNode) {}
  554. ADD::ADD(Cudd const & manager, DdNode *bddNode) : ABDD(manager,bddNode) {}
  555. ADD::ADD(const ADD &from) : ABDD(from) {}
  556. ADD
  557. ADD::operator=(
  558. const ADD& right)
  559. {
  560. if (this == &right) return *this;
  561. if (right.node) Cudd_Ref(right.node);
  562. if (node) {
  563. Cudd_RecursiveDeref(p->manager,node);
  564. }
  565. node = right.node;
  566. p = right.p;
  567. return *this;
  568. } // ADD::operator=
  569. bool
  570. ADD::operator<=(
  571. const ADD& other) const
  572. {
  573. DdManager *mgr = checkSameManager(other);
  574. return Cudd_addLeq(mgr,node,other.node);
  575. } // ADD::operator<=
  576. bool
  577. ADD::operator>=(
  578. const ADD& other) const
  579. {
  580. DdManager *mgr = checkSameManager(other);
  581. return Cudd_addLeq(mgr,other.node,node);
  582. } // ADD::operator>=
  583. bool
  584. ADD::operator<(
  585. const ADD& other) const
  586. {
  587. DdManager *mgr = checkSameManager(other);
  588. return node != other.node && Cudd_addLeq(mgr,node,other.node);
  589. } // ADD::operator<
  590. bool
  591. ADD::operator>(
  592. const ADD& other) const
  593. {
  594. DdManager *mgr = checkSameManager(other);
  595. return node != other.node && Cudd_addLeq(mgr,other.node,node);
  596. } // ADD::operator>
  597. ADD
  598. ADD::operator-() const
  599. {
  600. return ADD(p, Cudd_addNegate(p->manager,node));
  601. } // ADD::operator-
  602. ADD
  603. ADD::operator*(
  604. const ADD& other) const
  605. {
  606. DdManager *mgr = checkSameManager(other);
  607. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  608. checkReturnValue(result);
  609. return ADD(p, result);
  610. } // ADD::operator*
  611. ADD
  612. ADD::operator*=(
  613. const ADD& other)
  614. {
  615. DdManager *mgr = checkSameManager(other);
  616. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  617. checkReturnValue(result);
  618. Cudd_Ref(result);
  619. Cudd_RecursiveDeref(mgr,node);
  620. node = result;
  621. return *this;
  622. } // ADD::operator*=
  623. ADD
  624. ADD::operator+(
  625. const ADD& other) const
  626. {
  627. DdManager *mgr = checkSameManager(other);
  628. DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
  629. checkReturnValue(result);
  630. return ADD(p, result);
  631. } // ADD::operator+
  632. ADD
  633. ADD::operator+=(
  634. const ADD& other)
  635. {
  636. DdManager *mgr = checkSameManager(other);
  637. DdNode *result = Cudd_addApply(mgr,Cudd_addPlus,node,other.node);
  638. checkReturnValue(result);
  639. Cudd_Ref(result);
  640. Cudd_RecursiveDeref(mgr,node);
  641. node = result;
  642. return *this;
  643. } // ADD::operator+=
  644. ADD
  645. ADD::operator-(
  646. const ADD& other) const
  647. {
  648. DdManager *mgr = checkSameManager(other);
  649. DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
  650. checkReturnValue(result);
  651. return ADD(p, result);
  652. } // ADD::operator-
  653. ADD
  654. ADD::operator-=(
  655. const ADD& other)
  656. {
  657. DdManager *mgr = checkSameManager(other);
  658. DdNode *result = Cudd_addApply(mgr,Cudd_addMinus,node,other.node);
  659. checkReturnValue(result);
  660. Cudd_Ref(result);
  661. Cudd_RecursiveDeref(mgr,node);
  662. node = result;
  663. return *this;
  664. } // ADD::operator-=
  665. ADD
  666. ADD::operator~() const
  667. {
  668. return ADD(p, Cudd_addCmpl(p->manager,node));
  669. } // ADD::operator~
  670. ADD
  671. ADD::operator&(
  672. const ADD& other) const
  673. {
  674. DdManager *mgr = checkSameManager(other);
  675. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  676. checkReturnValue(result);
  677. return ADD(p, result);
  678. } // ADD::operator&
  679. ADD
  680. ADD::operator&=(
  681. const ADD& other)
  682. {
  683. DdManager *mgr = checkSameManager(other);
  684. DdNode *result = Cudd_addApply(mgr,Cudd_addTimes,node,other.node);
  685. checkReturnValue(result);
  686. Cudd_Ref(result);
  687. Cudd_RecursiveDeref(mgr,node);
  688. node = result;
  689. return *this;
  690. } // ADD::operator&=
  691. ADD
  692. ADD::operator|(
  693. const ADD& other) const
  694. {
  695. DdManager *mgr = checkSameManager(other);
  696. DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
  697. checkReturnValue(result);
  698. return ADD(p, result);
  699. } // ADD::operator|
  700. ADD
  701. ADD::operator|=(
  702. const ADD& other)
  703. {
  704. DdManager *mgr = checkSameManager(other);
  705. DdNode *result = Cudd_addApply(mgr,Cudd_addOr,node,other.node);
  706. checkReturnValue(result);
  707. Cudd_Ref(result);
  708. Cudd_RecursiveDeref(mgr,node);
  709. node = result;
  710. return *this;
  711. } // ADD::operator|=
  712. bool
  713. ADD::IsZero() const
  714. {
  715. return node == Cudd_ReadZero(p->manager);
  716. } // ADD::IsZero
  717. // ---------------------------------------------------------------------------
  718. // Members of class ZDD
  719. // ---------------------------------------------------------------------------
  720. ZDD::ZDD(Capsule *cap, DdNode *bddNode) : DD(cap,bddNode) {}
  721. ZDD::ZDD() : DD() {}
  722. ZDD::ZDD(const ZDD &from) : DD(from) {}
  723. ZDD::~ZDD() {
  724. if (node) {
  725. Cudd_RecursiveDerefZdd(p->manager,node);
  726. if (p->verbose) {
  727. cout << "ZDD destructor called for node " << hex << node << dec <<
  728. " ref = " << Cudd_Regular(node)->ref << "\n";
  729. }
  730. }
  731. } // ZDD::~ZDD
  732. ZDD
  733. ZDD::operator=(
  734. const ZDD& right)
  735. {
  736. if (this == &right) return *this;
  737. if (right.node) Cudd_Ref(right.node);
  738. if (node) {
  739. Cudd_RecursiveDerefZdd(p->manager,node);
  740. if (p->verbose) {
  741. cout << "ZDD dereferencing for node " << hex << node << dec <<
  742. " ref = " << node->ref << "\n";
  743. }
  744. }
  745. node = right.node;
  746. p = right.p;
  747. if (node && p->verbose) {
  748. cout << "ZDD assignment for node " << hex << node << dec <<
  749. " ref = " << node->ref << "\n";
  750. }
  751. return *this;
  752. } // ZDD::operator=
  753. bool
  754. ZDD::operator==(
  755. const ZDD& other) const
  756. {
  757. checkSameManager(other);
  758. return node == other.node;
  759. } // ZDD::operator==
  760. bool
  761. ZDD::operator!=(
  762. const ZDD& other) const
  763. {
  764. checkSameManager(other);
  765. return node != other.node;
  766. } // ZDD::operator!=
  767. bool
  768. ZDD::operator<=(
  769. const ZDD& other) const
  770. {
  771. DdManager *mgr = checkSameManager(other);
  772. return Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
  773. } // ZDD::operator<=
  774. bool
  775. ZDD::operator>=(
  776. const ZDD& other) const
  777. {
  778. DdManager *mgr = checkSameManager(other);
  779. return Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
  780. } // ZDD::operator>=
  781. bool
  782. ZDD::operator<(
  783. const ZDD& other) const
  784. {
  785. DdManager *mgr = checkSameManager(other);
  786. return node != other.node &&
  787. Cudd_zddDiffConst(mgr,node,other.node) == Cudd_ReadZero(mgr);
  788. } // ZDD::operator<
  789. bool
  790. ZDD::operator>(
  791. const ZDD& other) const
  792. {
  793. DdManager *mgr = checkSameManager(other);
  794. return node != other.node &&
  795. Cudd_zddDiffConst(mgr,other.node,node) == Cudd_ReadZero(mgr);
  796. } // ZDD::operator>
  797. void
  798. ZDD::print(
  799. int nvars,
  800. int verbosity) const
  801. {
  802. cout.flush();
  803. int retval = Cudd_zddPrintDebug(p->manager,node,nvars,verbosity);
  804. fflush(Cudd_ReadStdout(p->manager));
  805. if (retval == 0) p->errorHandler("print failed");
  806. } // ZDD::print
  807. ZDD
  808. ZDD::operator*(
  809. const ZDD& other) const
  810. {
  811. DdManager *mgr = checkSameManager(other);
  812. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  813. checkReturnValue(result);
  814. return ZDD(p, result);
  815. } // ZDD::operator*
  816. ZDD
  817. ZDD::operator*=(
  818. const ZDD& other)
  819. {
  820. DdManager *mgr = checkSameManager(other);
  821. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  822. checkReturnValue(result);
  823. Cudd_Ref(result);
  824. Cudd_RecursiveDerefZdd(mgr,node);
  825. node = result;
  826. return *this;
  827. } // ZDD::operator*=
  828. ZDD
  829. ZDD::operator&(
  830. const ZDD& other) const
  831. {
  832. DdManager *mgr = checkSameManager(other);
  833. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  834. checkReturnValue(result);
  835. return ZDD(p, result);
  836. } // ZDD::operator&
  837. ZDD
  838. ZDD::operator&=(
  839. const ZDD& other)
  840. {
  841. DdManager *mgr = checkSameManager(other);
  842. DdNode *result = Cudd_zddIntersect(mgr,node,other.node);
  843. checkReturnValue(result);
  844. Cudd_Ref(result);
  845. Cudd_RecursiveDerefZdd(mgr,node);
  846. node = result;
  847. return *this;
  848. } // ZDD::operator&=
  849. ZDD
  850. ZDD::operator+(
  851. const ZDD& other) const
  852. {
  853. DdManager *mgr = checkSameManager(other);
  854. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  855. checkReturnValue(result);
  856. return ZDD(p, result);
  857. } // ZDD::operator+
  858. ZDD
  859. ZDD::operator+=(
  860. const ZDD& other)
  861. {
  862. DdManager *mgr = checkSameManager(other);
  863. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  864. checkReturnValue(result);
  865. Cudd_Ref(result);
  866. Cudd_RecursiveDerefZdd(mgr,node);
  867. node = result;
  868. return *this;
  869. } // ZDD::operator+=
  870. ZDD
  871. ZDD::operator|(
  872. const ZDD& other) const
  873. {
  874. DdManager *mgr = checkSameManager(other);
  875. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  876. checkReturnValue(result);
  877. return ZDD(p, result);
  878. } // ZDD::operator|
  879. ZDD
  880. ZDD::operator|=(
  881. const ZDD& other)
  882. {
  883. DdManager *mgr = checkSameManager(other);
  884. DdNode *result = Cudd_zddUnion(mgr,node,other.node);
  885. checkReturnValue(result);
  886. Cudd_Ref(result);
  887. Cudd_RecursiveDerefZdd(mgr,node);
  888. node = result;
  889. return *this;
  890. } // ZDD::operator|=
  891. ZDD
  892. ZDD::operator-(
  893. const ZDD& other) const
  894. {
  895. DdManager *mgr = checkSameManager(other);
  896. DdNode *result = Cudd_zddDiff(mgr,node,other.node);
  897. checkReturnValue(result);
  898. return ZDD(p, result);
  899. } // ZDD::operator-
  900. ZDD
  901. ZDD::operator-=(
  902. const ZDD& other)
  903. {
  904. DdManager *mgr = checkSameManager(other);
  905. DdNode *result = Cudd_zddDiff(mgr,node,other.node);
  906. checkReturnValue(result);
  907. Cudd_Ref(result);
  908. Cudd_RecursiveDerefZdd(mgr,node);
  909. node = result;
  910. return *this;
  911. } // ZDD::operator-=
  912. // ---------------------------------------------------------------------------
  913. // Members of class Cudd
  914. // ---------------------------------------------------------------------------
  915. Cudd::Cudd(
  916. unsigned int numVars,
  917. unsigned int numVarsZ,
  918. unsigned int numSlots,
  919. unsigned int cacheSize,
  920. unsigned long maxMemory,
  921. PFC defaultHandler)
  922. {
  923. p = new Capsule(numVars,numVarsZ,numSlots,cacheSize,maxMemory,defaultHandler);
  924. } // Cudd::Cudd
  925. Cudd::Cudd(
  926. const Cudd& x)
  927. {
  928. p = x.p;
  929. x.p->ref++;
  930. if (p->verbose)
  931. cout << "Cudd Copy Constructor" << endl;
  932. } // Cudd::Cudd
  933. Cudd::~Cudd()
  934. {
  935. if (--p->ref == 0) {
  936. delete p;
  937. }
  938. } // Cudd::~Cudd
  939. DdManager *
  940. Cudd::getManager(void) const
  941. {
  942. return p->manager;
  943. } // Cudd::getManager
  944. void
  945. Cudd::makeVerbose(void) const
  946. {
  947. p->verbose = 1;
  948. } // Cudd::makeVerbose
  949. void
  950. Cudd::makeTerse(void) const
  951. {
  952. p->verbose = 0;
  953. } // Cudd::makeTerse
  954. bool
  955. Cudd::isVerbose(void) const
  956. {
  957. return p->verbose;
  958. } // Cudd::isVerbose
  959. Cudd&
  960. Cudd::operator=(
  961. const Cudd& right)
  962. {
  963. right.p->ref++;
  964. if (--p->ref == 0) { // disconnect self
  965. delete p;
  966. }
  967. p = right.p;
  968. return *this;
  969. } // Cudd::operator=
  970. PFC
  971. Cudd::setHandler(
  972. PFC newHandler) const
  973. {
  974. PFC oldHandler = p->errorHandler;
  975. p->errorHandler = newHandler;
  976. return oldHandler;
  977. } // Cudd::setHandler
  978. PFC
  979. Cudd::getHandler() const
  980. {
  981. return p->errorHandler;
  982. } // Cudd::getHandler
  983. PFC
  984. Cudd::setTimeoutHandler(
  985. PFC newHandler) const
  986. {
  987. PFC oldHandler = p->timeoutHandler;
  988. p->timeoutHandler = newHandler;
  989. return oldHandler;
  990. } // Cudd::setTimeoutHandler
  991. PFC
  992. Cudd::getTimeoutHandler() const
  993. {
  994. return p->timeoutHandler;
  995. } // Cudd::getTimeourHandler
  996. PFC
  997. Cudd::setTerminationHandler(
  998. PFC newHandler) const
  999. {
  1000. PFC oldHandler = p->terminationHandler;
  1001. p->terminationHandler = newHandler;
  1002. return oldHandler;
  1003. } // Cudd::setTerminationHandler
  1004. PFC
  1005. Cudd::getTerminationHandler() const
  1006. {
  1007. return p->terminationHandler;
  1008. } // Cudd::getTerminationHandler
  1009. void
  1010. Cudd::pushVariableName(std::string s) const
  1011. {
  1012. char * cstr = new char[s.length() + 1];
  1013. strcpy(cstr, s.c_str());
  1014. p->varnames.push_back(cstr);
  1015. }
  1016. void
  1017. Cudd::clearVariableNames(void) const
  1018. {
  1019. for (vector<char *>::iterator it = p->varnames.begin();
  1020. it != p->varnames.end(); ++it) {
  1021. delete [] *it;
  1022. }
  1023. p->varnames.clear();
  1024. }
  1025. std::string
  1026. Cudd::getVariableName(size_t i) const
  1027. {
  1028. return std::string(p->varnames.at(i));
  1029. }
  1030. inline void
  1031. Cudd::checkReturnValue(
  1032. const void *result) const
  1033. {
  1034. if (result == 0) {
  1035. if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
  1036. p->errorHandler("Out of memory.");
  1037. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) {
  1038. p->errorHandler("Too many nodes.");
  1039. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) {
  1040. p->errorHandler("Maximum memory exceeded.");
  1041. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) {
  1042. std::ostringstream msg;
  1043. DdManager *mgr = p->manager;
  1044. unsigned long lag =
  1045. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  1046. msg << "Timeout expired. Lag = " << lag << " ms.\n";
  1047. p->timeoutHandler(msg.str());
  1048. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) {
  1049. std::ostringstream msg;
  1050. msg << "Terminated.\n";
  1051. p->terminationHandler(msg.str());
  1052. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) {
  1053. p->errorHandler("Invalid argument.");
  1054. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) {
  1055. p->errorHandler("Internal error.");
  1056. } else {
  1057. p->errorHandler("Unexpected error.");
  1058. }
  1059. }
  1060. } // Cudd::checkReturnValue
  1061. inline void
  1062. Cudd::checkReturnValue(
  1063. const int result) const
  1064. {
  1065. if (result == 0) {
  1066. if (Cudd_ReadErrorCode(p->manager) == CUDD_MEMORY_OUT) {
  1067. p->errorHandler("Out of memory.");
  1068. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TOO_MANY_NODES) {
  1069. p->errorHandler("Too many nodes.");
  1070. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_MAX_MEM_EXCEEDED) {
  1071. p->errorHandler("Maximum memory exceeded.");
  1072. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TIMEOUT_EXPIRED) {
  1073. std::ostringstream msg;
  1074. DdManager *mgr = p->manager;
  1075. unsigned long lag =
  1076. Cudd_ReadElapsedTime(mgr) - Cudd_ReadTimeLimit(mgr);
  1077. msg << "Timeout expired. Lag = " << lag << " ms.\n";
  1078. p->timeoutHandler(msg.str());
  1079. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_TERMINATION) {
  1080. std::ostringstream msg;
  1081. msg << "Terminated.\n";
  1082. p->terminationHandler(msg.str());
  1083. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INVALID_ARG) {
  1084. p->errorHandler("Invalid argument.");
  1085. } else if (Cudd_ReadErrorCode(p->manager) == CUDD_INTERNAL_ERROR) {
  1086. p->errorHandler("Internal error.");
  1087. } else {
  1088. p->errorHandler("Unexpected error.");
  1089. }
  1090. }
  1091. } // Cudd::checkReturnValue
  1092. void
  1093. Cudd::info() const
  1094. {
  1095. cout.flush();
  1096. int retval = Cudd_PrintInfo(p->manager,stdout);
  1097. checkReturnValue(retval);
  1098. } // Cudd::info
  1099. BDD
  1100. Cudd::bddVar() const
  1101. {
  1102. DdNode *result = Cudd_bddNewVar(p->manager);
  1103. checkReturnValue(result);
  1104. return BDD(p, result);
  1105. } // Cudd::bddVar
  1106. BDD
  1107. Cudd::bddVar(
  1108. int index) const
  1109. {
  1110. DdNode *result = Cudd_bddIthVar(p->manager,index);
  1111. checkReturnValue(result);
  1112. return BDD(p, result);
  1113. } // Cudd::bddVar
  1114. BDD
  1115. Cudd::bddOne() const
  1116. {
  1117. DdNode *result = Cudd_ReadOne(p->manager);
  1118. checkReturnValue(result);
  1119. return BDD(p, result);
  1120. } // Cudd::bddOne
  1121. BDD
  1122. Cudd::bddZero() const
  1123. {
  1124. DdNode *result = Cudd_ReadLogicZero(p->manager);
  1125. checkReturnValue(result);
  1126. return BDD(p, result);
  1127. } // Cudd::bddZero
  1128. ADD
  1129. Cudd::addVar() const
  1130. {
  1131. DdNode *result = Cudd_addNewVar(p->manager);
  1132. checkReturnValue(result);
  1133. return ADD(p, result);
  1134. } // Cudd::addVar
  1135. ADD
  1136. Cudd::addVar(
  1137. int index) const
  1138. {
  1139. DdNode *result = Cudd_addIthVar(p->manager,index);
  1140. checkReturnValue(result);
  1141. return ADD(p, result);
  1142. } // Cudd::addVar
  1143. ADD
  1144. Cudd::addOne() const
  1145. {
  1146. DdNode *result = Cudd_ReadOne(p->manager);
  1147. checkReturnValue(result);
  1148. return ADD(p, result);
  1149. } // Cudd::addOne
  1150. ADD
  1151. Cudd::addZero() const
  1152. {
  1153. DdNode *result = Cudd_ReadZero(p->manager);
  1154. checkReturnValue(result);
  1155. return ADD(p, result);
  1156. } // Cudd::addZero
  1157. ADD
  1158. Cudd::constant(
  1159. CUDD_VALUE_TYPE c) const
  1160. {
  1161. DdNode *result = Cudd_addConst(p->manager, c);
  1162. checkReturnValue(result);
  1163. return ADD(p, result);
  1164. } // Cudd::constant
  1165. ADD
  1166. Cudd::plusInfinity() const
  1167. {
  1168. DdNode *result = Cudd_ReadPlusInfinity(p->manager);
  1169. checkReturnValue(result);
  1170. return ADD(p, result);
  1171. } // Cudd::plusInfinity
  1172. ADD
  1173. Cudd::minusInfinity() const
  1174. {
  1175. DdNode *result = Cudd_ReadMinusInfinity(p->manager);
  1176. checkReturnValue(result);
  1177. return ADD(p, result);
  1178. } // Cudd::minusInfinity
  1179. ZDD
  1180. Cudd::zddVar(
  1181. int index) const
  1182. {
  1183. DdNode *result = Cudd_zddIthVar(p->manager,index);
  1184. checkReturnValue(result);
  1185. return ZDD(p, result);
  1186. } // Cudd::zddVar
  1187. ZDD
  1188. Cudd::zddOne(
  1189. int i) const
  1190. {
  1191. DdNode *result = Cudd_ReadZddOne(p->manager,i);
  1192. checkReturnValue(result);
  1193. return ZDD(p, result);
  1194. } // Cudd::zddOne
  1195. ZDD
  1196. Cudd::zddZero() const
  1197. {
  1198. DdNode *result = Cudd_ReadZero(p->manager);
  1199. checkReturnValue(result);
  1200. return ZDD(p, result);
  1201. } // Cudd::zddZero
  1202. void
  1203. defaultError(
  1204. string message)
  1205. {
  1206. throw std::logic_error(message);
  1207. } // defaultError
  1208. // ---------------------------------------------------------------------------
  1209. // All the rest
  1210. // ---------------------------------------------------------------------------
  1211. ADD
  1212. Cudd::addNewVarAtLevel(
  1213. int level) const
  1214. {
  1215. DdNode *result = Cudd_addNewVarAtLevel(p->manager, level);
  1216. checkReturnValue(result);
  1217. return ADD(p, result);
  1218. } // Cudd::addNewVarAtLevel
  1219. BDD
  1220. Cudd::bddNewVarAtLevel(
  1221. int level) const
  1222. {
  1223. DdNode *result = Cudd_bddNewVarAtLevel(p->manager, level);
  1224. checkReturnValue(result);
  1225. return BDD(p, result);
  1226. } // Cudd::bddNewVarAtLevel
  1227. void
  1228. Cudd::zddVarsFromBddVars(
  1229. int multiplicity) const
  1230. {
  1231. int result = Cudd_zddVarsFromBddVars(p->manager, multiplicity);
  1232. checkReturnValue(result);
  1233. } // Cudd::zddVarsFromBddVars
  1234. unsigned long
  1235. Cudd::ReadStartTime() const
  1236. {
  1237. return Cudd_ReadStartTime(p->manager);
  1238. } // Cudd::ReadStartTime
  1239. unsigned long
  1240. Cudd::ReadElapsedTime() const
  1241. {
  1242. return Cudd_ReadElapsedTime(p->manager);
  1243. } // Cudd::ReadElapsedTime
  1244. void
  1245. Cudd::SetStartTime(
  1246. unsigned long st) const
  1247. {
  1248. Cudd_SetStartTime(p->manager, st);
  1249. } // Cudd::SetStartTime
  1250. void
  1251. Cudd::ResetStartTime() const
  1252. {
  1253. Cudd_ResetStartTime(p->manager);
  1254. } // Cudd::ResetStartTime
  1255. unsigned long
  1256. Cudd::ReadTimeLimit() const
  1257. {
  1258. return Cudd_ReadTimeLimit(p->manager);
  1259. } // Cudd::ReadTimeLimit
  1260. unsigned long
  1261. Cudd::SetTimeLimit(
  1262. unsigned long tl) const
  1263. {
  1264. return Cudd_SetTimeLimit(p->manager, tl);
  1265. } // Cudd::SetTimeLimit
  1266. void
  1267. Cudd::UpdateTimeLimit() const
  1268. {
  1269. Cudd_UpdateTimeLimit(p->manager);
  1270. } // Cudd::UpdateTimeLimit
  1271. void
  1272. Cudd::IncreaseTimeLimit(
  1273. unsigned long increase) const
  1274. {
  1275. Cudd_IncreaseTimeLimit(p->manager, increase);
  1276. } // Cudd::IncreaseTimeLimit
  1277. void
  1278. Cudd::UnsetTimeLimit() const
  1279. {
  1280. Cudd_UnsetTimeLimit(p->manager);
  1281. } // Cudd::UnsetTimeLimit
  1282. bool
  1283. Cudd::TimeLimited() const
  1284. {
  1285. return Cudd_TimeLimited(p->manager);
  1286. } // Cudd::TimeLimited
  1287. void
  1288. Cudd::RegisterTerminationCallback(
  1289. DD_THFP callback,
  1290. void * callback_arg) const
  1291. {
  1292. Cudd_RegisterTerminationCallback(p->manager, callback, callback_arg);
  1293. } // Cudd::RegisterTerminationCallback
  1294. void
  1295. Cudd::UnregisterTerminationCallback() const
  1296. {
  1297. Cudd_UnregisterTerminationCallback(p->manager);
  1298. } // Cudd::UnregisterTerminationCallback
  1299. DD_OOMFP
  1300. Cudd::RegisterOutOfMemoryCallback(
  1301. DD_OOMFP callback) const
  1302. {
  1303. return Cudd_RegisterOutOfMemoryCallback(p->manager, callback);
  1304. } // Cudd::RegisterOutOfMemoryCallback
  1305. void
  1306. Cudd::UnregisterOutOfMemoryCallback() const
  1307. {
  1308. Cudd_UnregisterOutOfMemoryCallback(p->manager);
  1309. } // Cudd::UnregisterOutOfMemoryCallback
  1310. void
  1311. Cudd::AutodynEnable(
  1312. Cudd_ReorderingType method) const
  1313. {
  1314. Cudd_AutodynEnable(p->manager, method);
  1315. } // Cudd::AutodynEnable
  1316. void
  1317. Cudd::AutodynDisable() const
  1318. {
  1319. Cudd_AutodynDisable(p->manager);
  1320. } // Cudd::AutodynDisable
  1321. bool
  1322. Cudd::ReorderingStatus(
  1323. Cudd_ReorderingType * method) const
  1324. {
  1325. return Cudd_ReorderingStatus(p->manager, method);
  1326. } // Cudd::ReorderingStatus
  1327. void
  1328. Cudd::AutodynEnableZdd(
  1329. Cudd_ReorderingType method) const
  1330. {
  1331. Cudd_AutodynEnableZdd(p->manager, method);
  1332. } // Cudd::AutodynEnableZdd
  1333. void
  1334. Cudd::AutodynDisableZdd() const
  1335. {
  1336. Cudd_AutodynDisableZdd(p->manager);
  1337. } // Cudd::AutodynDisableZdd
  1338. bool
  1339. Cudd::ReorderingStatusZdd(
  1340. Cudd_ReorderingType * method) const
  1341. {
  1342. return Cudd_ReorderingStatusZdd(p->manager, method);
  1343. } // Cudd::ReorderingStatusZdd
  1344. bool
  1345. Cudd::zddRealignmentEnabled() const
  1346. {
  1347. return Cudd_zddRealignmentEnabled(p->manager);
  1348. } // Cudd::zddRealignmentEnabled
  1349. void
  1350. Cudd::zddRealignEnable() const
  1351. {
  1352. Cudd_zddRealignEnable(p->manager);
  1353. } // Cudd::zddRealignEnable
  1354. void
  1355. Cudd::zddRealignDisable() const
  1356. {
  1357. Cudd_zddRealignDisable(p->manager);
  1358. } // Cudd::zddRealignDisable
  1359. bool
  1360. Cudd::bddRealignmentEnabled() const
  1361. {
  1362. return Cudd_bddRealignmentEnabled(p->manager);
  1363. } // Cudd::bddRealignmentEnabled
  1364. void
  1365. Cudd::bddRealignEnable() const
  1366. {
  1367. Cudd_bddRealignEnable(p->manager);
  1368. } // Cudd::bddRealignEnable
  1369. void
  1370. Cudd::bddRealignDisable() const
  1371. {
  1372. Cudd_bddRealignDisable(p->manager);
  1373. } // Cudd::bddRealignDisable
  1374. ADD
  1375. Cudd::background() const
  1376. {
  1377. DdNode *result = Cudd_ReadBackground(p->manager);
  1378. checkReturnValue(result);
  1379. return ADD(p, result);
  1380. } // Cudd::background
  1381. void
  1382. Cudd::SetBackground(
  1383. ADD bg) const
  1384. {
  1385. DdManager *mgr = p->manager;
  1386. if (mgr != bg.manager()) {
  1387. p->errorHandler("Background comes from different manager.");
  1388. }
  1389. Cudd_SetBackground(mgr, bg.getNode());
  1390. } // Cudd::SetBackground
  1391. unsigned int
  1392. Cudd::ReadCacheSlots() const
  1393. {
  1394. return Cudd_ReadCacheSlots(p->manager);
  1395. } // Cudd::ReadCacheSlots
  1396. double
  1397. Cudd::ReadCacheLookUps() const
  1398. {
  1399. return Cudd_ReadCacheLookUps(p->manager);
  1400. } // Cudd::ReadCacheLookUps
  1401. double
  1402. Cudd::ReadCacheUsedSlots() const
  1403. {
  1404. return Cudd_ReadCacheUsedSlots(p->manager);
  1405. } // Cudd::ReadCacheUsedSlots
  1406. double
  1407. Cudd::ReadCacheHits() const
  1408. {
  1409. return Cudd_ReadCacheHits(p->manager);
  1410. } // Cudd::ReadCacheHits
  1411. unsigned int
  1412. Cudd::ReadMinHit() const
  1413. {
  1414. return Cudd_ReadMinHit(p->manager);
  1415. } // Cudd::ReadMinHit
  1416. void
  1417. Cudd::SetMinHit(
  1418. unsigned int hr) const
  1419. {
  1420. Cudd_SetMinHit(p->manager, hr);
  1421. } // Cudd::SetMinHit
  1422. unsigned int
  1423. Cudd::ReadLooseUpTo() const
  1424. {
  1425. return Cudd_ReadLooseUpTo(p->manager);
  1426. } // Cudd::ReadLooseUpTo
  1427. void
  1428. Cudd::SetLooseUpTo(
  1429. unsigned int lut) const
  1430. {
  1431. Cudd_SetLooseUpTo(p->manager, lut);
  1432. } // Cudd::SetLooseUpTo
  1433. unsigned int
  1434. Cudd::ReadMaxCache() const
  1435. {
  1436. return Cudd_ReadMaxCache(p->manager);
  1437. } // Cudd::ReadMaxCache
  1438. unsigned int
  1439. Cudd::ReadMaxCacheHard() const
  1440. {
  1441. return Cudd_ReadMaxCacheHard(p->manager);
  1442. } // Cudd::ReadMaxCacheHard
  1443. void
  1444. Cudd::SetMaxCacheHard(
  1445. unsigned int mc) const
  1446. {
  1447. Cudd_SetMaxCacheHard(p->manager, mc);
  1448. } // Cudd::SetMaxCacheHard
  1449. int
  1450. Cudd::ReadSize() const
  1451. {
  1452. return Cudd_ReadSize(p->manager);
  1453. } // Cudd::ReadSize
  1454. int
  1455. Cudd::ReadZddSize() const
  1456. {
  1457. return Cudd_ReadZddSize(p->manager);
  1458. } // Cudd::ReadZddSize
  1459. unsigned int
  1460. Cudd::ReadSlots() const
  1461. {
  1462. return Cudd_ReadSlots(p->manager);
  1463. } // Cudd::ReadSlots
  1464. unsigned int
  1465. Cudd::ReadKeys() const
  1466. {
  1467. return Cudd_ReadKeys(p->manager);
  1468. } // Cudd::ReadKeys
  1469. unsigned int
  1470. Cudd::ReadDead() const
  1471. {
  1472. return Cudd_ReadDead(p->manager);
  1473. } // Cudd::ReadDead
  1474. unsigned int
  1475. Cudd::ReadMinDead() const
  1476. {
  1477. return Cudd_ReadMinDead(p->manager);
  1478. } // Cudd::ReadMinDead
  1479. unsigned int
  1480. Cudd::ReadReorderings() const
  1481. {
  1482. return Cudd_ReadReorderings(p->manager);
  1483. } // Cudd::ReadReorderings
  1484. unsigned int
  1485. Cudd::ReadMaxReorderings() const
  1486. {
  1487. return Cudd_ReadMaxReorderings(p->manager);
  1488. } // Cudd::ReadMaxReorderings
  1489. void
  1490. Cudd::SetMaxReorderings(
  1491. unsigned int mr) const
  1492. {
  1493. Cudd_SetMaxReorderings(p->manager, mr);
  1494. } // Cudd::SetMaxReorderings
  1495. long
  1496. Cudd::ReadReorderingTime() const
  1497. {
  1498. return Cudd_ReadReorderingTime(p->manager);
  1499. } // Cudd::ReadReorderingTime
  1500. int
  1501. Cudd::ReadGarbageCollections() const
  1502. {
  1503. return Cudd_ReadGarbageCollections(p->manager);
  1504. } // Cudd::ReadGarbageCollections
  1505. long
  1506. Cudd::ReadGarbageCollectionTime() const
  1507. {
  1508. return Cudd_ReadGarbageCollectionTime(p->manager);
  1509. } // Cudd::ReadGarbageCollectionTime
  1510. int
  1511. Cudd::ReadSiftMaxVar() const
  1512. {
  1513. return Cudd_ReadSiftMaxVar(p->manager);
  1514. } // Cudd::ReadSiftMaxVar
  1515. void
  1516. Cudd::SetSiftMaxVar(
  1517. int smv) const
  1518. {
  1519. Cudd_SetSiftMaxVar(p->manager, smv);
  1520. } // Cudd::SetSiftMaxVar
  1521. int
  1522. Cudd::ReadSiftMaxSwap() const
  1523. {
  1524. return Cudd_ReadSiftMaxSwap(p->manager);
  1525. } // Cudd::ReadSiftMaxSwap
  1526. void
  1527. Cudd::SetSiftMaxSwap(
  1528. int sms) const
  1529. {
  1530. Cudd_SetSiftMaxSwap(p->manager, sms);
  1531. } // Cudd::SetSiftMaxSwap
  1532. double
  1533. Cudd::ReadMaxGrowth() const
  1534. {
  1535. return Cudd_ReadMaxGrowth(p->manager);
  1536. } // Cudd::ReadMaxGrowth
  1537. void
  1538. Cudd::SetMaxGrowth(
  1539. double mg) const
  1540. {
  1541. Cudd_SetMaxGrowth(p->manager, mg);
  1542. } // Cudd::SetMaxGrowth
  1543. MtrNode *
  1544. Cudd::ReadTree() const
  1545. {
  1546. return Cudd_ReadTree(p->manager);
  1547. } // Cudd::ReadTree
  1548. void
  1549. Cudd::SetTree(
  1550. MtrNode * tree) const
  1551. {
  1552. Cudd_SetTree(p->manager, tree);
  1553. } // Cudd::SetTree
  1554. void
  1555. Cudd::FreeTree() const
  1556. {
  1557. Cudd_FreeTree(p->manager);
  1558. } // Cudd::FreeTree
  1559. MtrNode *
  1560. Cudd::ReadZddTree() const
  1561. {
  1562. return Cudd_ReadZddTree(p->manager);
  1563. } // Cudd::ReadZddTree
  1564. void
  1565. Cudd::SetZddTree(
  1566. MtrNode * tree) const
  1567. {
  1568. Cudd_SetZddTree(p->manager, tree);
  1569. } // Cudd::SetZddTree
  1570. void
  1571. Cudd::FreeZddTree() const
  1572. {
  1573. Cudd_FreeZddTree(p->manager);
  1574. } // Cudd::FreeZddTree
  1575. int
  1576. Cudd::ReadPerm(
  1577. int i) const
  1578. {
  1579. return Cudd_ReadPerm(p->manager, i);
  1580. } // Cudd::ReadPerm
  1581. int
  1582. Cudd::ReadPermZdd(
  1583. int i) const
  1584. {
  1585. return Cudd_ReadPermZdd(p->manager, i);
  1586. } // Cudd::ReadPermZdd
  1587. int
  1588. Cudd::ReadInvPerm(
  1589. int i) const
  1590. {
  1591. return Cudd_ReadInvPerm(p->manager, i);
  1592. } // Cudd::ReadInvPerm
  1593. int
  1594. Cudd::ReadInvPermZdd(
  1595. int i) const
  1596. {
  1597. return Cudd_ReadInvPermZdd(p->manager, i);
  1598. } // Cudd::ReadInvPermZdd
  1599. BDD
  1600. Cudd::ReadVars(
  1601. int i) const
  1602. {
  1603. DdNode *result = Cudd_ReadVars(p->manager, i);
  1604. checkReturnValue(result);
  1605. return BDD(p, result);
  1606. } // Cudd::ReadVars
  1607. CUDD_VALUE_TYPE
  1608. Cudd::ReadEpsilon() const
  1609. {
  1610. return Cudd_ReadEpsilon(p->manager);
  1611. } // Cudd::ReadEpsilon
  1612. void
  1613. Cudd::SetEpsilon(
  1614. CUDD_VALUE_TYPE ep) const
  1615. {
  1616. Cudd_SetEpsilon(p->manager, ep);
  1617. } // Cudd::SetEpsilon
  1618. Cudd_AggregationType
  1619. Cudd::ReadGroupcheck() const
  1620. {
  1621. return Cudd_ReadGroupcheck(p->manager);
  1622. } // Cudd::ReadGroupcheck
  1623. void
  1624. Cudd::SetGroupcheck(
  1625. Cudd_AggregationType gc) const
  1626. {
  1627. Cudd_SetGroupcheck(p->manager, gc);
  1628. } // Cudd::SetGroupcheck
  1629. bool
  1630. Cudd::GarbageCollectionEnabled() const
  1631. {
  1632. return Cudd_GarbageCollectionEnabled(p->manager);
  1633. } // Cudd::GarbageCollectionEnabled
  1634. void
  1635. Cudd::EnableGarbageCollection() const
  1636. {
  1637. Cudd_EnableGarbageCollection(p->manager);
  1638. } // Cudd::EnableGarbageCollection
  1639. void
  1640. Cudd::DisableGarbageCollection() const
  1641. {
  1642. Cudd_DisableGarbageCollection(p->manager);
  1643. } // Cudd::DisableGarbageCollection
  1644. bool
  1645. Cudd::DeadAreCounted() const
  1646. {
  1647. return Cudd_DeadAreCounted(p->manager);
  1648. } // Cudd::DeadAreCounted
  1649. void
  1650. Cudd::TurnOnCountDead() const
  1651. {
  1652. Cudd_TurnOnCountDead(p->manager);
  1653. } // Cudd::TurnOnCountDead
  1654. void
  1655. Cudd::TurnOffCountDead() const
  1656. {
  1657. Cudd_TurnOffCountDead(p->manager);
  1658. } // Cudd::TurnOffCountDead
  1659. int
  1660. Cudd::ReadRecomb() const
  1661. {
  1662. return Cudd_ReadRecomb(p->manager);
  1663. } // Cudd::ReadRecomb
  1664. void
  1665. Cudd::SetRecomb(
  1666. int recomb) const
  1667. {
  1668. Cudd_SetRecomb(p->manager, recomb);
  1669. } // Cudd::SetRecomb
  1670. int
  1671. Cudd::ReadSymmviolation() const
  1672. {
  1673. return Cudd_ReadSymmviolation(p->manager);
  1674. } // Cudd::ReadSymmviolation
  1675. void
  1676. Cudd::SetSymmviolation(
  1677. int symmviolation) const
  1678. {
  1679. Cudd_SetSymmviolation(p->manager, symmviolation);
  1680. } // Cudd::SetSymmviolation
  1681. int
  1682. Cudd::ReadArcviolation() const
  1683. {
  1684. return Cudd_ReadArcviolation(p->manager);
  1685. } // Cudd::ReadArcviolation
  1686. void
  1687. Cudd::SetArcviolation(
  1688. int arcviolation) const
  1689. {
  1690. Cudd_SetArcviolation(p->manager, arcviolation);
  1691. } // Cudd::SetArcviolation
  1692. int
  1693. Cudd::ReadPopulationSize() const
  1694. {
  1695. return Cudd_ReadPopulationSize(p->manager);
  1696. } // Cudd::ReadPopulationSize
  1697. void
  1698. Cudd::SetPopulationSize(
  1699. int populationSize) const
  1700. {
  1701. Cudd_SetPopulationSize(p->manager, populationSize);
  1702. } // Cudd::SetPopulationSize
  1703. int
  1704. Cudd::ReadNumberXovers() const
  1705. {
  1706. return Cudd_ReadNumberXovers(p->manager);
  1707. } // Cudd::ReadNumberXovers
  1708. void
  1709. Cudd::SetNumberXovers(
  1710. int numberXovers) const
  1711. {
  1712. Cudd_SetNumberXovers(p->manager, numberXovers);
  1713. } // Cudd::SetNumberXovers
  1714. unsigned int
  1715. Cudd::ReadOrderRandomization() const
  1716. {
  1717. return Cudd_ReadOrderRandomization(p->manager);
  1718. } // Cudd::ReadOrderRandomization
  1719. void
  1720. Cudd::SetOrderRandomization(
  1721. unsigned int factor) const
  1722. {
  1723. Cudd_SetOrderRandomization(p->manager, factor);
  1724. } // Cudd::SetOrderRandomization
  1725. unsigned long
  1726. Cudd::ReadMemoryInUse() const
  1727. {
  1728. return Cudd_ReadMemoryInUse(p->manager);
  1729. } // Cudd::ReadMemoryInUse
  1730. long
  1731. Cudd::ReadPeakNodeCount() const
  1732. {
  1733. return Cudd_ReadPeakNodeCount(p->manager);
  1734. } // Cudd::ReadPeakNodeCount
  1735. long
  1736. Cudd::ReadNodeCount() const
  1737. {
  1738. return Cudd_ReadNodeCount(p->manager);
  1739. } // Cudd::ReadNodeCount
  1740. long
  1741. Cudd::zddReadNodeCount() const
  1742. {
  1743. return Cudd_zddReadNodeCount(p->manager);
  1744. } // Cudd::zddReadNodeCount
  1745. void
  1746. Cudd::AddHook(
  1747. DD_HFP f,
  1748. Cudd_HookType where) const
  1749. {
  1750. int result = Cudd_AddHook(p->manager, f, where);
  1751. checkReturnValue(result);
  1752. } // Cudd::AddHook
  1753. void
  1754. Cudd::RemoveHook(
  1755. DD_HFP f,
  1756. Cudd_HookType where) const
  1757. {
  1758. int result = Cudd_RemoveHook(p->manager, f, where);
  1759. checkReturnValue(result);
  1760. } // Cudd::RemoveHook
  1761. bool
  1762. Cudd::IsInHook(
  1763. DD_HFP f,
  1764. Cudd_HookType where) const
  1765. {
  1766. return Cudd_IsInHook(p->manager, f, where);
  1767. } // Cudd::IsInHook
  1768. void
  1769. Cudd::EnableReorderingReporting() const
  1770. {
  1771. int result = Cudd_EnableReorderingReporting(p->manager);
  1772. checkReturnValue(result);
  1773. } // Cudd::EnableReorderingReporting
  1774. void
  1775. Cudd::DisableReorderingReporting() const
  1776. {
  1777. int result = Cudd_DisableReorderingReporting(p->manager);
  1778. checkReturnValue(result);
  1779. } // Cudd::DisableReorderingReporting
  1780. bool
  1781. Cudd::ReorderingReporting() const
  1782. {
  1783. return Cudd_ReorderingReporting(p->manager);
  1784. } // Cudd::ReorderingReporting
  1785. int
  1786. Cudd::ReadErrorCode() const
  1787. {
  1788. return Cudd_ReadErrorCode(p->manager);
  1789. } // Cudd::ReadErrorCode
  1790. void
  1791. Cudd::ClearErrorCode() const
  1792. {
  1793. Cudd_ClearErrorCode(p->manager);
  1794. } // Cudd::ClearErrorCode
  1795. DD_OOMFP Cudd::InstallOutOfMemoryHandler(DD_OOMFP newHandler) const
  1796. {
  1797. return Cudd_InstallOutOfMemoryHandler(newHandler);
  1798. } // Cudd::InstallOutOfMemoryHandler
  1799. FILE *
  1800. Cudd::ReadStdout() const
  1801. {
  1802. return Cudd_ReadStdout(p->manager);
  1803. } // Cudd::ReadStdout
  1804. void
  1805. Cudd::SetStdout(FILE *fp) const
  1806. {
  1807. Cudd_SetStdout(p->manager, fp);
  1808. } // Cudd::SetStdout
  1809. FILE *
  1810. Cudd::ReadStderr() const
  1811. {
  1812. return Cudd_ReadStderr(p->manager);
  1813. } // Cudd::ReadStderr
  1814. void
  1815. Cudd::SetStderr(FILE *fp) const
  1816. {
  1817. Cudd_SetStderr(p->manager, fp);
  1818. } // Cudd::SetStderr
  1819. unsigned int
  1820. Cudd::ReadNextReordering() const
  1821. {
  1822. return Cudd_ReadNextReordering(p->manager);
  1823. } // Cudd::ReadNextReordering
  1824. void
  1825. Cudd::SetNextReordering(
  1826. unsigned int next) const
  1827. {
  1828. Cudd_SetNextReordering(p->manager, next);
  1829. } // Cudd::SetNextReordering
  1830. double
  1831. Cudd::ReadSwapSteps() const
  1832. {
  1833. return Cudd_ReadSwapSteps(p->manager);
  1834. } // Cudd::ReadSwapSteps
  1835. unsigned int
  1836. Cudd::ReadMaxLive() const
  1837. {
  1838. return Cudd_ReadMaxLive(p->manager);
  1839. } // Cudd::ReadMaxLive
  1840. void
  1841. Cudd::SetMaxLive(unsigned int maxLive) const
  1842. {
  1843. Cudd_SetMaxLive(p->manager, maxLive);
  1844. } // Cudd::SetMaxLive
  1845. size_t
  1846. Cudd::ReadMaxMemory() const
  1847. {
  1848. return Cudd_ReadMaxMemory(p->manager);
  1849. } // Cudd::ReadMaxMemory
  1850. size_t
  1851. Cudd::SetMaxMemory(size_t maxMem) const
  1852. {
  1853. return Cudd_SetMaxMemory(p->manager, maxMem);
  1854. } // Cudd::SetMaxMemory
  1855. int
  1856. Cudd::bddBindVar(int index) const
  1857. {
  1858. return Cudd_bddBindVar(p->manager, index);
  1859. } // Cudd::bddBindVar
  1860. int
  1861. Cudd::bddUnbindVar(int index) const
  1862. {
  1863. return Cudd_bddUnbindVar(p->manager, index);
  1864. } // Cudd::bddUnbindVar
  1865. bool
  1866. Cudd::bddVarIsBound(int index) const
  1867. {
  1868. return Cudd_bddVarIsBound(p->manager, index);
  1869. } // Cudd::bddVarIsBound
  1870. ADD
  1871. ADD::ExistAbstract(
  1872. const ADD& cube) const
  1873. {
  1874. DdManager *mgr = checkSameManager(cube);
  1875. DdNode *result = Cudd_addExistAbstract(mgr, node, cube.node);
  1876. checkReturnValue(result);
  1877. return ADD(p, result);
  1878. } // ADD::ExistAbstract
  1879. ADD
  1880. ADD::UnivAbstract(
  1881. const ADD& cube) const
  1882. {
  1883. DdManager *mgr = checkSameManager(cube);
  1884. DdNode *result = Cudd_addUnivAbstract(mgr, node, cube.node);
  1885. checkReturnValue(result);
  1886. return ADD(p, result);
  1887. } // ADD::UnivAbstract
  1888. ADD
  1889. ADD::OrAbstract(
  1890. const ADD& cube) const
  1891. {
  1892. DdManager *mgr = checkSameManager(cube);
  1893. DdNode *result = Cudd_addOrAbstract(mgr, node, cube.node);
  1894. checkReturnValue(result);
  1895. return ADD(p, result);
  1896. } // ADD::OrAbstract
  1897. ADD
  1898. ADD::Plus(
  1899. const ADD& g) const
  1900. {
  1901. DdManager *mgr = checkSameManager(g);
  1902. DdNode *result = Cudd_addApply(mgr, Cudd_addPlus, node, g.node);
  1903. checkReturnValue(result);
  1904. return ADD(p, result);
  1905. } // ADD::Plus
  1906. ADD
  1907. ADD::Times(
  1908. const ADD& g) const
  1909. {
  1910. DdManager *mgr = checkSameManager(g);
  1911. DdNode *result = Cudd_addApply(mgr, Cudd_addTimes, node, g.node);
  1912. checkReturnValue(result);
  1913. return ADD(p, result);
  1914. } // ADD::Times
  1915. ADD
  1916. ADD::Threshold(
  1917. const ADD& g) const
  1918. {
  1919. DdManager *mgr = checkSameManager(g);
  1920. DdNode *result = Cudd_addApply(mgr, Cudd_addThreshold, node, g.node);
  1921. checkReturnValue(result);
  1922. return ADD(p, result);
  1923. } // ADD::Threshold
  1924. ADD
  1925. ADD::SetNZ(
  1926. const ADD& g) const
  1927. {
  1928. DdManager *mgr = checkSameManager(g);
  1929. DdNode *result = Cudd_addApply(mgr, Cudd_addSetNZ, node, g.node);
  1930. checkReturnValue(result);
  1931. return ADD(p, result);
  1932. } // ADD::SetNZ
  1933. ADD
  1934. ADD::Divide(
  1935. const ADD& g) const
  1936. {
  1937. DdManager *mgr = checkSameManager(g);
  1938. DdNode *result = Cudd_addApply(mgr, Cudd_addDivide, node, g.node);
  1939. checkReturnValue(result);
  1940. return ADD(p, result);
  1941. } // ADD::Divide
  1942. ADD
  1943. ADD::Minus(
  1944. const ADD& g) const
  1945. {
  1946. DdManager *mgr = checkSameManager(g);
  1947. DdNode *result = Cudd_addApply(mgr, Cudd_addMinus, node, g.node);
  1948. checkReturnValue(result);
  1949. return ADD(p, result);
  1950. } // ADD::Minus
  1951. ADD
  1952. ADD::Minimum(
  1953. const ADD& g) const
  1954. {
  1955. DdManager *mgr = checkSameManager(g);
  1956. DdNode *result = Cudd_addApply(mgr, Cudd_addMinimum, node, g.node);
  1957. checkReturnValue(result);
  1958. return ADD(p, result);
  1959. } // ADD::Minimum
  1960. ADD
  1961. ADD::Maximum(
  1962. const ADD& g) const
  1963. {
  1964. DdManager *mgr = checkSameManager(g);
  1965. DdNode *result = Cudd_addApply(mgr, Cudd_addMaximum, node, g.node);
  1966. checkReturnValue(result);
  1967. return ADD(p, result);
  1968. } // ADD::Maximum
  1969. ADD
  1970. ADD::OneZeroMaximum(
  1971. const ADD& g) const
  1972. {
  1973. DdManager *mgr = checkSameManager(g);
  1974. DdNode *result = Cudd_addApply(mgr, Cudd_addOneZeroMaximum, node, g.node);
  1975. checkReturnValue(result);
  1976. return ADD(p, result);
  1977. } // ADD::OneZeroMaximum
  1978. ADD
  1979. ADD::Diff(
  1980. const ADD& g) const
  1981. {
  1982. DdManager *mgr = checkSameManager(g);
  1983. DdNode *result = Cudd_addApply(mgr, Cudd_addDiff, node, g.node);
  1984. checkReturnValue(result);
  1985. return ADD(p, result);
  1986. } // ADD::Diff
  1987. ADD
  1988. ADD::Agreement(
  1989. const ADD& g) const
  1990. {
  1991. DdManager *mgr = checkSameManager(g);
  1992. DdNode *result = Cudd_addApply(mgr, Cudd_addAgreement, node, g.node);
  1993. checkReturnValue(result);
  1994. return ADD(p, result);
  1995. } // ADD::Agreement
  1996. ADD
  1997. ADD::Or(
  1998. const ADD& g) const
  1999. {
  2000. DdManager *mgr = checkSameManager(g);
  2001. DdNode *result = Cudd_addApply(mgr, Cudd_addOr, node, g.node);
  2002. checkReturnValue(result);
  2003. return ADD(p, result);
  2004. } // ADD::Or
  2005. ADD
  2006. ADD::Nand(
  2007. const ADD& g) const
  2008. {
  2009. DdManager *mgr = checkSameManager(g);
  2010. DdNode *result = Cudd_addApply(mgr, Cudd_addNand, node, g.node);
  2011. checkReturnValue(result);
  2012. return ADD(p, result);
  2013. } // ADD::Nand
  2014. ADD
  2015. ADD::Nor(
  2016. const ADD& g) const
  2017. {
  2018. DdManager *mgr = checkSameManager(g);
  2019. DdNode *result = Cudd_addApply(mgr, Cudd_addNor, node, g.node);
  2020. checkReturnValue(result);
  2021. return ADD(p, result);
  2022. } // ADD::Nor
  2023. ADD
  2024. ADD::Xor(
  2025. const ADD& g) const
  2026. {
  2027. DdManager *mgr = checkSameManager(g);
  2028. DdNode *result = Cudd_addApply(mgr, Cudd_addXor, node, g.node);
  2029. checkReturnValue(result);
  2030. return ADD(p, result);
  2031. } // ADD::Xor
  2032. ADD
  2033. ADD::Xnor(
  2034. const ADD& g) const
  2035. {
  2036. DdManager *mgr = checkSameManager(g);
  2037. DdNode *result = Cudd_addApply(mgr, Cudd_addXnor, node, g.node);
  2038. checkReturnValue(result);
  2039. return ADD(p, result);
  2040. } // ADD::Xnor
  2041. ADD
  2042. ADD::Log() const
  2043. {
  2044. DdManager *mgr = p->manager;
  2045. DdNode *result = Cudd_addMonadicApply(mgr, Cudd_addLog, node);
  2046. checkReturnValue(result);
  2047. return ADD(p, result);
  2048. } // ADD::Log
  2049. ADD
  2050. ADD::FindMax() const
  2051. {
  2052. DdManager *mgr = p->manager;
  2053. DdNode *result = Cudd_addFindMax(mgr, node);
  2054. checkReturnValue(result);
  2055. return ADD(p, result);
  2056. } // ADD::FindMax
  2057. ADD
  2058. ADD::FindMin() const
  2059. {
  2060. DdManager *mgr = p->manager;
  2061. DdNode *result = Cudd_addFindMin(mgr, node);
  2062. checkReturnValue(result);
  2063. return ADD(p, result);
  2064. } // ADD::FindMin
  2065. ADD
  2066. ADD::IthBit(
  2067. int bit) const
  2068. {
  2069. DdManager *mgr = p->manager;
  2070. DdNode *result = Cudd_addIthBit(mgr, node, bit);
  2071. checkReturnValue(result);
  2072. return ADD(p, result);
  2073. } // ADD::IthBit
  2074. ADD
  2075. ADD::ScalarInverse(
  2076. const ADD& epsilon) const
  2077. {
  2078. DdManager *mgr = checkSameManager(epsilon);
  2079. DdNode *result = Cudd_addScalarInverse(mgr, node, epsilon.node);
  2080. checkReturnValue(result);
  2081. return ADD(p, result);
  2082. } // ADD::ScalarInverse
  2083. ADD
  2084. ADD::Ite(
  2085. const ADD& g,
  2086. const ADD& h) const
  2087. {
  2088. DdManager *mgr = checkSameManager(g);
  2089. checkSameManager(h);
  2090. DdNode *result = Cudd_addIte(mgr, node, g.node, h.node);
  2091. checkReturnValue(result);
  2092. return ADD(p, result);
  2093. } // ADD::Ite
  2094. ADD
  2095. ADD::IteConstant(
  2096. const ADD& g,
  2097. const ADD& h) const
  2098. {
  2099. DdManager *mgr = checkSameManager(g);
  2100. checkSameManager(h);
  2101. DdNode *result = Cudd_addIteConstant(mgr, node, g.node, h.node);
  2102. checkReturnValue(result);
  2103. return ADD(p, result);
  2104. } // ADD::IteConstant
  2105. ADD
  2106. ADD::EvalConst(
  2107. const ADD& g) const
  2108. {
  2109. DdManager *mgr = checkSameManager(g);
  2110. DdNode *result = Cudd_addEvalConst(mgr, node, g.node);
  2111. checkReturnValue(result);
  2112. return ADD(p, result);
  2113. } // ADD::EvalConst
  2114. bool
  2115. ADD::Leq(
  2116. const ADD& g) const
  2117. {
  2118. DdManager *mgr = checkSameManager(g);
  2119. return Cudd_addLeq(mgr, node, g.node);
  2120. } // ADD::Leq
  2121. ADD
  2122. ADD::Cmpl() const
  2123. {
  2124. DdManager *mgr = p->manager;
  2125. DdNode *result = Cudd_addCmpl(mgr, node);
  2126. checkReturnValue(result);
  2127. return ADD(p, result);
  2128. } // ADD::Cmpl
  2129. ADD
  2130. ADD::Negate() const
  2131. {
  2132. DdManager *mgr = p->manager;
  2133. DdNode *result = Cudd_addNegate(mgr, node);
  2134. checkReturnValue(result);
  2135. return ADD(p, result);
  2136. } // ADD::Negate
  2137. ADD
  2138. ADD::RoundOff(
  2139. int N) const
  2140. {
  2141. DdManager *mgr = p->manager;
  2142. DdNode *result = Cudd_addRoundOff(mgr, node, N);
  2143. checkReturnValue(result);
  2144. return ADD(p, result);
  2145. } // ADD::RoundOff
  2146. ADD
  2147. Cudd::Walsh(
  2148. std::vector<ADD> x,
  2149. std::vector<ADD> y) const
  2150. {
  2151. size_t n = x.size();
  2152. DdNode **X = new DdNode *[n];
  2153. DdNode **Y = new DdNode *[n];
  2154. for (size_t i = 0; i < n; i++) {
  2155. X[i] = x[i].getNode();
  2156. Y[i] = y[i].getNode();
  2157. }
  2158. DdNode *result = Cudd_addWalsh(p->manager, X, Y, (int) n);
  2159. delete [] X;
  2160. delete [] Y;
  2161. checkReturnValue(result);
  2162. return ADD(p, result);
  2163. } // ADD::Walsh
  2164. ADD
  2165. Cudd::addResidue(
  2166. int n,
  2167. int m,
  2168. int options,
  2169. int top) const
  2170. {
  2171. DdNode *result = Cudd_addResidue(p->manager, n, m, options, top);
  2172. checkReturnValue(result);
  2173. return ADD(p, result);
  2174. } // Cudd::addResidue
  2175. BDD
  2176. BDD::AndAbstract(
  2177. const BDD& g,
  2178. const BDD& cube,
  2179. unsigned int limit) const
  2180. {
  2181. DdManager *mgr = checkSameManager(g);
  2182. checkSameManager(cube);
  2183. DdNode *result;
  2184. if (limit == 0)
  2185. result = Cudd_bddAndAbstract(mgr, node, g.node, cube.node);
  2186. else
  2187. result = Cudd_bddAndAbstractLimit(mgr, node, g.node,
  2188. cube.node, limit);
  2189. checkReturnValue(result);
  2190. return BDD(p, result);
  2191. } // BDD::AndAbstract
  2192. int
  2193. Cudd::ApaNumberOfDigits(
  2194. int binaryDigits) const
  2195. {
  2196. return Cudd_ApaNumberOfDigits(binaryDigits);
  2197. } // Cudd::ApaNumberOfDigits
  2198. DdApaNumber
  2199. Cudd::NewApaNumber(
  2200. int digits) const
  2201. {
  2202. return Cudd_NewApaNumber(digits);
  2203. } // Cudd::NewApaNumber
  2204. void
  2205. Cudd::ApaCopy(
  2206. int digits,
  2207. DdApaNumber source,
  2208. DdApaNumber dest) const
  2209. {
  2210. Cudd_ApaCopy(digits, source, dest);
  2211. } // Cudd::ApaCopy
  2212. DdApaDigit
  2213. Cudd::ApaAdd(
  2214. int digits,
  2215. DdApaNumber a,
  2216. DdApaNumber b,
  2217. DdApaNumber sum) const
  2218. {
  2219. return Cudd_ApaAdd(digits, a, b, sum);
  2220. } // Cudd::ApaAdd
  2221. DdApaDigit
  2222. Cudd::ApaSubtract(
  2223. int digits,
  2224. DdApaNumber a,
  2225. DdApaNumber b,
  2226. DdApaNumber diff) const
  2227. {
  2228. return Cudd_ApaSubtract(digits, a, b, diff);
  2229. } // Cudd::ApaSubtract
  2230. DdApaDigit
  2231. Cudd::ApaShortDivision(
  2232. int digits,
  2233. DdApaNumber dividend,
  2234. DdApaDigit divisor,
  2235. DdApaNumber quotient) const
  2236. {
  2237. return Cudd_ApaShortDivision(digits, dividend, divisor, quotient);
  2238. } // Cudd::ApaShortDivision
  2239. void
  2240. Cudd::ApaShiftRight(
  2241. int digits,
  2242. DdApaDigit in,
  2243. DdApaNumber a,
  2244. DdApaNumber b) const
  2245. {
  2246. Cudd_ApaShiftRight(digits, in, a, b);
  2247. } // Cudd::ApaShiftRight
  2248. void
  2249. Cudd::ApaSetToLiteral(
  2250. int digits,
  2251. DdApaNumber number,
  2252. DdApaDigit literal) const
  2253. {
  2254. Cudd_ApaSetToLiteral(digits, number, literal);
  2255. } // Cudd::ApaSetToLiteral
  2256. void
  2257. Cudd::ApaPowerOfTwo(
  2258. int digits,
  2259. DdApaNumber number,
  2260. int power) const
  2261. {
  2262. Cudd_ApaPowerOfTwo(digits, number, power);
  2263. } // Cudd::ApaPowerOfTwo
  2264. void
  2265. Cudd::ApaPrintHex(
  2266. int digits,
  2267. DdApaNumber number,
  2268. FILE * fp) const
  2269. {
  2270. cout.flush();
  2271. int result = Cudd_ApaPrintHex(fp, digits, number);
  2272. checkReturnValue(result);
  2273. } // Cudd::ApaPrintHex
  2274. void
  2275. Cudd::ApaPrintDecimal(
  2276. int digits,
  2277. DdApaNumber number,
  2278. FILE * fp) const
  2279. {
  2280. cout.flush();
  2281. int result = Cudd_ApaPrintDecimal(fp, digits, number);
  2282. checkReturnValue(result);
  2283. } // Cudd::ApaPrintDecimal
  2284. std::string
  2285. Cudd::ApaStringDecimal(
  2286. int digits,
  2287. DdApaNumber number) const
  2288. {
  2289. char * result = Cudd_ApaStringDecimal(digits, number);
  2290. checkReturnValue(result);
  2291. std::string ret = std::string(result);
  2292. free(result);
  2293. return ret;
  2294. } // Cudd::ApaStringDecimal
  2295. void
  2296. Cudd::ApaPrintExponential(
  2297. int digits,
  2298. DdApaNumber number,
  2299. int precision,
  2300. FILE * fp) const
  2301. {
  2302. cout.flush();
  2303. int result = Cudd_ApaPrintExponential(fp, digits, number, precision);
  2304. checkReturnValue(result);
  2305. } // Cudd::ApaPrintExponential
  2306. DdApaNumber
  2307. ABDD::ApaCountMinterm(
  2308. int nvars,
  2309. int * digits) const
  2310. {
  2311. DdManager *mgr = p->manager;
  2312. return Cudd_ApaCountMinterm(mgr, node, nvars, digits);
  2313. } // ABDD::ApaCountMinterm
  2314. void
  2315. ABDD::ApaPrintMinterm(
  2316. int nvars,
  2317. FILE * fp) const
  2318. {
  2319. cout.flush();
  2320. DdManager *mgr = p->manager;
  2321. int result = Cudd_ApaPrintMinterm(fp, mgr, node, nvars);
  2322. checkReturnValue(result);
  2323. } // ABDD::ApaPrintMinterm
  2324. void
  2325. ABDD::ApaPrintMintermExp(
  2326. int nvars,
  2327. int precision,
  2328. FILE * fp) const
  2329. {
  2330. cout.flush();
  2331. DdManager *mgr = p->manager;
  2332. int result = Cudd_ApaPrintMintermExp(fp, mgr, node, nvars, precision);
  2333. checkReturnValue(result);
  2334. } // ABDD::ApaPrintMintermExp
  2335. void
  2336. ABDD::EpdPrintMinterm(
  2337. int nvars,
  2338. FILE * fp) const
  2339. {
  2340. EpDouble count;
  2341. char str[24];
  2342. cout.flush();
  2343. DdManager *mgr = p->manager;
  2344. int result = Cudd_EpdCountMinterm(mgr, node, nvars, &count);
  2345. checkReturnValue(result,0);
  2346. EpdGetString(&count, str);
  2347. fprintf(fp, "%s", str);
  2348. } // ABDD::EpdPrintMinterm
  2349. long double
  2350. ABDD::LdblCountMinterm(
  2351. int nvars) const
  2352. {
  2353. cout.flush();
  2354. DdManager *mgr = p->manager;
  2355. long double result = Cudd_LdblCountMinterm(mgr, node, nvars);
  2356. checkReturnValue(result != (long double) CUDD_OUT_OF_MEM);
  2357. return result;
  2358. } // ABDD::LdblCountMinterm
  2359. BDD
  2360. BDD::UnderApprox(
  2361. int numVars,
  2362. int threshold,
  2363. bool safe,
  2364. double quality) const
  2365. {
  2366. DdManager *mgr = p->manager;
  2367. DdNode *result = Cudd_UnderApprox(mgr, node, numVars, threshold, safe, quality);
  2368. checkReturnValue(result);
  2369. return BDD(p, result);
  2370. } // BDD::UnderApprox
  2371. BDD
  2372. BDD::OverApprox(
  2373. int numVars,
  2374. int threshold,
  2375. bool safe,
  2376. double quality) const
  2377. {
  2378. DdManager *mgr = p->manager;
  2379. DdNode *result = Cudd_OverApprox(mgr, node, numVars, threshold, safe, quality);
  2380. checkReturnValue(result);
  2381. return BDD(p, result);
  2382. } // BDD::OverApprox
  2383. BDD
  2384. BDD::RemapUnderApprox(
  2385. int numVars,
  2386. int threshold,
  2387. double quality) const
  2388. {
  2389. DdManager *mgr = p->manager;
  2390. DdNode *result = Cudd_RemapUnderApprox(mgr, node, numVars, threshold, quality);
  2391. checkReturnValue(result);
  2392. return BDD(p, result);
  2393. } // BDD::RemapUnderApprox
  2394. BDD
  2395. BDD::RemapOverApprox(
  2396. int numVars,
  2397. int threshold,
  2398. double quality) const
  2399. {
  2400. DdManager *mgr = p->manager;
  2401. DdNode *result = Cudd_RemapOverApprox(mgr, node, numVars, threshold, quality);
  2402. checkReturnValue(result);
  2403. return BDD(p, result);
  2404. } // BDD::RemapOverApprox
  2405. BDD
  2406. BDD::BiasedUnderApprox(
  2407. const BDD& bias,
  2408. int numVars,
  2409. int threshold,
  2410. double quality1,
  2411. double quality0) const
  2412. {
  2413. DdManager *mgr = p->manager;
  2414. DdNode *result = Cudd_BiasedUnderApprox(mgr, node, bias.node, numVars,
  2415. threshold, quality1, quality0);
  2416. checkReturnValue(result);
  2417. return BDD(p, result);
  2418. } // BDD::BiasedUnderApprox
  2419. BDD
  2420. BDD::BiasedOverApprox(
  2421. const BDD& bias,
  2422. int numVars,
  2423. int threshold,
  2424. double quality1,
  2425. double quality0) const
  2426. {
  2427. DdManager *mgr = p->manager;
  2428. DdNode *result = Cudd_BiasedOverApprox(mgr, node, bias.node, numVars,
  2429. threshold, quality1, quality0);
  2430. checkReturnValue(result);
  2431. return BDD(p, result);
  2432. } // BDD::BiasedOverApprox
  2433. BDD
  2434. BDD::ExistAbstract(
  2435. const BDD& cube,
  2436. unsigned int limit) const
  2437. {
  2438. DdManager *mgr = checkSameManager(cube);
  2439. DdNode *result;
  2440. if (limit == 0)
  2441. result = Cudd_bddExistAbstract(mgr, node, cube.node);
  2442. else
  2443. result = Cudd_bddExistAbstractLimit(mgr, node, cube.node, limit);
  2444. checkReturnValue(result);
  2445. return BDD(p, result);
  2446. } // BDD::ExistAbstract
  2447. BDD
  2448. BDD::XorExistAbstract(
  2449. const BDD& g,
  2450. const BDD& cube) const
  2451. {
  2452. DdManager *mgr = checkSameManager(g);
  2453. checkSameManager(cube);
  2454. DdNode *result = Cudd_bddXorExistAbstract(mgr, node, g.node, cube.node);
  2455. checkReturnValue(result);
  2456. return BDD(p, result);
  2457. } // BDD::XorExistAbstract
  2458. BDD
  2459. BDD::UnivAbstract(
  2460. const BDD& cube) const
  2461. {
  2462. DdManager *mgr = checkSameManager(cube);
  2463. DdNode *result = Cudd_bddUnivAbstract(mgr, node, cube.node);
  2464. checkReturnValue(result);
  2465. return BDD(p, result);
  2466. } // BDD::UnivAbstract
  2467. BDD
  2468. BDD::BooleanDiff(
  2469. int x) const
  2470. {
  2471. DdManager *mgr = p->manager;
  2472. DdNode *result = Cudd_bddBooleanDiff(mgr, node, x);
  2473. checkReturnValue(result);
  2474. return BDD(p, result);
  2475. } // BDD::BooleanDiff
  2476. bool
  2477. BDD::VarIsDependent(
  2478. const BDD& var) const
  2479. {
  2480. DdManager *mgr = p->manager;
  2481. return Cudd_bddVarIsDependent(mgr, node, var.node);
  2482. } // BDD::VarIsDependent
  2483. double
  2484. BDD::Correlation(
  2485. const BDD& g) const
  2486. {
  2487. DdManager *mgr = checkSameManager(g);
  2488. return Cudd_bddCorrelation(mgr, node, g.node);
  2489. } // BDD::Correlation
  2490. double
  2491. BDD::CorrelationWeights(
  2492. const BDD& g,
  2493. double * prob) const
  2494. {
  2495. DdManager *mgr = checkSameManager(g);
  2496. return Cudd_bddCorrelationWeights(mgr, node, g.node, prob);
  2497. } // BDD::CorrelationWeights
  2498. BDD
  2499. BDD::Ite(
  2500. const BDD& g,
  2501. const BDD& h,
  2502. unsigned int limit) const
  2503. {
  2504. DdManager *mgr = checkSameManager(g);
  2505. checkSameManager(h);
  2506. DdNode *result;
  2507. if (limit == 0)
  2508. result = Cudd_bddIte(mgr, node, g.node, h.node);
  2509. else
  2510. result = Cudd_bddIteLimit(mgr, node, g.node, h.node, limit);
  2511. checkReturnValue(result);
  2512. return BDD(p, result);
  2513. } // BDD::Ite
  2514. BDD
  2515. BDD::IteConstant(
  2516. const BDD& g,
  2517. const BDD& h) const
  2518. {
  2519. DdManager *mgr = checkSameManager(g);
  2520. checkSameManager(h);
  2521. DdNode *result = Cudd_bddIteConstant(mgr, node, g.node, h.node);
  2522. checkReturnValue(result);
  2523. return BDD(p, result);
  2524. } // BDD::IteConstant
  2525. BDD
  2526. BDD::Intersect(
  2527. const BDD& g) const
  2528. {
  2529. DdManager *mgr = checkSameManager(g);
  2530. DdNode *result = Cudd_bddIntersect(mgr, node, g.node);
  2531. checkReturnValue(result);
  2532. return BDD(p, result);
  2533. } // BDD::Intersect
  2534. BDD
  2535. BDD::And(
  2536. const BDD& g,
  2537. unsigned int limit) const
  2538. {
  2539. DdManager *mgr = checkSameManager(g);
  2540. DdNode *result;
  2541. if (limit == 0)
  2542. result = Cudd_bddAnd(mgr, node, g.node);
  2543. else
  2544. result = Cudd_bddAndLimit(mgr, node, g.node, limit);
  2545. checkReturnValue(result);
  2546. return BDD(p, result);
  2547. } // BDD::And
  2548. BDD
  2549. BDD::Or(
  2550. const BDD& g,
  2551. unsigned int limit) const
  2552. {
  2553. DdManager *mgr = checkSameManager(g);
  2554. DdNode *result;
  2555. if (limit == 0)
  2556. result = Cudd_bddOr(mgr, node, g.node);
  2557. else
  2558. result = Cudd_bddOrLimit(mgr, node, g.node, limit);
  2559. checkReturnValue(result);
  2560. return BDD(p, result);
  2561. } // BDD::Or
  2562. BDD
  2563. BDD::Nand(
  2564. const BDD& g) const
  2565. {
  2566. DdManager *mgr = checkSameManager(g);
  2567. DdNode *result = Cudd_bddNand(mgr, node, g.node);
  2568. checkReturnValue(result);
  2569. return BDD(p, result);
  2570. } // BDD::Nand
  2571. BDD
  2572. BDD::Nor(
  2573. const BDD& g) const
  2574. {
  2575. DdManager *mgr = checkSameManager(g);
  2576. DdNode *result = Cudd_bddNor(mgr, node, g.node);
  2577. checkReturnValue(result);
  2578. return BDD(p, result);
  2579. } // BDD::Nor
  2580. BDD
  2581. BDD::Xor(
  2582. const BDD& g) const
  2583. {
  2584. DdManager *mgr = checkSameManager(g);
  2585. DdNode *result = Cudd_bddXor(mgr, node, g.node);
  2586. checkReturnValue(result);
  2587. return BDD(p, result);
  2588. } // BDD::Xor
  2589. BDD
  2590. BDD::Xnor(
  2591. const BDD& g,
  2592. unsigned int limit) const
  2593. {
  2594. DdManager *mgr = checkSameManager(g);
  2595. DdNode *result;
  2596. if (limit == 0)
  2597. result = Cudd_bddXnor(mgr, node, g.node);
  2598. else
  2599. result = Cudd_bddXnorLimit(mgr, node, g.node, limit);
  2600. checkReturnValue(result);
  2601. return BDD(p, result);
  2602. } // BDD::Xnor
  2603. bool
  2604. BDD::Leq(
  2605. const BDD& g) const
  2606. {
  2607. DdManager *mgr = checkSameManager(g);
  2608. return Cudd_bddLeq(mgr, node, g.node);
  2609. } // BDD::Leq
  2610. BDD
  2611. ADD::BddThreshold(
  2612. CUDD_VALUE_TYPE value) const
  2613. {
  2614. DdManager *mgr = p->manager;
  2615. DdNode *result = Cudd_addBddThreshold(mgr, node, value);
  2616. checkReturnValue(result);
  2617. return BDD(p, result);
  2618. } // ADD::BddThreshold
  2619. BDD
  2620. ADD::BddStrictThreshold(
  2621. CUDD_VALUE_TYPE value) const
  2622. {
  2623. DdManager *mgr = p->manager;
  2624. DdNode *result = Cudd_addBddStrictThreshold(mgr, node, value);
  2625. checkReturnValue(result);
  2626. return BDD(p, result);
  2627. } // ADD::BddStrictThreshold
  2628. BDD
  2629. ADD::BddInterval(
  2630. CUDD_VALUE_TYPE lower,
  2631. CUDD_VALUE_TYPE upper) const
  2632. {
  2633. DdManager *mgr = p->manager;
  2634. DdNode *result = Cudd_addBddInterval(mgr, node, lower, upper);
  2635. checkReturnValue(result);
  2636. return BDD(p, result);
  2637. } // ADD::BddInterval
  2638. BDD
  2639. ADD::BddIthBit(
  2640. int bit) const
  2641. {
  2642. DdManager *mgr = p->manager;
  2643. DdNode *result = Cudd_addBddIthBit(mgr, node, bit);
  2644. checkReturnValue(result);
  2645. return BDD(p, result);
  2646. } // ADD::BddIthBit
  2647. ADD
  2648. BDD::Add() const
  2649. {
  2650. DdManager *mgr = p->manager;
  2651. DdNode *result = Cudd_BddToAdd(mgr, node);
  2652. checkReturnValue(result);
  2653. return ADD(p, result);
  2654. } // BDD::Add
  2655. BDD
  2656. ADD::BddPattern() const
  2657. {
  2658. DdManager *mgr = p->manager;
  2659. DdNode *result = Cudd_addBddPattern(mgr, node);
  2660. checkReturnValue(result);
  2661. return BDD(p, result);
  2662. } // ADD::BddPattern
  2663. BDD
  2664. BDD::Transfer(
  2665. Cudd& destination) const
  2666. {
  2667. DdManager *mgr = p->manager;
  2668. DdNode *result = Cudd_bddTransfer(mgr, destination.p->manager, node);
  2669. checkReturnValue(result);
  2670. return BDD(destination.p, result);
  2671. } // BDD::Transfer
  2672. void
  2673. Cudd::DebugCheck() const
  2674. {
  2675. int result = Cudd_DebugCheck(p->manager);
  2676. checkReturnValue(result == 0);
  2677. } // Cudd::DebugCheck
  2678. void
  2679. Cudd::CheckKeys() const
  2680. {
  2681. int result = Cudd_CheckKeys(p->manager);
  2682. checkReturnValue(result == 0);
  2683. } // Cudd::CheckKeys
  2684. BDD
  2685. BDD::ClippingAnd(
  2686. const BDD& g,
  2687. int maxDepth,
  2688. int direction) const
  2689. {
  2690. DdManager *mgr = checkSameManager(g);
  2691. DdNode *result = Cudd_bddClippingAnd(mgr, node, g.node, maxDepth,
  2692. direction);
  2693. checkReturnValue(result);
  2694. return BDD(p, result);
  2695. } // BDD::ClippingAnd
  2696. BDD
  2697. BDD::ClippingAndAbstract(
  2698. const BDD& g,
  2699. const BDD& cube,
  2700. int maxDepth,
  2701. int direction) const
  2702. {
  2703. DdManager *mgr = checkSameManager(g);
  2704. checkSameManager(cube);
  2705. DdNode *result = Cudd_bddClippingAndAbstract(mgr, node, g.node, cube.node,
  2706. maxDepth, direction);
  2707. checkReturnValue(result);
  2708. return BDD(p, result);
  2709. } // BDD::ClippingAndAbstract
  2710. ADD
  2711. ADD::Cofactor(
  2712. const ADD& g) const
  2713. {
  2714. DdManager *mgr = checkSameManager(g);
  2715. DdNode *result = Cudd_Cofactor(mgr, node, g.node);
  2716. checkReturnValue(result);
  2717. return ADD(p, result);
  2718. } // ADD::Cofactor
  2719. BDD
  2720. BDD::Cofactor(
  2721. const BDD& g) const
  2722. {
  2723. DdManager *mgr = checkSameManager(g);
  2724. DdNode *result = Cudd_Cofactor(mgr, node, g.node);
  2725. checkReturnValue(result);
  2726. return BDD(p, result);
  2727. } // BDD::Cofactor
  2728. bool
  2729. BDD::VarAreSymmetric(int index1, int index2) const
  2730. {
  2731. return Cudd_VarsAreSymmetric(p->manager, node, index1, index2);
  2732. } // BDD::VarAreSymmetric
  2733. BDD
  2734. BDD::Compose(
  2735. const BDD& g,
  2736. int v) const
  2737. {
  2738. DdManager *mgr = checkSameManager(g);
  2739. DdNode *result = Cudd_bddCompose(mgr, node, g.node, v);
  2740. checkReturnValue(result);
  2741. return BDD(p, result);
  2742. } // BDD::Compose
  2743. ADD
  2744. ADD::Compose(
  2745. const ADD& g,
  2746. int v) const
  2747. {
  2748. DdManager *mgr = checkSameManager(g);
  2749. DdNode *result = Cudd_addCompose(mgr, node, g.node, v);
  2750. checkReturnValue(result);
  2751. return ADD(p, result);
  2752. } // ADD::Compose
  2753. ADD
  2754. ADD::Permute(
  2755. int * permut) const
  2756. {
  2757. DdManager *mgr = p->manager;
  2758. DdNode *result = Cudd_addPermute(mgr, node, permut);
  2759. checkReturnValue(result);
  2760. return ADD(p, result);
  2761. } // ADD::Permute
  2762. ADD
  2763. ADD::SwapVariables(
  2764. std::vector<ADD> x,
  2765. std::vector<ADD> y) const
  2766. {
  2767. size_t n = x.size();
  2768. DdManager *mgr = p->manager;
  2769. DdNode **X = new DdNode *[n];
  2770. DdNode **Y = new DdNode *[n];
  2771. for (size_t i = 0; i < n; i++) {
  2772. X[i] = x[i].node;
  2773. Y[i] = y[i].node;
  2774. }
  2775. DdNode *result = Cudd_addSwapVariables(mgr, node, X, Y, (int) n);
  2776. delete [] X;
  2777. delete [] Y;
  2778. checkReturnValue(result);
  2779. return ADD(p, result);
  2780. } // ADD::SwapVariables
  2781. BDD
  2782. BDD::Permute(
  2783. int * permut) const
  2784. {
  2785. DdManager *mgr = p->manager;
  2786. DdNode *result = Cudd_bddPermute(mgr, node, permut);
  2787. checkReturnValue(result);
  2788. return BDD(p, result);
  2789. } // BDD::Permute
  2790. BDD
  2791. BDD::SwapVariables(
  2792. std::vector<BDD> x,
  2793. std::vector<BDD> y) const
  2794. {
  2795. size_t n = x.size();
  2796. DdManager *mgr = p->manager;
  2797. DdNode **X = new DdNode *[n];
  2798. DdNode **Y = new DdNode *[n];
  2799. for (size_t i = 0; i < n; i++) {
  2800. X[i] = x[i].node;
  2801. Y[i] = y[i].node;
  2802. }
  2803. DdNode *result = Cudd_bddSwapVariables(mgr, node, X, Y, (int) n);
  2804. delete [] X;
  2805. delete [] Y;
  2806. checkReturnValue(result);
  2807. return BDD(p, result);
  2808. } // BDD::SwapVariables
  2809. BDD
  2810. BDD::AdjPermuteX(
  2811. std::vector<BDD> x) const
  2812. {
  2813. size_t n = x.size();
  2814. DdManager *mgr = p->manager;
  2815. DdNode **X = new DdNode *[n];
  2816. for (size_t i = 0; i < n; i++) {
  2817. X[i] = x[i].node;
  2818. }
  2819. DdNode *result = Cudd_bddAdjPermuteX(mgr, node, X, (int) n);
  2820. delete [] X;
  2821. checkReturnValue(result);
  2822. return BDD(p, result);
  2823. } // BDD::AdjPermuteX
  2824. ADD
  2825. ADD::VectorCompose(
  2826. std::vector<ADD> vect) const
  2827. {
  2828. DdManager *mgr = p->manager;
  2829. size_t n = (size_t) Cudd_ReadSize(mgr);
  2830. DdNode **X = new DdNode *[n];
  2831. for (size_t i = 0; i < n; i++) {
  2832. X[i] = vect[i].node;
  2833. }
  2834. DdNode *result = Cudd_addVectorCompose(mgr, node, X);
  2835. delete [] X;
  2836. checkReturnValue(result);
  2837. return ADD(p, result);
  2838. } // ADD::VectorCompose
  2839. ADD
  2840. ADD::NonSimCompose(
  2841. std::vector<ADD> vect) const
  2842. {
  2843. DdManager *mgr = p->manager;
  2844. size_t n = (size_t) Cudd_ReadSize(mgr);
  2845. DdNode **X = new DdNode *[n];
  2846. for (size_t i = 0; i < n; i++) {
  2847. X[i] = vect[i].node;
  2848. }
  2849. DdNode *result = Cudd_addNonSimCompose(mgr, node, X);
  2850. delete [] X;
  2851. checkReturnValue(result);
  2852. return ADD(p, result);
  2853. } // ADD::NonSimCompose
  2854. BDD
  2855. BDD::VectorCompose(
  2856. std::vector<BDD> vect) const
  2857. {
  2858. DdManager *mgr = p->manager;
  2859. size_t n = (size_t) Cudd_ReadSize(mgr);
  2860. DdNode **X = new DdNode *[n];
  2861. for (size_t i = 0; i < n; i++) {
  2862. X[i] = vect[i].node;
  2863. }
  2864. DdNode *result = Cudd_bddVectorCompose(mgr, node, X);
  2865. delete [] X;
  2866. checkReturnValue(result);
  2867. return BDD(p, result);
  2868. } // BDD::VectorCompose
  2869. void
  2870. BDD::ApproxConjDecomp(
  2871. BDD* g,
  2872. BDD* h) const
  2873. {
  2874. DdManager *mgr = p->manager;
  2875. DdNode **pieces;
  2876. int result = Cudd_bddApproxConjDecomp(mgr, node, &pieces);
  2877. checkReturnValue(result == 2);
  2878. *g = BDD(p, pieces[0]);
  2879. *h = BDD(p, pieces[1]);
  2880. Cudd_RecursiveDeref(mgr,pieces[0]);
  2881. Cudd_RecursiveDeref(mgr,pieces[1]);
  2882. free(pieces);
  2883. } // BDD::ApproxConjDecomp
  2884. void
  2885. BDD::ApproxDisjDecomp(
  2886. BDD* g,
  2887. BDD* h) const
  2888. {
  2889. DdManager *mgr = p->manager;
  2890. DdNode **pieces;
  2891. int result = Cudd_bddApproxDisjDecomp(mgr, node, &pieces);
  2892. checkReturnValue(result == 2);
  2893. *g = BDD(p, pieces[0]);
  2894. *h = BDD(p, pieces[1]);
  2895. Cudd_RecursiveDeref(mgr,pieces[0]);
  2896. Cudd_RecursiveDeref(mgr,pieces[1]);
  2897. free(pieces);
  2898. } // BDD::ApproxDisjDecomp
  2899. void
  2900. BDD::IterConjDecomp(
  2901. BDD* g,
  2902. BDD* h) const
  2903. {
  2904. DdManager *mgr = p->manager;
  2905. DdNode **pieces;
  2906. int result = Cudd_bddIterConjDecomp(mgr, node, &pieces);
  2907. checkReturnValue(result == 2);
  2908. *g = BDD(p, pieces[0]);
  2909. *h = BDD(p, pieces[1]);
  2910. Cudd_RecursiveDeref(mgr,pieces[0]);
  2911. Cudd_RecursiveDeref(mgr,pieces[1]);
  2912. free(pieces);
  2913. } // BDD::IterConjDecomp
  2914. void
  2915. BDD::IterDisjDecomp(
  2916. BDD* g,
  2917. BDD* h) const
  2918. {
  2919. DdManager *mgr = p->manager;
  2920. DdNode **pieces;
  2921. int result = Cudd_bddIterDisjDecomp(mgr, node, &pieces);
  2922. checkReturnValue(result == 2);
  2923. *g = BDD(p, pieces[0]);
  2924. *h = BDD(p, pieces[1]);
  2925. Cudd_RecursiveDeref(mgr,pieces[0]);
  2926. Cudd_RecursiveDeref(mgr,pieces[1]);
  2927. free(pieces);
  2928. } // BDD::IterDisjDecomp
  2929. void
  2930. BDD::GenConjDecomp(
  2931. BDD* g,
  2932. BDD* h) const
  2933. {
  2934. DdManager *mgr = p->manager;
  2935. DdNode **pieces;
  2936. int result = Cudd_bddGenConjDecomp(mgr, node, &pieces);
  2937. checkReturnValue(result == 2);
  2938. *g = BDD(p, pieces[0]);
  2939. *h = BDD(p, pieces[1]);
  2940. Cudd_RecursiveDeref(mgr,pieces[0]);
  2941. Cudd_RecursiveDeref(mgr,pieces[1]);
  2942. free(pieces);
  2943. } // BDD::GenConjDecomp
  2944. void
  2945. BDD::GenDisjDecomp(
  2946. BDD* g,
  2947. BDD* h) const
  2948. {
  2949. DdManager *mgr = p->manager;
  2950. DdNode **pieces;
  2951. int result = Cudd_bddGenDisjDecomp(mgr, node, &pieces);
  2952. checkReturnValue(result == 2);
  2953. *g = BDD(p, pieces[0]);
  2954. *h = BDD(p, pieces[1]);
  2955. Cudd_RecursiveDeref(mgr,pieces[0]);
  2956. Cudd_RecursiveDeref(mgr,pieces[1]);
  2957. free(pieces);
  2958. } // BDD::GenDisjDecomp
  2959. void
  2960. BDD::VarConjDecomp(
  2961. BDD* g,
  2962. BDD* h) const
  2963. {
  2964. DdManager *mgr = p->manager;
  2965. DdNode **pieces;
  2966. int result = Cudd_bddVarConjDecomp(mgr, node, &pieces);
  2967. checkReturnValue(result == 2);
  2968. *g = BDD(p, pieces[0]);
  2969. *h = BDD(p, pieces[1]);
  2970. Cudd_RecursiveDeref(mgr,pieces[0]);
  2971. Cudd_RecursiveDeref(mgr,pieces[1]);
  2972. free(pieces);
  2973. } // BDD::VarConjDecomp
  2974. void
  2975. BDD::VarDisjDecomp(
  2976. BDD* g,
  2977. BDD* h) const
  2978. {
  2979. DdManager *mgr = p->manager;
  2980. DdNode **pieces;
  2981. int result = Cudd_bddVarDisjDecomp(mgr, node, &pieces);
  2982. checkReturnValue(result == 2);
  2983. *g = BDD(p, pieces[0]);
  2984. *h = BDD(p, pieces[1]);
  2985. Cudd_RecursiveDeref(mgr,pieces[0]);
  2986. Cudd_RecursiveDeref(mgr,pieces[1]);
  2987. free(pieces);
  2988. } // BDD::VarDisjDecomp
  2989. bool
  2990. ABDD::IsCube() const
  2991. {
  2992. DdManager *mgr = p->manager;
  2993. return Cudd_CheckCube(mgr, node);
  2994. } // ABDD::IsCube
  2995. BDD
  2996. ABDD::FindEssential() const
  2997. {
  2998. DdManager *mgr = p->manager;
  2999. DdNode *result = Cudd_FindEssential(mgr, node);
  3000. checkReturnValue(result);
  3001. return BDD(p, result);
  3002. } // ABDD::FindEssential
  3003. bool
  3004. BDD::IsVarEssential(
  3005. int id,
  3006. int phase) const
  3007. {
  3008. DdManager *mgr = p->manager;
  3009. return Cudd_bddIsVarEssential(mgr, node, id, phase);
  3010. } // BDD::IsVarEssential
  3011. void
  3012. ABDD::PrintTwoLiteralClauses(
  3013. char **names,
  3014. FILE *fp) const
  3015. {
  3016. DdManager *mgr = p->manager;
  3017. int result = Cudd_PrintTwoLiteralClauses(mgr, node, names, fp);
  3018. checkReturnValue(result);
  3019. } // ABDD::PrintTwoLiteralClauses
  3020. void
  3021. Cudd::DumpBlif(
  3022. const std::vector<BDD>& nodes,
  3023. char const * const * inames,
  3024. char const * const * onames,
  3025. char * mname,
  3026. FILE * fp,
  3027. int mv) const
  3028. {
  3029. DdManager *mgr = p->manager;
  3030. size_t n = nodes.size();
  3031. DdNode **F = new DdNode *[n];
  3032. for (size_t i = 0; i < n; i ++) {
  3033. F[i] = nodes[i].getNode();
  3034. }
  3035. int result = Cudd_DumpBlif(mgr, (int) n, F, inames, onames, mname, fp, mv);
  3036. delete [] F;
  3037. checkReturnValue(result);
  3038. } // Cudd::DumpBlif
  3039. void
  3040. Cudd::DumpDot(
  3041. const std::vector<BDD>& nodes,
  3042. char const * const * inames,
  3043. char const * const * onames,
  3044. FILE * fp) const
  3045. {
  3046. DdManager *mgr = p->manager;
  3047. size_t n = nodes.size();
  3048. DdNode **F = new DdNode *[n];
  3049. for (size_t i = 0; i < n; i ++) {
  3050. F[i] = nodes[i].getNode();
  3051. }
  3052. int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp);
  3053. delete [] F;
  3054. checkReturnValue(result);
  3055. } // Cudd::DumpDot
  3056. void
  3057. Cudd::DumpDot(
  3058. const std::vector<ADD>& nodes,
  3059. char const * const * inames,
  3060. char const * const * onames,
  3061. FILE * fp) const
  3062. {
  3063. DdManager *mgr = p->manager;
  3064. size_t n = nodes.size();
  3065. DdNode **F = new DdNode *[n];
  3066. for (size_t i = 0; i < n; i ++) {
  3067. F[i] = nodes[i].getNode();
  3068. }
  3069. int result = Cudd_DumpDot(mgr, (int) n, F, inames, onames, fp);
  3070. delete [] F;
  3071. checkReturnValue(result);
  3072. } // Cudd::DumpDot
  3073. void
  3074. Cudd::DumpDaVinci(
  3075. const std::vector<BDD>& nodes,
  3076. char const * const * inames,
  3077. char const * const * onames,
  3078. FILE * fp) const
  3079. {
  3080. DdManager *mgr = p->manager;
  3081. size_t n = nodes.size();
  3082. DdNode **F = new DdNode *[n];
  3083. for (size_t i = 0; i < n; i ++) {
  3084. F[i] = nodes[i].getNode();
  3085. }
  3086. int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp);
  3087. delete [] F;
  3088. checkReturnValue(result);
  3089. } // Cudd::DumpDaVinci
  3090. void
  3091. Cudd::DumpDaVinci(
  3092. const std::vector<ADD>& nodes,
  3093. char const * const * inames,
  3094. char const * const * onames,
  3095. FILE * fp) const
  3096. {
  3097. DdManager *mgr = p->manager;
  3098. size_t n = nodes.size();
  3099. DdNode **F = new DdNode *[n];
  3100. for (size_t i = 0; i < n; i ++) {
  3101. F[i] = nodes[i].getNode();
  3102. }
  3103. int result = Cudd_DumpDaVinci(mgr, (int) n, F, inames, onames, fp);
  3104. delete [] F;
  3105. checkReturnValue(result);
  3106. } // Cudd::DumpDaVinci
  3107. void
  3108. Cudd::DumpDDcal(
  3109. const std::vector<BDD>& nodes,
  3110. char const * const * inames,
  3111. char const * const * onames,
  3112. FILE * fp) const
  3113. {
  3114. DdManager *mgr = p->manager;
  3115. size_t n = nodes.size();
  3116. DdNode **F = new DdNode *[n];
  3117. for (size_t i = 0; i < n; i ++) {
  3118. F[i] = nodes[i].getNode();
  3119. }
  3120. int result = Cudd_DumpDDcal(mgr, (int) n, F, inames, onames, fp);
  3121. delete [] F;
  3122. checkReturnValue(result);
  3123. } // Cudd::DumpDDcal
  3124. void
  3125. Cudd::DumpFactoredForm(
  3126. const std::vector<BDD>& nodes,
  3127. char const * const * inames,
  3128. char const * const * onames,
  3129. FILE * fp) const
  3130. {
  3131. DdManager *mgr = p->manager;
  3132. size_t n = nodes.size();
  3133. DdNode **F = new DdNode *[n];
  3134. for (size_t i = 0; i < n; i ++) {
  3135. F[i] = nodes[i].getNode();
  3136. }
  3137. int result = Cudd_DumpFactoredForm(mgr, (int) n, F, inames, onames, fp);
  3138. delete [] F;
  3139. checkReturnValue(result);
  3140. } // Cudd::DumpFactoredForm
  3141. void
  3142. BDD::PrintFactoredForm(
  3143. char const * const * inames,
  3144. FILE * fp) const
  3145. {
  3146. DdManager *mgr = p->manager;
  3147. DdNode *f = node;
  3148. int result = Cudd_DumpFactoredForm(mgr, 0, &f, inames, 0, fp);
  3149. checkReturnValue(result);
  3150. } // BDD::PrintFactoredForm
  3151. string
  3152. BDD::FactoredFormString(char const * const * inames) const
  3153. {
  3154. DdManager *mgr = p->manager;
  3155. DdNode *f = node;
  3156. char *cstr = Cudd_FactoredFormString(mgr, f, inames);
  3157. checkReturnValue(cstr);
  3158. string str(cstr);
  3159. free(cstr);
  3160. return str;
  3161. } // BDD::FactoredFormString
  3162. BDD
  3163. BDD::Constrain(
  3164. const BDD& c) const
  3165. {
  3166. DdManager *mgr = checkSameManager(c);
  3167. DdNode *result = Cudd_bddConstrain(mgr, node, c.node);
  3168. checkReturnValue(result);
  3169. return BDD(p, result);
  3170. } // BDD::Constrain
  3171. BDD
  3172. BDD::Restrict(
  3173. const BDD& c) const
  3174. {
  3175. DdManager *mgr = checkSameManager(c);
  3176. DdNode *result = Cudd_bddRestrict(mgr, node, c.node);
  3177. checkReturnValue(result);
  3178. return BDD(p, result);
  3179. } // BDD::Restrict
  3180. BDD
  3181. BDD::NPAnd(
  3182. const BDD& g) const
  3183. {
  3184. DdManager *mgr = checkSameManager(g);
  3185. DdNode *result = Cudd_bddNPAnd(mgr, node, g.node);
  3186. checkReturnValue(result);
  3187. return BDD(p, result);
  3188. } // BDD::NPAnd
  3189. ADD
  3190. ADD::Constrain(
  3191. const ADD& c) const
  3192. {
  3193. DdManager *mgr = checkSameManager(c);
  3194. DdNode *result = Cudd_addConstrain(mgr, node, c.node);
  3195. checkReturnValue(result);
  3196. return ADD(p, result);
  3197. } // ADD::Constrain
  3198. std::vector<BDD>
  3199. BDD::ConstrainDecomp() const
  3200. {
  3201. DdManager *mgr = p->manager;
  3202. DdNode **result = Cudd_bddConstrainDecomp(mgr, node);
  3203. checkReturnValue(result);
  3204. int size = Cudd_ReadSize(mgr);
  3205. vector<BDD> vect;
  3206. for (int i = 0; i < size; i++) {
  3207. Cudd_Deref(result[i]);
  3208. vect.push_back(BDD(p, result[i]));
  3209. }
  3210. free(result);
  3211. return vect;
  3212. } // BDD::ConstrainDecomp
  3213. ADD
  3214. ADD::Restrict(
  3215. const ADD& c) const
  3216. {
  3217. DdManager *mgr = checkSameManager(c);
  3218. DdNode *result = Cudd_addRestrict(mgr, node, c.node);
  3219. checkReturnValue(result);
  3220. return ADD(p, result);
  3221. } // ADD::Restrict
  3222. std::vector<BDD>
  3223. BDD::CharToVect() const
  3224. {
  3225. DdManager *mgr = p->manager;
  3226. DdNode **result = Cudd_bddCharToVect(mgr, node);
  3227. checkReturnValue(result);
  3228. int size = Cudd_ReadSize(mgr);
  3229. vector<BDD> vect;
  3230. for (int i = 0; i < size; i++) {
  3231. Cudd_Deref(result[i]);
  3232. vect.push_back(BDD(p, result[i]));
  3233. }
  3234. free(result);
  3235. return vect;
  3236. } // BDD::CharToVect
  3237. BDD
  3238. BDD::LICompaction(
  3239. const BDD& c) const
  3240. {
  3241. DdManager *mgr = checkSameManager(c);
  3242. DdNode *result = Cudd_bddLICompaction(mgr, node, c.node);
  3243. checkReturnValue(result);
  3244. return BDD(p, result);
  3245. } // BDD::LICompaction
  3246. BDD
  3247. BDD::Squeeze(
  3248. const BDD& u) const
  3249. {
  3250. DdManager *mgr = checkSameManager(u);
  3251. DdNode *result = Cudd_bddSqueeze(mgr, node, u.node);
  3252. checkReturnValue(result);
  3253. return BDD(p, result);
  3254. } // BDD::Squeeze
  3255. BDD
  3256. BDD::Interpolate(
  3257. const BDD& u) const
  3258. {
  3259. DdManager *mgr = checkSameManager(u);
  3260. DdNode *result = Cudd_bddInterpolate(mgr, node, u.node);
  3261. checkReturnValue(result);
  3262. return BDD(p, result);
  3263. } // BDD::Interpolate
  3264. BDD
  3265. BDD::Minimize(
  3266. const BDD& c) const
  3267. {
  3268. DdManager *mgr = checkSameManager(c);
  3269. DdNode *result = Cudd_bddMinimize(mgr, node, c.node);
  3270. checkReturnValue(result);
  3271. return BDD(p, result);
  3272. } // BDD::Minimize
  3273. BDD
  3274. BDD::SubsetCompress(
  3275. int nvars,
  3276. int threshold) const
  3277. {
  3278. DdManager *mgr = p->manager;
  3279. DdNode *result = Cudd_SubsetCompress(mgr, node, nvars, threshold);
  3280. checkReturnValue(result);
  3281. return BDD(p, result);
  3282. } // BDD::SubsetCompress
  3283. BDD
  3284. BDD::SupersetCompress(
  3285. int nvars,
  3286. int threshold) const
  3287. {
  3288. DdManager *mgr = p->manager;
  3289. DdNode *result = Cudd_SupersetCompress(mgr, node, nvars, threshold);
  3290. checkReturnValue(result);
  3291. return BDD(p, result);
  3292. } // BDD::SupersetCompress
  3293. MtrNode *
  3294. Cudd::MakeTreeNode(
  3295. unsigned int low,
  3296. unsigned int size,
  3297. unsigned int type) const
  3298. {
  3299. return Cudd_MakeTreeNode(p->manager, low, size, type);
  3300. } // Cudd::MakeTreeNode
  3301. ADD
  3302. Cudd::Harwell(
  3303. FILE * fp,
  3304. std::vector<ADD>& x,
  3305. std::vector<ADD>& y,
  3306. std::vector<ADD>& xn,
  3307. std::vector<ADD>& yn_,
  3308. int * m,
  3309. int * n,
  3310. int bx,
  3311. int sx,
  3312. int by,
  3313. int sy,
  3314. int pr) const
  3315. {
  3316. DdManager *mgr = p->manager;
  3317. DdNode *E;
  3318. DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0;
  3319. int nx = x.size(), ny = y.size();
  3320. if (nx > 0) {
  3321. xa = (DdNode **) malloc(nx * sizeof(DdNode *));
  3322. if (!xa) {
  3323. p->errorHandler("Out of memory.");
  3324. }
  3325. xna = (DdNode **) malloc(nx * sizeof(DdNode *));
  3326. if (!xna) {
  3327. free(xa);
  3328. p->errorHandler("Out of memory.");
  3329. }
  3330. for (int i = 0; i < nx; ++i) {
  3331. xa[i] = x.at(i).node;
  3332. xna[i] = xn.at(i).node;
  3333. }
  3334. }
  3335. if (ny > 0) {
  3336. ya = (DdNode **) malloc(ny * sizeof(DdNode *));
  3337. if (!ya) {
  3338. free(xa);
  3339. free(xna);
  3340. p->errorHandler("Out of memory.");
  3341. }
  3342. yna = (DdNode **) malloc(ny * sizeof(DdNode *));
  3343. if (!yna) {
  3344. free(xa);
  3345. free(xna);
  3346. free(ya);
  3347. p->errorHandler("Out of memory.");
  3348. }
  3349. for (int j = 0; j < ny; ++j) {
  3350. ya[j] = y.at(j).node;
  3351. yna[j] = yn_.at(j).node;
  3352. }
  3353. }
  3354. int result = Cudd_addHarwell(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny,
  3355. m, n, bx, sx, by, sy, pr);
  3356. checkReturnValue(result);
  3357. for (int i = x.size(); i < nx; ++i) {
  3358. x.push_back(ADD(p, xa[i]));
  3359. xn.push_back(ADD(p, xna[i]));
  3360. }
  3361. free(xa);
  3362. free(xna);
  3363. for (int j = y.size(); j < ny; ++j) {
  3364. y.push_back(ADD(p, ya[j]));
  3365. yn_.push_back(ADD(p, yna[j]));
  3366. }
  3367. free(ya);
  3368. free(yna);
  3369. Cudd_Deref(E);
  3370. return ADD(p, E);
  3371. } // Cudd::Harwell
  3372. void
  3373. Cudd::PrintLinear(void) const
  3374. {
  3375. cout.flush();
  3376. int result = Cudd_PrintLinear(p->manager);
  3377. checkReturnValue(result);
  3378. } // Cudd::PrintLinear
  3379. int
  3380. Cudd::ReadLinear(
  3381. int x,
  3382. int y) const
  3383. {
  3384. return Cudd_ReadLinear(p->manager, x, y);
  3385. } // Cudd::ReadLinear
  3386. BDD
  3387. BDD::LiteralSetIntersection(
  3388. const BDD& g) const
  3389. {
  3390. DdManager *mgr = checkSameManager(g);
  3391. DdNode *result = Cudd_bddLiteralSetIntersection(mgr, node, g.node);
  3392. checkReturnValue(result);
  3393. return BDD(p, result);
  3394. } // BDD::LiteralSetIntersection
  3395. ADD
  3396. ADD::MatrixMultiply(
  3397. const ADD& B,
  3398. std::vector<ADD> z) const
  3399. {
  3400. size_t nz = z.size();
  3401. DdManager *mgr = checkSameManager(B);
  3402. DdNode **Z = new DdNode *[nz];
  3403. for (size_t i = 0; i < nz; i++) {
  3404. Z[i] = z[i].node;
  3405. }
  3406. DdNode *result = Cudd_addMatrixMultiply(mgr, node, B.node, Z, (int) nz);
  3407. delete [] Z;
  3408. checkReturnValue(result);
  3409. return ADD(p, result);
  3410. } // ADD::MatrixMultiply
  3411. ADD
  3412. ADD::TimesPlus(
  3413. const ADD& B,
  3414. std::vector<ADD> z) const
  3415. {
  3416. size_t nz = z.size();
  3417. DdManager *mgr = checkSameManager(B);
  3418. DdNode **Z = new DdNode *[nz];
  3419. for (size_t i = 0; i < nz; i++) {
  3420. Z[i] = z[i].node;
  3421. }
  3422. DdNode *result = Cudd_addTimesPlus(mgr, node, B.node, Z, (int) nz);
  3423. delete [] Z;
  3424. checkReturnValue(result);
  3425. return ADD(p, result);
  3426. } // ADD::TimesPlus
  3427. ADD
  3428. ADD::Triangle(
  3429. const ADD& g,
  3430. std::vector<ADD> z) const
  3431. {
  3432. size_t nz = z.size();
  3433. DdManager *mgr = checkSameManager(g);
  3434. DdNode **Z = new DdNode *[nz];
  3435. for (size_t i = 0; i < nz; i++) {
  3436. Z[i] = z[i].node;
  3437. }
  3438. DdNode *result = Cudd_addTriangle(mgr, node, g.node, Z, (int) nz);
  3439. delete [] Z;
  3440. checkReturnValue(result);
  3441. return ADD(p, result);
  3442. } // ADD::Triangle
  3443. BDD
  3444. BDD::PrioritySelect(
  3445. std::vector<BDD> x,
  3446. std::vector<BDD> y,
  3447. std::vector<BDD> z,
  3448. const BDD& Pi,
  3449. DD_PRFP Pifunc) const
  3450. {
  3451. size_t n = x.size();
  3452. DdManager *mgr = p->manager;
  3453. DdNode **X = new DdNode *[n];
  3454. DdNode **Y = new DdNode *[n];
  3455. DdNode **Z = new DdNode *[n];
  3456. for (size_t i = 0; i < n; i++) {
  3457. X[i] = x[i].node;
  3458. Y[i] = y[i].node;
  3459. Z[i] = z[i].node;
  3460. }
  3461. DdNode *result = Cudd_PrioritySelect(mgr, node, X, Y, Z, Pi.node,
  3462. (int) n, Pifunc);
  3463. delete [] X;
  3464. delete [] Y;
  3465. delete [] Z;
  3466. checkReturnValue(result);
  3467. return BDD(p, result);
  3468. } // BDD::PrioritySelect
  3469. BDD
  3470. Cudd::Xgty(
  3471. std::vector<BDD> z,
  3472. std::vector<BDD> x,
  3473. std::vector<BDD> y) const
  3474. {
  3475. size_t N = z.size();
  3476. DdManager *mgr = p->manager;
  3477. DdNode **X = new DdNode *[N];
  3478. DdNode **Y = new DdNode *[N];
  3479. DdNode **Z = new DdNode *[N];
  3480. for (size_t i = 0; i < N; i++) {
  3481. X[i] = x[i].getNode();
  3482. Y[i] = y[i].getNode();
  3483. Z[i] = z[i].getNode();
  3484. }
  3485. DdNode *result = Cudd_Xgty(mgr, (int) N, Z, X, Y);
  3486. delete [] X;
  3487. delete [] Y;
  3488. delete [] Z;
  3489. checkReturnValue(result);
  3490. return BDD(p, result);
  3491. } // Cudd::Xgty
  3492. BDD
  3493. Cudd::Xeqy(
  3494. std::vector<BDD> x,
  3495. std::vector<BDD> y) const
  3496. {
  3497. size_t N = x.size();
  3498. DdManager *mgr = p->manager;
  3499. DdNode **X = new DdNode *[N];
  3500. DdNode **Y = new DdNode *[N];
  3501. for (size_t i = 0; i < N; i++) {
  3502. X[i] = x[i].getNode();
  3503. Y[i] = y[i].getNode();
  3504. }
  3505. DdNode *result = Cudd_Xeqy(mgr, (int) N, X, Y);
  3506. delete [] X;
  3507. delete [] Y;
  3508. checkReturnValue(result);
  3509. return BDD(p, result);
  3510. } // BDD::Xeqy
  3511. ADD
  3512. Cudd::Xeqy(
  3513. std::vector<ADD> x,
  3514. std::vector<ADD> y) const
  3515. {
  3516. size_t N = x.size();
  3517. DdManager *mgr = p->manager;
  3518. DdNode **X = new DdNode *[N];
  3519. DdNode **Y = new DdNode *[N];
  3520. for (size_t i = 0; i < N; i++) {
  3521. X[i] = x[i].getNode();
  3522. Y[i] = y[i].getNode();
  3523. }
  3524. DdNode *result = Cudd_addXeqy(mgr, (int) N, X, X);
  3525. delete [] X;
  3526. delete [] Y;
  3527. checkReturnValue(result);
  3528. return ADD(p, result);
  3529. } // ADD::Xeqy
  3530. BDD
  3531. Cudd::Dxygtdxz(
  3532. std::vector<BDD> x,
  3533. std::vector<BDD> y,
  3534. std::vector<BDD> z) const
  3535. {
  3536. size_t N = x.size();
  3537. DdManager *mgr = p->manager;
  3538. DdNode **X = new DdNode *[N];
  3539. DdNode **Y = new DdNode *[N];
  3540. DdNode **Z = new DdNode *[N];
  3541. for (size_t i = 0; i < N; i++) {
  3542. X[i] = x[i].getNode();
  3543. Y[i] = y[i].getNode();
  3544. Z[i] = z[i].getNode();
  3545. }
  3546. DdNode *result = Cudd_Dxygtdxz(mgr, (int) N, X, Y, Z);
  3547. delete [] X;
  3548. delete [] Y;
  3549. delete [] Z;
  3550. checkReturnValue(result);
  3551. return BDD(p, result);
  3552. } // Cudd::Dxygtdxz
  3553. BDD
  3554. Cudd::Dxygtdyz(
  3555. std::vector<BDD> x,
  3556. std::vector<BDD> y,
  3557. std::vector<BDD> z) const
  3558. {
  3559. size_t N = x.size();
  3560. DdManager *mgr = p->manager;
  3561. DdNode **X = new DdNode *[N];
  3562. DdNode **Y = new DdNode *[N];
  3563. DdNode **Z = new DdNode *[N];
  3564. for (size_t i = 0; i < N; i++) {
  3565. X[i] = x[i].getNode();
  3566. Y[i] = y[i].getNode();
  3567. Z[i] = z[i].getNode();
  3568. }
  3569. DdNode *result = Cudd_Dxygtdyz(mgr, (int) N, X, Y, Z);
  3570. delete [] X;
  3571. delete [] Y;
  3572. delete [] Z;
  3573. checkReturnValue(result);
  3574. return BDD(p, result);
  3575. } // Cudd::Dxygtdyz
  3576. BDD
  3577. Cudd::Inequality(
  3578. int c,
  3579. std::vector<BDD> x,
  3580. std::vector<BDD> y) const
  3581. {
  3582. size_t N = x.size();
  3583. DdManager *mgr = p->manager;
  3584. DdNode **X = new DdNode *[N];
  3585. DdNode **Y = new DdNode *[N];
  3586. for (size_t i = 0; i < N; i++) {
  3587. X[i] = x[i].getNode();
  3588. Y[i] = y[i].getNode();
  3589. }
  3590. DdNode *result = Cudd_Inequality(mgr, (int) N, c, X, Y);
  3591. delete [] X;
  3592. delete [] Y;
  3593. checkReturnValue(result);
  3594. return BDD(p, result);
  3595. } // Cudd::Inequality
  3596. BDD
  3597. Cudd::Disequality(
  3598. int c,
  3599. std::vector<BDD> x,
  3600. std::vector<BDD> y) const
  3601. {
  3602. size_t N = x.size();
  3603. DdManager *mgr = p->manager;
  3604. DdNode **X = new DdNode *[N];
  3605. DdNode **Y = new DdNode *[N];
  3606. for (size_t i = 0; i < N; i++) {
  3607. X[i] = x[i].getNode();
  3608. Y[i] = y[i].getNode();
  3609. }
  3610. DdNode *result = Cudd_Disequality(mgr, (int) N, c, X, Y);
  3611. delete [] X;
  3612. delete [] Y;
  3613. checkReturnValue(result);
  3614. return BDD(p, result);
  3615. } // Cudd::Disequality
  3616. BDD
  3617. Cudd::Interval(
  3618. std::vector<BDD> x,
  3619. unsigned int lowerB,
  3620. unsigned int upperB) const
  3621. {
  3622. size_t N = x.size();
  3623. DdManager *mgr = p->manager;
  3624. DdNode **X = new DdNode *[N];
  3625. for (size_t i = 0; i < N; i++) {
  3626. X[i] = x[i].getNode();
  3627. }
  3628. DdNode *result = Cudd_bddInterval(mgr, (int) N, X, lowerB, upperB);
  3629. delete [] X;
  3630. checkReturnValue(result);
  3631. return BDD(p, result);
  3632. } // Cudd::Interval
  3633. BDD
  3634. BDD::CProjection(
  3635. const BDD& Y) const
  3636. {
  3637. DdManager *mgr = checkSameManager(Y);
  3638. DdNode *result = Cudd_CProjection(mgr, node, Y.node);
  3639. checkReturnValue(result);
  3640. return BDD(p, result);
  3641. } // BDD::CProjection
  3642. int
  3643. BDD::MinHammingDist(
  3644. int *minterm,
  3645. int upperBound) const
  3646. {
  3647. DdManager *mgr = p->manager;
  3648. int result = Cudd_MinHammingDist(mgr, node, minterm, upperBound);
  3649. return result;
  3650. } // BDD::MinHammingDist
  3651. ADD
  3652. Cudd::Hamming(
  3653. std::vector<ADD> xVars,
  3654. std::vector<ADD> yVars) const
  3655. {
  3656. size_t nVars = xVars.size();
  3657. DdManager *mgr = p->manager;
  3658. DdNode **X = new DdNode *[nVars];
  3659. DdNode **Y = new DdNode *[nVars];
  3660. for (size_t i = 0; i < nVars; i++) {
  3661. X[i] = xVars[i].getNode();
  3662. Y[i] = yVars[i].getNode();
  3663. }
  3664. DdNode *result = Cudd_addHamming(mgr, X, Y, (int) nVars);
  3665. delete [] X;
  3666. delete [] Y;
  3667. checkReturnValue(result);
  3668. return ADD(p, result);
  3669. } // Cudd::Hamming
  3670. ADD
  3671. Cudd::Read(
  3672. FILE * fp,
  3673. std::vector<ADD>& x,
  3674. std::vector<ADD>& y,
  3675. std::vector<ADD>& xn,
  3676. std::vector<ADD>& yn_,
  3677. int * m,
  3678. int * n,
  3679. int bx,
  3680. int sx,
  3681. int by,
  3682. int sy) const
  3683. {
  3684. DdManager *mgr = p->manager;
  3685. DdNode *E;
  3686. DdNode **xa = 0, **ya = 0, **xna = 0, **yna = 0;
  3687. int nx = x.size(), ny = y.size();
  3688. if (nx > 0) {
  3689. xa = (DdNode **) malloc(nx * sizeof(DdNode *));
  3690. if (!xa) {
  3691. p->errorHandler("Out of memory.");
  3692. }
  3693. xna = (DdNode **) malloc(nx * sizeof(DdNode *));
  3694. if (!xna) {
  3695. free(xa);
  3696. p->errorHandler("Out of memory.");
  3697. }
  3698. for (int i = 0; i < nx; ++i) {
  3699. xa[i] = x.at(i).node;
  3700. xna[i] = xn.at(i).node;
  3701. }
  3702. }
  3703. if (ny > 0) {
  3704. ya = (DdNode **) malloc(ny * sizeof(DdNode *));
  3705. if (!ya) {
  3706. free(xa);
  3707. free(xna);
  3708. p->errorHandler("Out of memory.");
  3709. }
  3710. yna = (DdNode **) malloc(ny * sizeof(DdNode *));
  3711. if (!yna) {
  3712. free(xa);
  3713. free(xna);
  3714. free(ya);
  3715. p->errorHandler("Out of memory.");
  3716. }
  3717. for (int j = 0; j < ny; ++j) {
  3718. ya[j] = y.at(j).node;
  3719. yna[j] = yn_.at(j).node;
  3720. }
  3721. }
  3722. int result = Cudd_addRead(fp, mgr, &E, &xa, &ya, &xna, &yna, &nx, &ny,
  3723. m, n, bx, sx, by, sy);
  3724. checkReturnValue(result);
  3725. for (int i = x.size(); i < nx; ++i) {
  3726. x.push_back(ADD(p, xa[i]));
  3727. xn.push_back(ADD(p, xna[i]));
  3728. }
  3729. free(xa);
  3730. free(xna);
  3731. for (int j = y.size(); j < ny; ++j) {
  3732. y.push_back(ADD(p, ya[j]));
  3733. yn_.push_back(ADD(p, yna[j]));
  3734. }
  3735. free(ya);
  3736. free(yna);
  3737. Cudd_Deref(E);
  3738. return ADD(p, E);
  3739. } // Cudd::Read
  3740. BDD
  3741. Cudd::Read(
  3742. FILE * fp,
  3743. std::vector<BDD>& x,
  3744. std::vector<BDD>& y,
  3745. int * m,
  3746. int * n,
  3747. int bx,
  3748. int sx,
  3749. int by,
  3750. int sy) const
  3751. {
  3752. DdManager *mgr = p->manager;
  3753. DdNode *E;
  3754. DdNode **xa = 0, **ya = 0;
  3755. int nx = x.size(), ny = y.size();
  3756. if (nx > 0) {
  3757. xa = (DdNode **) malloc(nx * sizeof(DdNode *));
  3758. if (!xa) {
  3759. p->errorHandler("Out of memory.");
  3760. }
  3761. for (int i = 0; i < nx; ++i) {
  3762. xa[i] = x.at(i).node;
  3763. }
  3764. }
  3765. if (ny > 0) {
  3766. ya = (DdNode **) malloc(ny * sizeof(DdNode *));
  3767. if (!ya) {
  3768. free(xa);
  3769. p->errorHandler("Out of memory.");
  3770. }
  3771. for (int j = 0; j < nx; ++j) {
  3772. ya[j] = y.at(j).node;
  3773. }
  3774. }
  3775. int result = Cudd_bddRead(fp, mgr, &E, &xa, &ya, &nx, &ny,
  3776. m, n, bx, sx, by, sy);
  3777. checkReturnValue(result);
  3778. for (int i = x.size(); i < nx; ++i) {
  3779. x.push_back(BDD(p, xa[i]));
  3780. }
  3781. free(xa);
  3782. for (int j = y.size(); j < ny; ++j) {
  3783. y.push_back(BDD(p, ya[j]));
  3784. }
  3785. free(ya);
  3786. Cudd_Deref(E);
  3787. return BDD(p, E);
  3788. } // Cudd::Read
  3789. void
  3790. Cudd::ReduceHeap(
  3791. Cudd_ReorderingType heuristic,
  3792. int minsize) const
  3793. {
  3794. int result = Cudd_ReduceHeap(p->manager, heuristic, minsize);
  3795. checkReturnValue(result);
  3796. } // Cudd::ReduceHeap
  3797. void
  3798. Cudd::ShuffleHeap(
  3799. int * permutation) const
  3800. {
  3801. int result = Cudd_ShuffleHeap(p->manager, permutation);
  3802. checkReturnValue(result);
  3803. } // Cudd::ShuffleHeap
  3804. ADD
  3805. ADD::Eval(
  3806. int * inputs) const
  3807. {
  3808. DdManager *mgr = p->manager;
  3809. DdNode *result = Cudd_Eval(mgr, node, inputs);
  3810. checkReturnValue(result);
  3811. return ADD(p, result);
  3812. } // ADD::Eval
  3813. BDD
  3814. BDD::Eval(
  3815. int * inputs) const
  3816. {
  3817. DdManager *mgr = p->manager;
  3818. DdNode *result = Cudd_Eval(mgr, node, inputs);
  3819. checkReturnValue(result);
  3820. return BDD(p, result);
  3821. } // BDD::Eval
  3822. BDD
  3823. ABDD::ShortestPath(
  3824. int * weight,
  3825. int * support,
  3826. int * length) const
  3827. {
  3828. DdManager *mgr = p->manager;
  3829. DdNode *result = Cudd_ShortestPath(mgr, node, weight, support, length);
  3830. checkReturnValue(result);
  3831. return BDD(p, result);
  3832. } // ABDD::ShortestPath
  3833. BDD
  3834. ABDD::LargestCube(
  3835. int * length) const
  3836. {
  3837. DdManager *mgr = p->manager;
  3838. DdNode *result = Cudd_LargestCube(mgr, node, length);
  3839. checkReturnValue(result);
  3840. return BDD(p, result);
  3841. } // ABDD::LargestCube
  3842. int
  3843. ABDD::ShortestLength(
  3844. int * weight) const
  3845. {
  3846. DdManager *mgr = p->manager;
  3847. int result = Cudd_ShortestLength(mgr, node, weight);
  3848. checkReturnValue(result != CUDD_OUT_OF_MEM);
  3849. return result;
  3850. } // ABDD::ShortestLength
  3851. BDD
  3852. BDD::Decreasing(
  3853. int i) const
  3854. {
  3855. DdManager *mgr = p->manager;
  3856. DdNode *result = Cudd_Decreasing(mgr, node, i);
  3857. checkReturnValue(result);
  3858. return BDD(p, result);
  3859. } // BDD::Decreasing
  3860. BDD
  3861. BDD::Increasing(
  3862. int i) const
  3863. {
  3864. DdManager *mgr = p->manager;
  3865. DdNode *result = Cudd_Increasing(mgr, node, i);
  3866. checkReturnValue(result);
  3867. return BDD(p, result);
  3868. } // BDD::Increasing
  3869. bool
  3870. ABDD::EquivDC(
  3871. const ABDD& G,
  3872. const ABDD& D) const
  3873. {
  3874. DdManager *mgr = checkSameManager(G);
  3875. checkSameManager(D);
  3876. return Cudd_EquivDC(mgr, node, G.node, D.node);
  3877. } // ABDD::EquivDC
  3878. bool
  3879. BDD::LeqUnless(
  3880. const BDD& G,
  3881. const BDD& D) const
  3882. {
  3883. DdManager *mgr = checkSameManager(G);
  3884. checkSameManager(D);
  3885. int res = Cudd_bddLeqUnless(mgr, node, G.node, D.node);
  3886. return res;
  3887. } // BDD::LeqUnless
  3888. bool
  3889. ADD::EqualSupNorm(
  3890. const ADD& g,
  3891. CUDD_VALUE_TYPE tolerance,
  3892. int pr) const
  3893. {
  3894. DdManager *mgr = checkSameManager(g);
  3895. return Cudd_EqualSupNorm(mgr, node, g.node, tolerance, pr);
  3896. } // ADD::EqualSupNorm
  3897. BDD
  3898. BDD::MakePrime(
  3899. const BDD& F) const
  3900. {
  3901. DdManager *mgr = checkSameManager(F);
  3902. if (!Cudd_CheckCube(mgr, node)) {
  3903. p->errorHandler("Invalid argument.");
  3904. }
  3905. DdNode *result = Cudd_bddMakePrime(mgr, node, F.node);
  3906. checkReturnValue(result);
  3907. return BDD(p, result);
  3908. } // BDD:MakePrime
  3909. BDD
  3910. BDD::MaximallyExpand(
  3911. const BDD& ub,
  3912. const BDD& f)
  3913. {
  3914. DdManager *mgr = checkSameManager(ub);
  3915. checkSameManager(f);
  3916. DdNode *result = Cudd_bddMaximallyExpand(mgr, node, ub.node, f.node);
  3917. checkReturnValue(result);
  3918. return BDD(p, result);
  3919. } // BDD::MaximallyExpand
  3920. BDD
  3921. BDD::LargestPrimeUnate(
  3922. const BDD& phases)
  3923. {
  3924. DdManager *mgr = checkSameManager(phases);
  3925. DdNode *result = Cudd_bddLargestPrimeUnate(mgr, node, phases.node);
  3926. checkReturnValue(result);
  3927. return BDD(p, result);
  3928. } // BDD::LargestPrimeUnate
  3929. double *
  3930. ABDD::CofMinterm() const
  3931. {
  3932. DdManager *mgr = p->manager;
  3933. double *result = Cudd_CofMinterm(mgr, node);
  3934. checkReturnValue(result);
  3935. return result;
  3936. } // ABDD::CofMinterm
  3937. BDD
  3938. BDD::SolveEqn(
  3939. const BDD& Y,
  3940. std::vector<BDD> & G,
  3941. int ** yIndex,
  3942. int n) const
  3943. {
  3944. DdManager *mgr = checkSameManager(Y);
  3945. DdNode **g = new DdNode *[n];
  3946. DdNode *result = Cudd_SolveEqn(mgr, node, Y.node, g, yIndex, n);
  3947. checkReturnValue(result);
  3948. for (int i = 0; i < n; i++) {
  3949. G.push_back(BDD(p, g[i]));
  3950. Cudd_RecursiveDeref(mgr,g[i]);
  3951. }
  3952. delete [] g;
  3953. return BDD(p, result);
  3954. } // BDD::SolveEqn
  3955. BDD
  3956. BDD::VerifySol(
  3957. std::vector<BDD> const & G,
  3958. int * yIndex) const
  3959. {
  3960. size_t n = G.size();
  3961. DdManager *mgr = p->manager;
  3962. DdNode **g = new DdNode *[n];
  3963. for (size_t i = 0; i < n; i++) {
  3964. g[i] = G[i].node;
  3965. }
  3966. DdNode *result = Cudd_VerifySol(mgr, node, g, yIndex, (int) n);
  3967. delete [] g;
  3968. checkReturnValue(result);
  3969. return BDD(p, result);
  3970. } // BDD::VerifySol
  3971. BDD
  3972. BDD::SplitSet(
  3973. std::vector<BDD> xVars,
  3974. double m) const
  3975. {
  3976. size_t n = xVars.size();
  3977. DdManager *mgr = p->manager;
  3978. DdNode **X = new DdNode *[n];
  3979. for (size_t i = 0; i < n; i++) {
  3980. X[i] = xVars[i].node;
  3981. }
  3982. DdNode *result = Cudd_SplitSet(mgr, node, X, (int) n, m);
  3983. delete [] X;
  3984. checkReturnValue(result);
  3985. return BDD(p, result);
  3986. } // BDD::SplitSet
  3987. BDD
  3988. BDD::SubsetHeavyBranch(
  3989. int numVars,
  3990. int threshold) const
  3991. {
  3992. DdManager *mgr = p->manager;
  3993. DdNode *result = Cudd_SubsetHeavyBranch(mgr, node, numVars, threshold);
  3994. checkReturnValue(result);
  3995. return BDD(p, result);
  3996. } // BDD::SubsetHeavyBranch
  3997. BDD
  3998. BDD::SupersetHeavyBranch(
  3999. int numVars,
  4000. int threshold) const
  4001. {
  4002. DdManager *mgr = p->manager;
  4003. DdNode *result = Cudd_SupersetHeavyBranch(mgr, node, numVars, threshold);
  4004. checkReturnValue(result);
  4005. return BDD(p, result);
  4006. } // BDD::SupersetHeavyBranch
  4007. BDD
  4008. BDD::SubsetShortPaths(
  4009. int numVars,
  4010. int threshold,
  4011. bool hardlimit) const
  4012. {
  4013. DdManager *mgr = p->manager;
  4014. DdNode *result = Cudd_SubsetShortPaths(mgr, node, numVars, threshold, hardlimit);
  4015. checkReturnValue(result);
  4016. return BDD(p, result);
  4017. } // BDD::SubsetShortPaths
  4018. BDD
  4019. BDD::SupersetShortPaths(
  4020. int numVars,
  4021. int threshold,
  4022. bool hardlimit) const
  4023. {
  4024. DdManager *mgr = p->manager;
  4025. DdNode *result = Cudd_SupersetShortPaths(mgr, node, numVars, threshold, hardlimit);
  4026. checkReturnValue(result);
  4027. return BDD(p, result);
  4028. } // BDD::SupersetShortPaths
  4029. void
  4030. Cudd::SymmProfile(
  4031. int lower,
  4032. int upper) const
  4033. {
  4034. Cudd_SymmProfile(p->manager, lower, upper);
  4035. } // Cudd::SymmProfile
  4036. unsigned int
  4037. Cudd::Prime(
  4038. unsigned int pr) const
  4039. {
  4040. return Cudd_Prime(pr);
  4041. } // Cudd::Prime
  4042. void
  4043. Cudd::Reserve(
  4044. int amount) const
  4045. {
  4046. int result = Cudd_Reserve(p->manager, amount);
  4047. checkReturnValue(result);
  4048. } // Cudd::Reserve
  4049. void
  4050. ABDD::PrintMinterm() const
  4051. {
  4052. cout.flush();
  4053. DdManager *mgr = p->manager;
  4054. int result = Cudd_PrintMinterm(mgr, node);
  4055. checkReturnValue(result);
  4056. } // ABDD::PrintMinterm
  4057. void
  4058. BDD::PrintCover() const
  4059. {
  4060. cout.flush();
  4061. DdManager *mgr = p->manager;
  4062. int result = Cudd_bddPrintCover(mgr, node, node);
  4063. checkReturnValue(result);
  4064. } // BDD::PrintCover
  4065. void
  4066. BDD::PrintCover(
  4067. const BDD& u) const
  4068. {
  4069. checkSameManager(u);
  4070. cout.flush();
  4071. DdManager *mgr = p->manager;
  4072. int result = Cudd_bddPrintCover(mgr, node, u.node);
  4073. checkReturnValue(result);
  4074. } // BDD::PrintCover
  4075. int
  4076. BDD::EstimateCofactor(
  4077. int i,
  4078. int phase) const
  4079. {
  4080. DdManager *mgr = p->manager;
  4081. int result = Cudd_EstimateCofactor(mgr, node, i, phase);
  4082. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4083. return result;
  4084. } // BDD::EstimateCofactor
  4085. int
  4086. BDD::EstimateCofactorSimple(
  4087. int i) const
  4088. {
  4089. int result = Cudd_EstimateCofactorSimple(node, i);
  4090. return result;
  4091. } // BDD::EstimateCofactorSimple
  4092. int
  4093. Cudd::SharingSize(
  4094. DD* nodes,
  4095. int n) const
  4096. {
  4097. DdNode **nodeArray = new DdNode *[n];
  4098. for (int i = 0; i < n; i++) {
  4099. nodeArray[i] = nodes[i].getNode();
  4100. }
  4101. int result = Cudd_SharingSize(nodeArray, n);
  4102. delete [] nodeArray;
  4103. checkReturnValue(n == 0 || result > 0);
  4104. return result;
  4105. } // Cudd::SharingSize
  4106. int
  4107. Cudd::SharingSize(
  4108. const std::vector<BDD>& v) const
  4109. {
  4110. vector<BDD>::size_type n = v.size();
  4111. DdNode **nodeArray = new DdNode *[n];
  4112. for (vector<BDD>::size_type i = 0; i != n; ++i) {
  4113. nodeArray[i] = v[i].getNode();
  4114. }
  4115. int result = Cudd_SharingSize(nodeArray, (int) n);
  4116. delete [] nodeArray;
  4117. checkReturnValue(n == 0 || result > 0);
  4118. return result;
  4119. } // Cudd::SharingSize
  4120. double
  4121. ABDD::CountMinterm(
  4122. int nvars) const
  4123. {
  4124. DdManager *mgr = p->manager;
  4125. double result = Cudd_CountMinterm(mgr, node, nvars);
  4126. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4127. return result;
  4128. } // ABDD::CountMinterm
  4129. double
  4130. ABDD::CountPath() const
  4131. {
  4132. double result = Cudd_CountPath(node);
  4133. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4134. return result;
  4135. } // ABDD::CountPath
  4136. BDD
  4137. ABDD::Support() const
  4138. {
  4139. DdManager *mgr = p->manager;
  4140. DdNode *result = Cudd_Support(mgr, node);
  4141. checkReturnValue(result);
  4142. return BDD(p, result);
  4143. } // ABDD::Support
  4144. int
  4145. ABDD::SupportSize() const
  4146. {
  4147. DdManager *mgr = p->manager;
  4148. int result = Cudd_SupportSize(mgr, node);
  4149. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4150. return result;
  4151. } // ABDD::SupportSize
  4152. BDD
  4153. Cudd::VectorSupport(const std::vector<BDD>& roots) const
  4154. {
  4155. size_t n = roots.size();
  4156. DdManager *mgr = p->manager;
  4157. DdNode **F = new DdNode *[n];
  4158. for (size_t i = 0; i < n; i++) {
  4159. F[i] = roots[i].getNode();
  4160. }
  4161. DdNode *result = Cudd_VectorSupport(mgr, F, (int) n);
  4162. delete [] F;
  4163. checkReturnValue(result);
  4164. return BDD(p, result);
  4165. } // Cudd::VectorSupport
  4166. std::vector<unsigned int>
  4167. ABDD::SupportIndices() const
  4168. {
  4169. unsigned int *support;
  4170. DdManager *mgr = p->manager;
  4171. int size = Cudd_SupportIndices(mgr, node, (int **)&support);
  4172. checkReturnValue(size >= 0);
  4173. // size could be 0, in which case support is 0 too!
  4174. vector<unsigned int> indices(support, support+size);
  4175. if (support) free(support);
  4176. return indices;
  4177. } // ABDD::SupportIndices
  4178. std::vector<unsigned int>
  4179. Cudd::SupportIndices(const std::vector<BDD>& roots) const
  4180. {
  4181. unsigned int *support;
  4182. size_t n = roots.size();
  4183. DdManager *mgr = p->manager;
  4184. DdNode **F = new DdNode *[n];
  4185. for (size_t i = 0; i < n; i++) {
  4186. F[i] = roots[i].getNode();
  4187. }
  4188. int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support);
  4189. delete [] F;
  4190. checkReturnValue(size >= 0);
  4191. // size could be 0, in which case support is 0 too!
  4192. vector<unsigned int> indices(support, support+size);
  4193. if (support) free(support);
  4194. return indices;
  4195. } // Cudd::SupportIndices
  4196. std::vector<unsigned int>
  4197. Cudd::SupportIndices(const std::vector<ADD>& roots) const
  4198. {
  4199. unsigned int *support;
  4200. size_t n = roots.size();
  4201. DdManager *mgr = p->manager;
  4202. DdNode **F = new DdNode *[n];
  4203. for (size_t i = 0; i < n; i++) {
  4204. F[i] = roots[i].getNode();
  4205. }
  4206. int size = Cudd_VectorSupportIndices(mgr, F, (int) n, (int **)&support);
  4207. delete [] F;
  4208. checkReturnValue(size >= 0);
  4209. // size could be 0, in which case support is 0 too!
  4210. vector<unsigned int> indices(support, support+size);
  4211. if (support) free(support);
  4212. return indices;
  4213. } // Cudd::SupportIndices
  4214. int
  4215. Cudd::nodeCount(const std::vector<BDD>& roots) const
  4216. {
  4217. size_t n = roots.size();
  4218. DdNode **nodeArray = new DdNode *[n];
  4219. for (size_t i = 0; i < n; i++) {
  4220. nodeArray[i] = roots[i].getNode();
  4221. }
  4222. int result = Cudd_SharingSize(nodeArray, (int) n);
  4223. delete [] nodeArray;
  4224. checkReturnValue(result > 0);
  4225. return result;
  4226. } // Cudd::nodeCount
  4227. BDD
  4228. Cudd::VectorSupport(const std::vector<ADD>& roots) const
  4229. {
  4230. size_t n = roots.size();
  4231. DdManager *mgr = p->manager;
  4232. DdNode **F = new DdNode *[n];
  4233. for (size_t i = 0; i < n; i++) {
  4234. F[i] = roots[i].getNode();
  4235. }
  4236. DdNode *result = Cudd_VectorSupport(mgr, F, (int) n);
  4237. delete [] F;
  4238. checkReturnValue(result);
  4239. return BDD(p, result);
  4240. } // Cudd::VectorSupport
  4241. int
  4242. Cudd::VectorSupportSize(const std::vector<BDD>& roots) const
  4243. {
  4244. size_t n = roots.size();
  4245. DdManager *mgr = p->manager;
  4246. DdNode **F = new DdNode *[n];
  4247. for (size_t i = 0; i < n; i++) {
  4248. F[i] = roots[i].getNode();
  4249. }
  4250. int result = Cudd_VectorSupportSize(mgr, F, (int) n);
  4251. delete [] F;
  4252. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4253. return result;
  4254. } // Cudd::VectorSupportSize
  4255. int
  4256. Cudd::VectorSupportSize(const std::vector<ADD>& roots) const
  4257. {
  4258. size_t n = roots.size();
  4259. DdManager *mgr = p->manager;
  4260. DdNode **F = new DdNode *[n];
  4261. for (size_t i = 0; i < n; i++) {
  4262. F[i] = roots[i].getNode();
  4263. }
  4264. int result = Cudd_VectorSupportSize(mgr, F, (int) n);
  4265. delete [] F;
  4266. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4267. return result;
  4268. } // Cudd::VectorSupportSize
  4269. void
  4270. ABDD::ClassifySupport(
  4271. const ABDD& g,
  4272. BDD* common,
  4273. BDD* onlyF,
  4274. BDD* onlyG) const
  4275. {
  4276. DdManager *mgr = checkSameManager(g);
  4277. DdNode *C, *F, *G;
  4278. int result = Cudd_ClassifySupport(mgr, node, g.node, &C, &F, &G);
  4279. checkReturnValue(result);
  4280. *common = BDD(p, C);
  4281. *onlyF = BDD(p, F);
  4282. *onlyG = BDD(p, G);
  4283. } // ABDD::ClassifySupport
  4284. int
  4285. ABDD::CountLeaves() const
  4286. {
  4287. return Cudd_CountLeaves(node);
  4288. } // ABDD::CountLeaves
  4289. void
  4290. BDD::PickOneCube(
  4291. char * string) const
  4292. {
  4293. DdManager *mgr = p->manager;
  4294. int result = Cudd_bddPickOneCube(mgr, node, string);
  4295. checkReturnValue(result);
  4296. } // BDD::PickOneCube
  4297. BDD
  4298. BDD::PickOneMinterm(
  4299. std::vector<BDD> vars) const
  4300. {
  4301. size_t n = vars.size();
  4302. DdManager *mgr = p->manager;
  4303. DdNode **V = new DdNode *[n];
  4304. for (size_t i = 0; i < n; i++) {
  4305. V[i] = vars[i].node;
  4306. }
  4307. DdNode *result = Cudd_bddPickOneMinterm(mgr, node, V, (int) n);
  4308. delete [] V;
  4309. checkReturnValue(result);
  4310. return BDD(p, result);
  4311. } // BDD::PickOneMinterm
  4312. BDD
  4313. Cudd::bddComputeCube(
  4314. BDD * vars,
  4315. int * phase,
  4316. int n) const
  4317. {
  4318. DdManager *mgr = p->manager;
  4319. DdNode **V = new DdNode *[n];
  4320. for (int i = 0; i < n; i++) {
  4321. V[i] = vars[i].getNode();
  4322. }
  4323. DdNode *result = Cudd_bddComputeCube(mgr, V, phase, n);
  4324. delete [] V;
  4325. checkReturnValue(result);
  4326. return BDD(p, result);
  4327. } // Cudd::bddComputeCube
  4328. BDD
  4329. Cudd::computeCube(
  4330. std::vector<BDD> const & vars) const
  4331. {
  4332. DdManager *mgr = p->manager;
  4333. size_t n = vars.size();
  4334. DdNode **V = new DdNode *[n];
  4335. for (size_t i = 0; i < n; i++) {
  4336. V[i] = vars[i].getNode();
  4337. }
  4338. DdNode *result = Cudd_bddComputeCube(mgr, V, 0, n);
  4339. delete [] V;
  4340. checkReturnValue(result);
  4341. return BDD(p, result);
  4342. } // Cudd::computeCube
  4343. ADD
  4344. Cudd::addComputeCube(
  4345. ADD * vars,
  4346. int * phase,
  4347. int n) const
  4348. {
  4349. DdManager *mgr = p->manager;
  4350. DdNode **V = new DdNode *[n];
  4351. for (int i = 0; i < n; i++) {
  4352. V[i] = vars[i].getNode();
  4353. }
  4354. DdNode *result = Cudd_addComputeCube(mgr, V, phase, n);
  4355. delete [] V;
  4356. checkReturnValue(result);
  4357. return ADD(p, result);
  4358. } // Cudd::addComputeCube
  4359. ADD
  4360. Cudd::computeCube(
  4361. std::vector<ADD> const & vars) const
  4362. {
  4363. DdManager *mgr = p->manager;
  4364. size_t n = vars.size();
  4365. DdNode **V = new DdNode *[n];
  4366. for (size_t i = 0; i < n; i++) {
  4367. V[i] = vars[i].getNode();
  4368. }
  4369. DdNode *result = Cudd_addComputeCube(mgr, V, 0, n);
  4370. delete [] V;
  4371. checkReturnValue(result);
  4372. return ADD(p, result);
  4373. } // Cudd::computeCube
  4374. BDD
  4375. Cudd::IndicesToCube(
  4376. int * array,
  4377. int n) const
  4378. {
  4379. DdNode *result = Cudd_IndicesToCube(p->manager, array, n);
  4380. checkReturnValue(result);
  4381. return BDD(p, result);
  4382. } // Cudd::IndicesToCube
  4383. void
  4384. Cudd::PrintVersion(
  4385. FILE * fp) const
  4386. {
  4387. cout.flush();
  4388. Cudd_PrintVersion(fp);
  4389. } // Cudd::PrintVersion
  4390. double
  4391. Cudd::AverageDistance() const
  4392. {
  4393. return Cudd_AverageDistance(p->manager);
  4394. } // Cudd::AverageDistance
  4395. int32_t
  4396. Cudd::Random() const
  4397. {
  4398. return Cudd_Random(p->manager);
  4399. } // Cudd::Random
  4400. void
  4401. Cudd::Srandom(
  4402. int32_t seed) const
  4403. {
  4404. Cudd_Srandom(p->manager,seed);
  4405. } // Cudd::Srandom
  4406. double
  4407. ABDD::Density(
  4408. int nvars) const
  4409. {
  4410. DdManager *mgr = p->manager;
  4411. double result = Cudd_Density(mgr, node, nvars);
  4412. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4413. return result;
  4414. } // ABDD::Density
  4415. int
  4416. ZDD::Count() const
  4417. {
  4418. DdManager *mgr = p->manager;
  4419. int result = Cudd_zddCount(mgr, node);
  4420. checkReturnValue(result != CUDD_OUT_OF_MEM);
  4421. return result;
  4422. } // ZDD::Count
  4423. double
  4424. ZDD::CountDouble() const
  4425. {
  4426. DdManager *mgr = p->manager;
  4427. double result = Cudd_zddCountDouble(mgr, node);
  4428. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4429. return result;
  4430. } // ZDD::CountDouble
  4431. ZDD
  4432. ZDD::Product(
  4433. const ZDD& g) const
  4434. {
  4435. DdManager *mgr = checkSameManager(g);
  4436. DdNode *result = Cudd_zddProduct(mgr, node, g.node);
  4437. checkReturnValue(result);
  4438. return ZDD(p, result);
  4439. } // ZDD::Product
  4440. ZDD
  4441. ZDD::UnateProduct(
  4442. const ZDD& g) const
  4443. {
  4444. DdManager *mgr = checkSameManager(g);
  4445. DdNode *result = Cudd_zddUnateProduct(mgr, node, g.node);
  4446. checkReturnValue(result);
  4447. return ZDD(p, result);
  4448. } // ZDD::UnateProduct
  4449. ZDD
  4450. ZDD::WeakDiv(
  4451. const ZDD& g) const
  4452. {
  4453. DdManager *mgr = checkSameManager(g);
  4454. DdNode *result = Cudd_zddWeakDiv(mgr, node, g.node);
  4455. checkReturnValue(result);
  4456. return ZDD(p, result);
  4457. } // ZDD::WeakDiv
  4458. ZDD
  4459. ZDD::Divide(
  4460. const ZDD& g) const
  4461. {
  4462. DdManager *mgr = checkSameManager(g);
  4463. DdNode *result = Cudd_zddDivide(mgr, node, g.node);
  4464. checkReturnValue(result);
  4465. return ZDD(p, result);
  4466. } // ZDD::Divide
  4467. ZDD
  4468. ZDD::WeakDivF(
  4469. const ZDD& g) const
  4470. {
  4471. DdManager *mgr = checkSameManager(g);
  4472. DdNode *result = Cudd_zddWeakDivF(mgr, node, g.node);
  4473. checkReturnValue(result);
  4474. return ZDD(p, result);
  4475. } // ZDD::WeakDivF
  4476. ZDD
  4477. ZDD::DivideF(
  4478. const ZDD& g) const
  4479. {
  4480. DdManager *mgr = checkSameManager(g);
  4481. DdNode *result = Cudd_zddDivideF(mgr, node, g.node);
  4482. checkReturnValue(result);
  4483. return ZDD(p, result);
  4484. } // ZDD::DivideF
  4485. MtrNode *
  4486. Cudd::MakeZddTreeNode(
  4487. unsigned int low,
  4488. unsigned int size,
  4489. unsigned int type) const
  4490. {
  4491. return Cudd_MakeZddTreeNode(p->manager, low, size, type);
  4492. } // Cudd::MakeZddTreeNode
  4493. BDD
  4494. BDD::zddIsop(
  4495. const BDD& U,
  4496. ZDD* zdd_I) const
  4497. {
  4498. DdManager *mgr = checkSameManager(U);
  4499. DdNode *Z;
  4500. DdNode *result = Cudd_zddIsop(mgr, node, U.node, &Z);
  4501. checkReturnValue(result);
  4502. *zdd_I = ZDD(p, Z);
  4503. return BDD(p, result);
  4504. } // BDD::Isop
  4505. BDD
  4506. BDD::Isop(
  4507. const BDD& U) const
  4508. {
  4509. DdManager *mgr = checkSameManager(U);
  4510. DdNode *result = Cudd_bddIsop(mgr, node, U.node);
  4511. checkReturnValue(result);
  4512. return BDD(p, result);
  4513. } // BDD::Isop
  4514. double
  4515. ZDD::CountMinterm(
  4516. int path) const
  4517. {
  4518. DdManager *mgr = p->manager;
  4519. double result = Cudd_zddCountMinterm(mgr, node, path);
  4520. checkReturnValue(result != (double) CUDD_OUT_OF_MEM);
  4521. return result;
  4522. } // ZDD::CountMinterm
  4523. void
  4524. Cudd::zddPrintSubtable() const
  4525. {
  4526. cout.flush();
  4527. Cudd_zddPrintSubtable(p->manager);
  4528. } // Cudd::zddPrintSubtable
  4529. ZDD
  4530. BDD::PortToZdd() const
  4531. {
  4532. DdManager *mgr = p->manager;
  4533. DdNode *result = Cudd_zddPortFromBdd(mgr, node);
  4534. checkReturnValue(result);
  4535. return ZDD(p, result);
  4536. } // BDD::PortToZdd
  4537. BDD
  4538. ZDD::PortToBdd() const
  4539. {
  4540. DdManager *mgr = p->manager;
  4541. DdNode *result = Cudd_zddPortToBdd(mgr, node);
  4542. checkReturnValue(result);
  4543. return BDD(p, result);
  4544. } // ZDD::PortToBdd
  4545. void
  4546. Cudd::zddReduceHeap(
  4547. Cudd_ReorderingType heuristic,
  4548. int minsize) const
  4549. {
  4550. int result = Cudd_zddReduceHeap(p->manager, heuristic, minsize);
  4551. checkReturnValue(result);
  4552. } // Cudd::zddReduceHeap
  4553. void
  4554. Cudd::zddShuffleHeap(
  4555. int * permutation) const
  4556. {
  4557. int result = Cudd_zddShuffleHeap(p->manager, permutation);
  4558. checkReturnValue(result);
  4559. } // Cudd::zddShuffleHeap
  4560. ZDD
  4561. ZDD::Ite(
  4562. const ZDD& g,
  4563. const ZDD& h) const
  4564. {
  4565. DdManager *mgr = checkSameManager(g);
  4566. checkSameManager(h);
  4567. DdNode *result = Cudd_zddIte(mgr, node, g.node, h.node);
  4568. checkReturnValue(result);
  4569. return ZDD(p, result);
  4570. } // ZDD::Ite
  4571. ZDD
  4572. ZDD::Union(
  4573. const ZDD& Q) const
  4574. {
  4575. DdManager *mgr = checkSameManager(Q);
  4576. DdNode *result = Cudd_zddUnion(mgr, node, Q.node);
  4577. checkReturnValue(result);
  4578. return ZDD(p, result);
  4579. } // ZDD::Union
  4580. ZDD
  4581. ZDD::Intersect(
  4582. const ZDD& Q) const
  4583. {
  4584. DdManager *mgr = checkSameManager(Q);
  4585. DdNode *result = Cudd_zddIntersect(mgr, node, Q.node);
  4586. checkReturnValue(result);
  4587. return ZDD(p, result);
  4588. } // ZDD::Intersect
  4589. ZDD
  4590. ZDD::Diff(
  4591. const ZDD& Q) const
  4592. {
  4593. DdManager *mgr = checkSameManager(Q);
  4594. DdNode *result = Cudd_zddDiff(mgr, node, Q.node);
  4595. checkReturnValue(result);
  4596. return ZDD(p, result);
  4597. } // ZDD::Diff
  4598. ZDD
  4599. ZDD::DiffConst(
  4600. const ZDD& Q) const
  4601. {
  4602. DdManager *mgr = checkSameManager(Q);
  4603. DdNode *result = Cudd_zddDiffConst(mgr, node, Q.node);
  4604. checkReturnValue(result);
  4605. return ZDD(p, result);
  4606. } // ZDD::DiffConst
  4607. ZDD
  4608. ZDD::Subset1(
  4609. int var) const
  4610. {
  4611. DdManager *mgr = p->manager;
  4612. DdNode *result = Cudd_zddSubset1(mgr, node, var);
  4613. checkReturnValue(result);
  4614. return ZDD(p, result);
  4615. } // ZDD::Subset1
  4616. ZDD
  4617. ZDD::Subset0(
  4618. int var) const
  4619. {
  4620. DdManager *mgr = p->manager;
  4621. DdNode *result = Cudd_zddSubset0(mgr, node, var);
  4622. checkReturnValue(result);
  4623. return ZDD(p, result);
  4624. } // ZDD::Subset0
  4625. ZDD
  4626. ZDD::Change(
  4627. int var) const
  4628. {
  4629. DdManager *mgr = p->manager;
  4630. DdNode *result = Cudd_zddChange(mgr, node, var);
  4631. checkReturnValue(result);
  4632. return ZDD(p, result);
  4633. } // ZDD::Change
  4634. void
  4635. Cudd::zddSymmProfile(
  4636. int lower,
  4637. int upper) const
  4638. {
  4639. Cudd_zddSymmProfile(p->manager, lower, upper);
  4640. } // Cudd::zddSymmProfile
  4641. void
  4642. ZDD::PrintMinterm() const
  4643. {
  4644. cout.flush();
  4645. DdManager *mgr = p->manager;
  4646. int result = Cudd_zddPrintMinterm(mgr, node);
  4647. checkReturnValue(result);
  4648. } // ZDD::PrintMinterm
  4649. void
  4650. ZDD::PrintCover() const
  4651. {
  4652. cout.flush();
  4653. DdManager *mgr = p->manager;
  4654. int result = Cudd_zddPrintCover(mgr, node);
  4655. checkReturnValue(result);
  4656. } // ZDD::PrintCover
  4657. BDD
  4658. ZDD::Support() const
  4659. {
  4660. DdManager *mgr = p->manager;
  4661. DdNode *result = Cudd_zddSupport(mgr, node);
  4662. checkReturnValue(result);
  4663. return BDD(p, result);
  4664. } // ZDD::Support
  4665. void
  4666. Cudd::DumpDot(
  4667. const std::vector<ZDD>& nodes,
  4668. char const * const * inames,
  4669. char const * const * onames,
  4670. FILE * fp) const
  4671. {
  4672. DdManager *mgr = p->manager;
  4673. size_t n = nodes.size();
  4674. DdNode **F = new DdNode *[n];
  4675. for (size_t i = 0; i < n; i++) {
  4676. F[i] = nodes[i].getNode();
  4677. }
  4678. int result = Cudd_zddDumpDot(mgr, (int) n, F, inames, onames, fp);
  4679. delete [] F;
  4680. checkReturnValue(result);
  4681. } // vector<ZDD>::DumpDot
  4682. std::string
  4683. Cudd::OrderString(void) const
  4684. {
  4685. DdManager * mgr = p->manager;
  4686. int nvars = Cudd_ReadSize(mgr);
  4687. bool hasNames = p->varnames.size() == (size_t) nvars;
  4688. std::ostringstream oss;
  4689. std::string separ = "";
  4690. for (int level = 0; level != nvars; ++level) {
  4691. oss << separ;
  4692. separ = " ";
  4693. int index = Cudd_ReadInvPerm(mgr, level);
  4694. if (hasNames) {
  4695. oss << p->varnames.at(index);
  4696. } else {
  4697. oss << "x" << index;
  4698. }
  4699. }
  4700. return oss.str();
  4701. } // Cudd::OrderString