private void GenerateFunctions() { context.Program.AddDeclaration(GenerateConstToRefFunction()); context.Program.AddDeclaration(GenerateRefToInt()); context.Program.AddDeclaration(GenerateModFunction()); context.Program.AddDeclaration(GenerateKeccakFunction()); context.Program.AddDeclaration(GenerateAbiEncodedFunctionOneArg()); context.Program.AddDeclaration(GenerateVeriSolSumFunction()); context.Program.AddDeclaration(GenerateAbiEncodedFunctionTwoArgs()); context.Program.AddDeclaration(GenerateAbiEncodedFunctionOneArgRef()); context.Program.AddDeclaration(GenerateAbiEncodedFunctionTwoArgsOneRef()); if (context.TranslateFlags.QuantFreeAllocs) { if (context.TranslateFlags.UseMultiDim) { foreach (VariableDeclaration decl in context.Analysis.Alias.getResults()) { TypeName type = decl.TypeName; if (type is Mapping || type is ArrayTypeName) { BoogieFunction initFn = MapArrayHelper.GenerateMultiDimZeroFunction(decl); if (!context.initFns.Contains(initFn.Name)) { context.Program.AddDeclaration(initFn); context.initFns.Add(initFn.Name); } } } } else { context.Program.AddDeclaration(GenerateZeroRefIntArrayFunction()); context.Program.AddDeclaration(GenerateZeroIntIntArrayFunction()); context.Program.AddDeclaration(GenerateZeroRefBoolArrayFunction()); context.Program.AddDeclaration(GenerateZeroIntBoolArrayFunction()); context.Program.AddDeclaration(GenerateZeroRefRefArrayFunction()); context.Program.AddDeclaration(GenerateZeroIntRefArrayFunction()); } } if (context.TranslateFlags.NoNonlinearArith) { context.Program.AddDeclaration(generateNonlinearMulFunction()); context.Program.AddDeclaration(generateNonlinearDivFunction()); context.Program.AddDeclaration(generateNonlinearPowFunction()); context.Program.AddDeclaration(generateNonlinearModFunction()); } }
public List <BoogieDeclaration> GetMultiDimArrayLens(VariableDeclaration decl) { List <BoogieDeclaration> lenVars = new List <BoogieDeclaration>(); TypeName curType = decl.TypeName; List <BoogieType> indTypes = new List <BoogieType>() { BoogieType.Ref }; int lvl = 0; while (curType is Mapping || curType is ArrayTypeName) { if (curType is Mapping map) { curType = map.ValueType; indTypes.Add(TransUtils.GetBoogieTypeFromSolidityTypeName(map.KeyType)); } else if (curType is ArrayTypeName arr) { BoogieType mapType = BoogieType.Int; BoogieType initType = BoogieType.Int; for (int i = indTypes.Count - 1; i >= 0; i--) { initType = mapType; mapType = new BoogieMapType(indTypes[i], mapType); } if (arr.Length != null && initType is BoogieMapType lenMap) { BoogieFunction initFn = GenerateMultiDimInitFunction(lenMap); lenVars.Add(initFn); } BoogieGlobalVariable lenVar = new BoogieGlobalVariable(new BoogieTypedIdent(GetMultiDimLengthName(decl, lvl), mapType)); lenVars.Add(lenVar); curType = arr.BaseType; indTypes.Add(BoogieType.Int); } lvl++; } return(lenVars); }
private void GenerateSingleMemoryVariable(VariableDeclaration decl, BoogieType keyType, BoogieType valType, HashSet <String> generatedMaps) { BoogieMapType map = new BoogieMapType(keyType, valType); map = new BoogieMapType(BoogieType.Ref, map); string name = mapHelper.GetMemoryMapName(decl, keyType, valType); if (!generatedMaps.Contains(name)) { BoogieFunction initFn = MapArrayHelper.GenerateMultiDimZeroFunction(keyType, valType); if (!context.initFns.Contains(initFn.Name)) { context.initFns.Add(initFn.Name); context.Program.AddDeclaration(initFn); } generatedMaps.Add(name); context.Program.AddDeclaration(new BoogieGlobalVariable(new BoogieTypedIdent(name, map))); } }