diff --git a/src/avatartranslator/AvatarAttribute.java b/src/avatartranslator/AvatarAttribute.java index f1bf8ba92d40cc02caf41e00b0ce01bd67f00f95..e3648c00d6632c29a4a4f65e98bbb9e4731462be 100644 --- a/src/avatartranslator/AvatarAttribute.java +++ b/src/avatartranslator/AvatarAttribute.java @@ -192,6 +192,7 @@ public class AvatarAttribute extends AvatarLeftHand { @Override public void replaceAttributes (HashMap<AvatarAttribute, AvatarAttribute> attributesMapping) { + TraceManager.addDev("!!! ERROR !!! (replaceAttributes in AvatarAttribute)"); /* !!! We should never arrive here !!! */ } diff --git a/src/avatartranslator/AvatarLibraryFunction.java b/src/avatartranslator/AvatarLibraryFunction.java index f6ee0d2ac0c409a708290a82f76393af88317a01..8b5c8e72a18c98492d86b656b6aef88f2802e06c 100644 --- a/src/avatartranslator/AvatarLibraryFunction.java +++ b/src/avatartranslator/AvatarLibraryFunction.java @@ -107,6 +107,11 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl */ private AvatarSpecification avspec; + /** + * Counter of invocations of this library function. + */ + private int counter; + /** * Basic constructor of the function function. @@ -130,6 +135,23 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl this.methods = new LinkedList<AvatarMethod> (); this.asm = new AvatarStateMachine (this, "statemachineoffunction__" + name, referenceObject); + this.counter = 0; + } + + /** + * Return a unique counter for library function call. + */ + public int getCounter() + { + return this.counter++; + } + + /** + * Set counter for this library function. + */ + public void setCounter(int counter) + { + this.counter = counter; } @Override @@ -288,6 +310,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl */ public void addAttributesToBlock (AvatarBlock block, HashMap<AvatarAttribute, AvatarAttribute> mapping) { for (AvatarAttribute attribute: this.attributes) { + // TODO: We should use different attributes for different library function call String name = this.name + "__" + attribute.getName (); AvatarAttribute attr = block.getAvatarAttributeWithName (name); if (attr == null) { @@ -373,6 +396,11 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl */ public Object referenceObject; + /** + * The counter for the library function call. + */ + public int counter; + /** * Basic constructor. * @@ -390,8 +418,10 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl * The block the function call belongs to. * @param referenceObject * The reference object associated to the function call being translated. + * @param counter + * The counter for the library function call. */ - public TranslatorArgument (HashMap<AvatarAttribute, AvatarAttribute> placeholdersMapping, HashMap<AvatarSignal, AvatarSignal> signalsMapping, AvatarStateMachineElement previousElement, AvatarStateMachineElement lastElement, HashMap<AvatarStateMachineElement, AvatarStateMachineElement> elementsMapping, AvatarBlock block, Object referenceObject) { + public TranslatorArgument (HashMap<AvatarAttribute, AvatarAttribute> placeholdersMapping, HashMap<AvatarSignal, AvatarSignal> signalsMapping, AvatarStateMachineElement previousElement, AvatarStateMachineElement lastElement, HashMap<AvatarStateMachineElement, AvatarStateMachineElement> elementsMapping, AvatarBlock block, Object referenceObject, int counter) { this.placeholdersMapping = placeholdersMapping; this.signalsMapping = signalsMapping; this.previousElement = previousElement; @@ -399,6 +429,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl this.elementsMapping = elementsMapping; this.block = block; this.referenceObject = referenceObject; + this.counter = counter; } } @@ -418,9 +449,9 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl * * @return The last element of the state machine created. */ - public AvatarState translateASMWithMapping (HashMap<AvatarAttribute, AvatarAttribute> placeholdersMapping, HashMap<AvatarSignal, AvatarSignal> signalsMapping, AvatarStateMachineElement firstElement, AvatarBlock block, Object referenceObject) { + public AvatarState translateASMWithMapping (HashMap<AvatarAttribute, AvatarAttribute> placeholdersMapping, HashMap<AvatarSignal, AvatarSignal> signalsMapping, AvatarStateMachineElement firstElement, AvatarBlock block, Object referenceObject, int counter) { /* Create the last state */ - AvatarState lastState = new AvatarState ("exit_" + this.name, referenceObject); + AvatarState lastState = new AvatarState ("exit_" + this.name + "_" + counter, referenceObject); /* Create the argument object that will be passed to translation functions */ Object arg = new TranslatorArgument ( @@ -430,7 +461,8 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl lastState, new HashMap<AvatarStateMachineElement, AvatarStateMachineElement> (), block, - referenceObject); + referenceObject, + counter); /* Translate the state machine, starting from the first state */ this.asm.getStartState ().translate (this, arg); @@ -479,14 +511,14 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl if (_asme instanceof AvatarSetTimer) { // TODO: isn't the name used for the timer ? - asme = new AvatarSetTimer (this.name + "__" + _asme.getName (), arg.referenceObject); + asme = new AvatarSetTimer (this.name + "_" + arg.counter + "__" + _asme.getName (), arg.referenceObject); // TODO: should probably replace attributes too, right ? ((AvatarSetTimer) asme).setTimerValue (((AvatarSetTimer) _asme).getTimerValue ()); } else if (_asme instanceof AvatarResetTimer) - asme = new AvatarResetTimer (this.name + "__" + _asme.getName (), arg.referenceObject); + asme = new AvatarResetTimer (this.name + "_" + arg.counter + "__" + _asme.getName (), arg.referenceObject); else if (_asme instanceof AvatarExpireTimer) - asme = new AvatarExpireTimer (this.name + "__" + _asme.getName (), arg.referenceObject); + asme = new AvatarExpireTimer (this.name + "_" + arg.counter + "__" + _asme.getName (), arg.referenceObject); else /* !!! should not happen */ return; @@ -500,7 +532,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl public void translateActionOnSignal (AvatarActionOnSignal _asme, Object _arg) { TranslatorArgument arg = (TranslatorArgument) _arg; - AvatarActionOnSignal asme = new AvatarActionOnSignal (this.name + "__" + _asme.getName (), arg.signalsMapping.get (_asme.getSignal ()), arg.referenceObject); + AvatarActionOnSignal asme = new AvatarActionOnSignal (this.name + "_" + arg.counter + "__" + _asme.getName (), arg.signalsMapping.get (_asme.getSignal ()), arg.referenceObject); for (String s: _asme.getValues ()) { AvatarAttribute attr = this.getAvatarAttributeWithName (s); if (attr == null) @@ -516,7 +548,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl public void translateTransition (AvatarTransition _asme, Object _arg) { TranslatorArgument arg = (TranslatorArgument) _arg; - AvatarTransition asme = new AvatarTransition (arg.block, this.name + "__" + _asme.getName (), arg.referenceObject); + AvatarTransition asme = new AvatarTransition (arg.block, this.name + "_" + arg.counter + "__" + _asme.getName (), arg.referenceObject); AvatarGuard guard = _asme.getGuard ().clone (); guard.replaceAttributes (arg.placeholdersMapping); @@ -549,7 +581,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl * reachability of state in a function for a particular invocation of this * function. */ - AvatarState asme = new AvatarState (this.name + "__" + _asme.getName (), arg.referenceObject, false); + AvatarState asme = new AvatarState (this.name + "_" + arg.counter + "__" + _asme.getName (), arg.referenceObject, false); asme.setHidden (true); asme.addEntryCode (_asme.getEntryCode ()); @@ -560,7 +592,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl public void translateRandom (AvatarRandom _asme, Object _arg) { TranslatorArgument arg = (TranslatorArgument) _arg; - AvatarRandom asme = new AvatarRandom (this.name + "__" + _asme.getName (), arg.referenceObject); + AvatarRandom asme = new AvatarRandom (this.name + "_" + arg.counter + "__" + _asme.getName (), arg.referenceObject); asme.setValues (_asme.getMinValue (), _asme.getMaxValue ()); asme.setFunctionId (_asme.getFunctionId ()); asme.setVariable (arg.placeholdersMapping.get (this.getAvatarAttributeWithName (_asme.getVariable ())).getName ()); @@ -579,7 +611,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl public void translateLibraryFunctionCall (AvatarLibraryFunctionCall _asme, Object _arg) { TranslatorArgument arg = (TranslatorArgument) _arg; - AvatarLibraryFunctionCall asme = new AvatarLibraryFunctionCall (this.name + "__" + _asme.getName (), _asme.getLibraryFunction (), arg.referenceObject); + AvatarLibraryFunctionCall asme = new AvatarLibraryFunctionCall (this.name + "_" + arg.counter + "__" + _asme.getName (), _asme.getLibraryFunction (), arg.referenceObject); for (AvatarAttribute attr: _asme.getParameters ()) asme.addParameter (arg.placeholdersMapping.get (attr)); for (AvatarSignal signal: _asme.getSignals ()) @@ -595,6 +627,7 @@ public class AvatarLibraryFunction extends AvatarElement implements AvatarTransl AvatarLibraryFunction result = new AvatarLibraryFunction(this.name, avspec, this.referenceObject); this.cloneLinkToReferenceObjects (result); + result.setCounter(this.counter); for (AvatarAttribute aa: this.parameters) result.addParameter(aa.advancedClone(result)); for (AvatarSignal sig: this.signals) diff --git a/src/avatartranslator/AvatarLibraryFunctionCall.java b/src/avatartranslator/AvatarLibraryFunctionCall.java index 785001f7f42bfd7fbef95abe176b935426aa4da5..e6299dad822b1cb6ab5707edc778e7b887e915a5 100644 --- a/src/avatartranslator/AvatarLibraryFunctionCall.java +++ b/src/avatartranslator/AvatarLibraryFunctionCall.java @@ -73,6 +73,11 @@ public class AvatarLibraryFunctionCall extends AvatarStateMachineElement { */ private AvatarLibraryFunction libraryFunction; + /** + * Counter for library function call. + */ + private int counter; + /** * Basic constructor of the function function. * @@ -85,11 +90,20 @@ public class AvatarLibraryFunctionCall extends AvatarStateMachineElement { super(_name, _referenceObject); this.libraryFunction = libraryFunction; + this.counter = this.libraryFunction.getCounter(); this.parameters = new LinkedList<AvatarAttribute> (); this.signals = new LinkedList<AvatarSignal> (); this.returnAttributes = new LinkedList <AvatarAttribute> (); } + /** + * @return The counter for this library function call + */ + public int getCounter() + { + return this.counter; + } + /** * Get the list of parameters passed to the function. * @@ -196,7 +210,7 @@ public class AvatarLibraryFunctionCall extends AvatarStateMachineElement { this.libraryFunction.addSignalsToMapping (signalsMapping, this.signals); /* Translate the state machine */ - return this.libraryFunction.translateASMWithMapping (placeholdersMapping, signalsMapping, firstElement, block, this.referenceObject); + return this.libraryFunction.translateASMWithMapping (placeholdersMapping, signalsMapping, firstElement, block, this.referenceObject, this.counter); } @Override diff --git a/src/avatartranslator/AvatarSimpleGuardDuo.java b/src/avatartranslator/AvatarSimpleGuardDuo.java index 4a90f05719513afb2473097cc05d08a64ef91508..3b855b6f14ef0832d9832b8270f445e38a2aa5d5 100644 --- a/src/avatartranslator/AvatarSimpleGuardDuo.java +++ b/src/avatartranslator/AvatarSimpleGuardDuo.java @@ -88,7 +88,21 @@ public class AvatarSimpleGuardDuo extends AvatarSimpleGuard { @Override public void replaceAttributes (HashMap<AvatarAttribute, AvatarAttribute> attributesMapping) { - this.termA.replaceAttributes (attributesMapping); - this.termB.replaceAttributes (attributesMapping); + if (this.termA instanceof AvatarAttribute) + { + this.termA = attributesMapping.get((AvatarAttribute) this.termA); + } + else + { + this.termA.replaceAttributes (attributesMapping); + } + if (this.termB instanceof AvatarAttribute) + { + this.termB = attributesMapping.get((AvatarAttribute) this.termB); + } + else + { + this.termB.replaceAttributes (attributesMapping); + } } } diff --git a/src/avatartranslator/AvatarSimpleGuardMono.java b/src/avatartranslator/AvatarSimpleGuardMono.java index 3761e9309650eebec53aab194c0815573306df8c..dc9afdb9bb33f6c16e71864e0464f4e948ce1d4d 100644 --- a/src/avatartranslator/AvatarSimpleGuardMono.java +++ b/src/avatartranslator/AvatarSimpleGuardMono.java @@ -47,6 +47,7 @@ package avatartranslator; import java.util.HashMap; +import myutil.TraceManager; import myutil.Conversion; @@ -76,6 +77,16 @@ public class AvatarSimpleGuardMono extends AvatarSimpleGuard { @Override public void replaceAttributes (HashMap<AvatarAttribute, AvatarAttribute> attributesMapping) { - this.term.replaceAttributes (attributesMapping); + for (AvatarAttribute attr: attributesMapping.keySet()) + { + } + if (this.term instanceof AvatarAttribute) + { + this.term = attributesMapping.get(((AvatarAttribute) this.term)); + } + else + { + this.term.replaceAttributes (attributesMapping); + } } } diff --git a/src/avatartranslator/AvatarStateMachine.java b/src/avatartranslator/AvatarStateMachine.java index fdff5e572e924d5204de93963049960c41f88035..a959845bad6b2f90cc765d1fb79c9951ec742f1a 100644 --- a/src/avatartranslator/AvatarStateMachine.java +++ b/src/avatartranslator/AvatarStateMachine.java @@ -1535,14 +1535,15 @@ public class AvatarStateMachine extends AvatarElement { continue; if (curAsme instanceof AvatarLibraryFunctionCall) { + AvatarLibraryFunctionCall alfc = (AvatarLibraryFunctionCall) curAsme; /* Create a state that will be used as an entry point for the sub-state machine */ - AvatarState firstState = new AvatarState ("entry_" + curAsme.getName (), curAsme.getReferenceObject ()); + AvatarState firstState = new AvatarState ("entry_" + alfc.getLibraryFunction().getName () + "_" + alfc.getCounter(), curAsme.getReferenceObject ()); /* Add this state to the mapping so that future state can use it to replace their next element */ - callsTranslated.put ((AvatarLibraryFunctionCall) curAsme, firstState); + callsTranslated.put (alfc, firstState); /* inline the function call */ - AvatarStateMachineElement lastState = ((AvatarLibraryFunctionCall) curAsme).inlineFunctionCall (block, firstState); + AvatarStateMachineElement lastState = alfc.inlineFunctionCall (block, firstState); /* Add the next elements to the newly created last state */ for (AvatarStateMachineElement asme: curAsme.getNexts ()) diff --git a/src/avatartranslator/toproverif/AVATAR2ProVerif.java b/src/avatartranslator/toproverif/AVATAR2ProVerif.java index 66b6e24713c2876a2017e2e8dca901432d0affa4..ed4cb9ff0b1a833f366673d07bf3a761e90d9e0e 100755 --- a/src/avatartranslator/toproverif/AVATAR2ProVerif.java +++ b/src/avatartranslator/toproverif/AVATAR2ProVerif.java @@ -222,9 +222,9 @@ public class AVATAR2ProVerif implements AvatarTranslator { protected static String translateTerm (AvatarTerm term, HashMap<AvatarAttribute, Integer> attributeCmp) { if (term instanceof AvatarAttribute) { AvatarAttribute attr = (AvatarAttribute) term; - if (attributeCmp != null) + if (attributeCmp != null) { return AVATAR2ProVerif.makeAttrName (attr.getBlock ().getName (), attr.getName (), attributeCmp.get (attr).toString ()); - else + } else return AVATAR2ProVerif.makeAttrName (attr.getBlock ().getName (), attr.getName ()); } @@ -939,7 +939,7 @@ public class AVATAR2ProVerif implements AvatarTranslator { if (asme != null) { HashMap<AvatarAttribute, Integer> attributeCmp = new HashMap<AvatarAttribute, Integer> (); for (AvatarAttribute attr: ab.getAttributes ()) { - TraceManager.addDev ("=== " + attr); + TraceManager.addDev ("=== " + attr.getName()); attributeCmp.put (attr, 0); }