package Ġme . n allen . mod ular code generation . codegen . vh dl Ċ Ċ import Ġcom . hub spot . jin java . J in java Ċ import Ġme . n allen . mod ular code generation . codegen . CodeGen Manager Ċ import Ġme . n allen . mod ular code generation . codegen . Configuration Ċ import Ġme . n allen . mod ular code generation . codegen . Sat uration Direction Ċ import Ġme . n allen . mod ular code generation . hybrid autom ata .* Ċ import Ġme . n allen . mod ular code generation . hybrid autom ata . Local ity Ċ import Ġme . n allen . mod ular code generation . par set ree .* Ċ import Ġme . n allen . mod ular code generation . par set ree . Variable Ċ import Ġme . n allen . mod ular code generation . codegen . vh dl . Utils . Variable Object Ċ import Ġme . n allen . mod ular code generation . codegen . vh dl . Utils . Custom Function Object Ċ import Ġme . n allen . mod ular code generation . logging . Logger Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ /** Ċ Ġ* ĠThe Ġclass Ġthat Ġcontains Ġmethods Ġto Ġdo Ġwith Ġthe Ġgeneration Ġof Ġa Ġsingle ĠAutom aton Ċ Ġ*/ Ċ object ĠAutom ata Generator Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġa Ġstring Ġthat Ġrepresents Ġthe Ġgiven ĠHy brid ĠAutom ata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgenerate ( item : ĠHy brid Autom ata , Ġconfig : ĠConfiguration Ġ= ĠConfiguration ()): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġj in java Ġ= ĠJ in java () ĊĊĠĠĠĠĠĠĠ Ġval Ġtemplate Ġ= Ġthis :: class . java . class Loader . getResource (" templates / vh dl / autom ata . vh dl "). read Text () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġdata Ġabout Ġthe Ġroot Ġitem ĊĠĠĠĠĠĠĠ Ġval Ġroot Item Ġ= ĠAutom ata FileObject ( Utils . create TypeName ( item . name )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġkeep Ġa Ġmap Ġof Ġsignal Ġnames Ġso Ġthat Ġwe Ġcan Ġreplace ĊĠĠĠĠĠĠĠ Ġval Ġsignal Name Map Ġ= ĠHashMap < String , ĠString >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġneed Ġto Ġgo Ġthrough Ġeach Ġvariable Ġof Ġthis ĠNetwork ĊĠĠĠĠĠĠĠ Ġfor ( variable Ġin Ġitem . variables . sorted With ( compare By ({ Ġit . locality Ġ}, Ġ{ Ġit . type Ġ} ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDelay ed Ġvariables Ġare Ġnot Ġcurrently Ġsupported Ġin ĠV H DL , Ġso Ġwe Ġcurrently Ġerror Ġout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( variable . can Be Delayed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotImplementedError (" Delayed Ġvariables Ġare Ġcurrently Ġnot Ġsupported Ġin ĠV H DL ĠGeneration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDep ending Ġon Ġthe Ġparame tr isation Ġmethod , Ġwe 'll Ġdo Ġthings Ġslightly Ġdifferently ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . compile Time Parame tr isation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġvariable Ġobject Ġthat Ġmatches Ġthe Ġvariable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Object Ġ= ĠVariable Object . create ( variable , Ġitem . init . valu ations ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġsignal Ġname Ġthat Ġwe Ġuse Ġdepends Ġon Ġthe Ġtype Ġit Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( variable . locality Ġ== ĠLoc ality . EXTERNAL _ INPUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit 's Ġan Ġexternal Ġinput Ġvariable Ġthen Ġwe Ġuse Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Name Map [ variable . name ] Ġ= Ġvariable Object . io ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise Ġwe Ġuse Ġan Ġinternal Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Name Map [ variable . name ] Ġ= Ġvariable Object . signal ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġadd Ġeither Ġthe Ġsignal Ġor Ġthe Ġparameter Ġto Ġthe Ġbase Ġcomponent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( variable . locality Ġ== ĠLoc ality . PARAMETER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . parameters . add ( variable Object ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . variables . add ( variable Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEverything Ġneeds Ġto Ġbecome Ġan Ġexternal ĠI / O Ġsignal , Ġso Ġlet 's Ġdo Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( variable . locality Ġ== ĠLoc ality . INTERNAL Ġ|| Ġvariable . locality Ġ== ĠLoc ality . EXTERNAL _ OUTPUT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen Ġwe Ġneed Ġto Ġdeal Ġwith Ġboth Ġthe Ġinput Ġand Ġoutput Ġsince Ġthe Ġvalue Ġcould Ġbe Ġrelative Ġto Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġoriginal , Ġand Ġwe Ġneed Ġto Ġsave Ġthe Ġoutput ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLet 's Ġstart Ġwith Ġthe Ġinput Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Object In Ġ= ĠVariable Object . create ( variable . copy ( locality Ġ= ĠLoc ality . EXTERNAL _ INPUT ), Ġruntime Parame tr isation Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġstill Ġwant Ġit Ġto Ġbe Ġnamed Ġcorrectly Ġthough ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Object In . locality Ġ= Ġvariable . locality . getText ual Name () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġkeep Ġtrack Ġof Ġthe Ġvariable Ġwhen Ġwe Ġwant Ġto Ġuse Ġit , Ġand Ġadd Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Name Map [ variable . name ] Ġ= Ġvariable Object In . io ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . variables . add ( variable Object In ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġlet 's Ġdeal Ġwith Ġthe Ġoutput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Object Out Ġ= ĠVariable Object . create ( variable . copy ( locality Ġ= ĠLoc ality . EXTERNAL _ OUTPUT ), Ġitem . init . valu ations , Ġruntime Parame tr isation Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġname Ġit Ġcorrectly ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Object Out . locality Ġ= Ġvariable . locality . getText ual Name () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġadd Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . variables . add ( variable Object Out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOtherwise Ġit 's Ġeither Ġan Ġexternal Ġinput Ġor Ġparameter , Ġwhich Ġwe Ġonly Ġneed Ġto Ġcreate Ġan Ġinput Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariable Object Ġ= ĠVariable Object . create ( variable , Ġruntime Parame tr isation Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThen Ġkeep Ġtrack Ġof Ġit , Ġand Ġadd Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignal Name Map [ variable . name ] Ġ= Ġvariable Object . io ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . variables . add ( variable Object ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġit 's Ġtime Ġto Ġcreate Ġall Ġthe Ġfunctions Ġthat Ġwe Ġneed ĊĠĠĠĠĠĠĠ Ġval Ġfunction Params Ġ= ĠHashMap < String , ĠArrayList < ParseTree Item >>() ĊĊĠĠĠĠĠĠĠ Ġ// ĠIterate Ġthrough Ġevery Ġfunction Ġwe Ġwant Ġto Ġdeclare ĊĠĠĠĠĠĠĠ Ġfor ( func Ġin Ġitem . functions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġfunction Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Object Ġ= ĠCustom Function Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . create FunctionName ( func . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . generate Basic VH DL Type ( func . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġkeep Ġtrack Ġof Ġ( extra ) Ġparameters Ġthat Ġare Ġneeded Ġfor Ġeach Ġfunction Ġcall . ĠThis Ġwill Ġbasically Ġjust Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparameters Ġthat Ġare Ġfed Ġinto Ġthis Ġautom aton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Params [ func . name ] Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIterate Ġover Ġevery Ġinput Ġto Ġthe Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( input Ġin Ġfunc . inputs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġthen Ġwe Ġwant Ġto Ġadd Ġthat Ġto Ġthe Ġfunction Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Object . inputs . add ( Variable Object . create ( me . n allen . mod ular code generation . hybrid autom ata . Variable ( input . name , Ġinput . type , ĠLoc ality . EXTERNAL _ INPUT , Ġinput . defaultValue ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġalso Ġneed Ġto Ġfind Ġall Ġof Ġthe Ġinternal Ġvariables Ġthat Ġwe Ġneed , Ġthis Ġis Ġany Ġinternal Ġvariable Ġwhich ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġisn 't Ġa Ġparameter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( internal Ġin Ġfunc . logic . variables . filter Ġ{ it . locality Ġ== ĠParse Tree Local ity . INTERNAL }) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġthen Ġwe Ġcan Ġadd Ġinternal Ġvariables ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Object . variables . add ( Variable Object . create ( me . n allen . mod ular code generation . hybrid autom ata . Variable ( internal . name , Ġinternal . type , ĠLoc ality . INTERNAL , Ġinternal . defaultValue ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġare Ġdoing Ġrun - time Ġparame tr isation Ġthen Ġwe Ġalso Ġneed Ġto Ġdeal Ġwith Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( config . run Time Parame tr isation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġgo Ġthrough Ġeach Ġparameter Ġthat Ġis Ġused Ġin Ġthis Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( internal Ġin Ġfunc . logic . variables . filter Ġ{ it . locality Ġ== ĠParse Tree Local ity . EXTERNAL _ INPUT } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ item . variables . any Ġ{ Ġsearch Ġ-> Ġsearch . locality Ġ== ĠLoc ality . PARAMETER Ġ&& Ġsearch . name Ġ== Ġit . name Ġ}}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġit Ġas Ġan Ġexternal Ġinput ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Object . inputs . add ( Variable Object . create ( me . n allen . mod ular code generation . hybrid autom ata . Variable ( internal . name , Ġinternal . type , ĠLoc ality . EXTERNAL _ INPUT , Ġinternal . defaultValue ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġkeep Ġtrack Ġof Ġthe Ġextra Ġparameter Ġthat Ġneeds Ġto Ġbe Ġadded Ġto Ġfunctions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Params [ func . name ] !!. add ( Variable ( internal . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġwant Ġto Ġgenerate Ġthe Ġinternal Ġlogic Ġfor Ġthe Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Object . logic . addAll ( Utils . generate Code For Program ( func . logic ). split ("\ n ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġrecord Ġthe Ġfunction Ġso Ġthat Ġwe Ġcan Ġadd Ġit Ġto Ġthe Ġend Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . custom Functions . add ( function Object ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġlet 's Ġsort Ġout Ġsome Ġstate Ġlogic ĊĠĠĠĠĠĠĠ Ġroot Item . enum Name Ġ= ĠUtils . create Macro Name ( item . name , Ġ" State ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠIterate Ġover Ġevery Ġlocation Ġthat Ġwe Ġhave ĊĠĠĠĠĠĠĠ Ġfor ( location Ġin Ġitem . locations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġto Ġsort Ġout Ġall Ġthe Ġtransitions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition List Ġ= ĠArrayList < Transition Object >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġwe Ġcan Ġadd Ġall Ġother Ġtransitions , Ġso Ġiterate Ġover Ġeach Ġof Ġthem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ((_, Ġto Location , Ġguard , Ġupdate ) Ġin Ġitem . edges . filter { it . from Location Ġ== Ġlocation . name Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Object Ġ= ĠTransition Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . generate Code For ParseTree Item ( guard , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . create Macro Name ( item . name , Ġto Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġadd Ġeach Ġupdate Ġof Ġthe Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( variable , Ġequation ) Ġin Ġupdate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Object . update . add ( Update Object ( Utils . create Variable Name ( variable , Ġ" update "), ĠUtils . generate Code For ParseTree Item ( equation , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition List . add ( transition Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġwant Ġto Ġadd Ġthe Ġself - transition Ġwhich Ġuses Ġthe Ġinvariant Ġfor Ġthe Ġguard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Object Ġ= ĠTransition Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . generate Code For ParseTree Item ( location . in variant , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . create Macro Name ( item . name , Ġlocation . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġwant Ġto Ġkeep Ġtrack Ġof Ġsignals Ġthat Ġhave Ġbeen Ġupdated Ġvia Ġflow Ġso Ġthat Ġwe Ġcan Ġuse Ġthose Ġsignals Ġwhen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdoing Ġupdates Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Flow Map Ġ= ĠHashMap ( signal Name Map ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEach Ġflow Ġconstraint Ġwill Ġalso Ġbe Ġincluded Ġin Ġthe Ġself - transition , Ġso Ġlet 's Ġadd Ġeach Ġof Ġthose ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( variable , Ġo de ) Ġin Ġlocation . flow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠForward ĠE uler Ġis Ġused Ġto Ġsolve Ġeach ĠO DE , Ġso Ġcreate Ġthe Ġsolution ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe uler Solution Ġ= ĠPlus ( Variable ( variable ), ĠMultiply ( ode , ĠVariable (" step _ size "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġadd Ġit Ġto Ġthe Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Object . flow . add ( Update Object ( Utils . create Variable Name ( variable , Ġ" update "), ĠUtils . generate Code For ParseTree Item ( euler Solution , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )))) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAlso Ġkeeping Ġtrack Ġof Ġthe Ġupdated Ġsignal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Flow Map [ variable ] Ġ= ĠUtils . create Variable Name ( variable , Ġ" update ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġcan Ġadd Ġeach Ġupdate Ġof Ġthe Ġlocation Ġto Ġthe Ġself Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( variable , Ġequation ) Ġin Ġlocation . update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere , Ġwe Ġuse Ġthe Ġupdated Flow Map Ġfrom Ġbefore Ġto Ġreplace Ġsignal Ġnames Ġif Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Object . update . add ( Update Object ( Utils . create Variable Name ( variable , Ġ" update "), ĠUtils . generate Code For ParseTree Item ( equation , ĠUtils . Prefix Data ("", Ġupdated Flow Map , Ġfunction Params )))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġlook Ġat Ġsat uration , Ġso Ġcollect Ġall Ġthe Ġlimits ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsat uration Limits Ġ= ĠCode Gen Manager . collect Sat uration Limits ( location , Ġitem . edges ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġnow Ġfor Ġeach Ġlimit Ġwe Ġneed Ġto Ġadd Ġin Ġthe Ġcheck Ġfor Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor (( point , Ġdependencies ) Ġin Ġsat uration Limits ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġvariable Ġthat Ġwe 'll Ġbe Ġchecking Ġfor Ġsat uration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew _ variable Ġ= ĠVariable ( Utils . create Variable Name ( point . variable , Ġ" update ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold _ variable Ġ= ĠVariable ( point . variable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow , Ġdepending Ġon Ġthe Ġdirection Ġof Ġsat uration Ġwe 'll Ġhave Ġa Ġdifferent Ġequ atio Ġthat Ġwe Ġgenerate Ġfor Ġthe Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġwhen ( point . direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSat uration Direction . R ISING Ġ-> ĠAnd ( GreaterThan ( new _ variable , Ġpoint . value ), ĠLess Than ( old _ variable , Ġpoint . value )) Ġ// ĠVariable Ġis Ġnow Ġabove Ġlimit , Ġbut Ġwasn 't Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSat uration Direction . FALL ING Ġ-> ĠAnd ( LessThan ( new _ variable , Ġpoint . value ), ĠG reater Than ( old _ variable , Ġpoint . value )) Ġ// ĠVariable Ġis Ġnow Ġbelow Ġlimit , Ġbut Ġwasn 't Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSat uration Direction . BOTH Ġ-> ĠOr ( And ( GreaterThan ( new _ variable , Ġpoint . value ), ĠLess Than ( old _ variable , Ġpoint . value )), ĠAnd ( LessThan ( new _ variable , Ġpoint . value ), ĠG reater Than ( old _ variable , Ġpoint . value ))) Ġ// ĠEither Ġof Ġthe Ġabove ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsat uration Dependencies Ġ= ĠArrayList < Update Object >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġwe Ġhave Ġthe Ġcode Ġthat Ġactually Ġperforms Ġthe Ġsat uration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( dependencies . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAll Ġdependencies Ġthat Ġwe Ġallow Ġare Ġlinear Ġcombinations , Ġso Ġwe Ġwork Ġout Ġat Ġwhat Ġtime Ġthe Ġlimit Ġwould ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġbeen Ġhit Ġ" frac ", Ġand Ġthen Ġuse Ġthat Ġto Ġscale Ġeach Ġof Ġthe Ġvalues Ġwith Ġrespect Ġto Ġtheir Ġprevious ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvalues ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrac Ġ= ĠDiv ide ( Minus ( point . value , Ġold _ variable ), ĠMin us ( new _ variable , Ġold _ variable )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġdo Ġthe Ġscaling Ġwith Ġrespect Ġto Ġtheir Ġprevious Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew _ dependency Ġ= ĠVariable ( Utils . create Variable Name ( it , Ġ" update ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold _ dependency Ġ= ĠVariable ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠPlus ( old _ dependency , ĠMultiply ( frac , ĠMin us ( new _ dependency , Ġold _ dependency ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsat uration Dependencies . add ( Update Object ( Utils . create Variable Name ( new _ dependency . name ), ĠUtils . generate Code For ParseTree Item ( value , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġthe Ġlimit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= ĠUtils . generate Code For ParseTree Item ( point . value , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnd Ġs atur ate Ġthe Ġactual Ġvariable Ġwe 're Ġlooking Ġat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Ġ= ĠUpdate Object ( Utils . create Variable Name ( new _ variable . name ), Ġlimit ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġsat uration Ġobject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsat uration Object Ġ= ĠSat uration Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . create Variable Name ( old _ variable . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . generate Code For ParseTree Item ( condition , ĠUtils . Prefix Data ("", Ġsignal Name Map , Ġfunction Params )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsat uration Dependencies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġit Ġto Ġthe Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition Object . sat uration . add ( sat uration Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġit Ġto Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition List . add ( transition Object ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġentry Ġfor Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Object Ġ= ĠLocation Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . create Macro Name ( item . name , Ġlocation . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransition List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item . locations . add ( location Object ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġroot Item . initial Location Ġ= ĠUtils . create Macro Name ( item . name , Ġitem . init . state ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġcontext ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠAutom ata File Context ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Item ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġj in java . render For Result ( template , Ġcontext . map ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAnd Ġgenerate ! ĊĠĠĠĠĠĠĠ Ġreturn Ġres . output ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġclass Ġwhich Ġstores Ġthe Ġcontext Ġfor Ġthis Ġautom aton Ġfile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠAutom ata File Context ( val Ġmap : ĠMutable Map < String , ĠAny ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConfig Ġfile Ġfor Ġthe Ġgeneration ĊĠĠĠĠĠĠĠ Ġvar Ġconfig : ĠConfiguration Ġby Ġmap ĊĊĠĠĠĠĠĠĠ Ġ// ĠInformation Ġabout Ġthe Ġfile Ġto Ġbe Ġgenerated ĊĠĠĠĠĠĠĠ Ġvar Ġitem : ĠAutom ata FileObject Ġby Ġmap ĊĊĠĠĠĠĠĠĠ Ġconstructor ( config : ĠConfiguration , Ġitem : ĠAutom ata FileObject ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" config " Ġto Ġconfig , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" item " Ġto Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġactual Ġinformation Ġfor Ġthe Ġautom aton Ġfile Ġthat Ġwe Ġneed Ġto Ġgenerate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠAutom ata FileObject ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġname Ġof Ġthe ĠAutom aton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġparameters Ġwhich Ġcan Ġbe Ġdeclared Ġfor Ġthis Ġautom aton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparameters : ĠMutable List < Variable Object > Ġ= ĠArrayList (), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġvariables Ġ( including Ġexternal Ġsignals Ġ+ Ġinternal Ġsignals ) Ġthat Ġare Ġused Ġin Ġthis Ġautom aton ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvariables : ĠMutable List < Variable Object > Ġ= ĠArrayList (), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġcustom Ġfunctions Ġthat Ġneed Ġto Ġbe Ġdeclared Ġfor Ġthe Ġoperation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcustom Functions : ĠMutable List < Custom Function Object > Ġ= ĠArrayList (), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġname Ġof Ġthe Ġenum Ġused Ġfor Ġlocations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġenum Name : ĠString Ġ= Ġ"", ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġlist Ġof Ġlocations Ġwithin Ġthe Ġautom aton Ġ( which Ġalso Ġcontain Ġtheir Ġtransitions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlocations : ĠMutable List < Location Object > Ġ= ĠArrayList (), ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġinitial Ġlocation Ġfor Ġthe Ġautom aton Ġto Ġstart Ġexecution Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinitial Location : ĠString Ġ= Ġ"" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġclass Ġwhich Ġcontains Ġall Ġinformation Ġabout Ġa Ġsingle Ġlocation Ġof Ġthe Ġautom aton ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠLocation Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġhuman - readable Ġname Ġof Ġthe Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġmacro Ġname Ġof Ġthe Ġlocation Ġwhich Ġis Ġused Ġby Ġthe ĠEnum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmacro Name : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġtransitions Ġthat Ġexit Ġthis Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtransitions : ĠMutable List < Transition Object > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġclass Ġwhich Ġcaptures Ġa Ġsingle Ġtransition Ġbetween Ġtwo Ġlocations Ġ( or Ġself - transitions Ġof Ġthe Ġsame Ġlocation ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠTransition Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġguard Ġof Ġthe Ġtransition Ġwhich Ġmust Ġbe Ġsatisfied Ġfor Ġthe Ġtransition Ġto Ġoccur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġguard : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġvariables Ġthat Ġare Ġto Ġbe Ġupdated Ġdue Ġto Ġ" Flow " Ġconstraints Ġ( only Ġused Ġfor Ġself - transitions ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġflow : ĠMutable List < Update Object >, ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġvariables Ġthat Ġare Ġto Ġbe Ġupdated Ġdue Ġto Ġ" Update " Ġconstraints ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġupdate : ĠMutable List < Update Object >, ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġsat uration Ġoperations Ġto Ġbe Ġperformed ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsat uration : ĠMutable List < Sat uration Object >, ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġhuman - readable Ġname Ġof Ġthe Ġnext Ġlocation Ġthat Ġthis Ġtransition Ġgoes Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext State Name : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġmacro Ġname Ġof Ġthe Ġnext Ġlocation Ġthat Ġthis Ġtransition Ġgoes Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext State : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġclass Ġwhich Ġcaptures Ġan Ġassignment Ġto Ġa Ġvariable Ġfrom Ġan Ġequation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠUpdate Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġvariable Ġto Ġassign Ġto Ġ( left - hand Ġside Ġof Ġthe Ġequation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvariable : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġvalue Ġto Ġassign Ġto Ġthe Ġvariable Ġ( right - hand Ġside Ġof Ġthe Ġequation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġequation : ĠString ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġclass Ġwhich Ġcaptures Ġa Ġsat uration Ġcondition Ġand Ġupdates ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠSat uration Object ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġvariable Ġwhich Ġis Ġbeing Ġs atur ated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvariable : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġvalue Ġto Ġwhich Ġwe Ġare Ġs atur ating ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlimit : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcondition Ġfor Ġwhen Ġthis Ġsat uration Ġshould Ġoccur ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcondition : ĠString , ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġlist Ġof Ġdependencies Ġthat Ġalso Ġneed Ġto Ġbe Ġupdated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdependencies : ĠMutable List < Update Object >, ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġupdate Ġto Ġapply Ġfor Ġsat uration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġupdate : ĠUpdate Object ĊĠĠĠ Ġ) Ċ }