vm_export_rust.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from vm import VariableType, VariableRefType
  2. def to_initial_caps(snake_str):
  3. components = snake_str.split("_")
  4. return "".join(x.title() for x in components)
  5. def display(contract):
  6. indent = " " * 4
  7. print(r"""use super::vm::{ZKVirtualMachine, CryptoOperation, AllocType, ConstraintInstruction, VariableRef};
  8. pub fn load_zkvm() -> ZKVirtualMachine {
  9. ZKVirtualMachine {
  10. alloc: vec![""")
  11. for symbol, variable in contract.alloc.items():
  12. print("%s // %s" % (indent * 3, symbol))
  13. if variable.type.name == VariableType.PRIVATE.name:
  14. typestring = "Private"
  15. elif variable.type.name == VariableType.PUBLIC.name:
  16. typestring = "Public"
  17. else:
  18. assert False
  19. print("%s(AllocType::%s, %s)," % (indent * 3, typestring,
  20. variable.index))
  21. print("%s]," % (indent * 2))
  22. print("%sops: vec![" % (indent * 2))
  23. def var_ref_str(var_ref):
  24. if var_ref.type.name == VariableRefType.AUX.name:
  25. return "VariableRef::Aux(%s)" % var_ref.index
  26. elif var_ref.type.name == VariableRefType.LOCAL.name:
  27. return "VariableRef::Local(%s)" % var_ref.index
  28. else:
  29. assert False
  30. for op in contract.ops:
  31. print("%s// %s" % (indent * 3, op.line))
  32. args_part = ""
  33. if op.args:
  34. args_part = ", ".join(var_ref_str(var_ref) for var_ref in op.args)
  35. args_part = "(%s)" % args_part
  36. print("%sCryptoOperation::%s%s," % (
  37. indent * 3,
  38. to_initial_caps(op.command),
  39. args_part
  40. ))
  41. print("%s]," % (indent * 2))
  42. print("%sconstraints: vec![" % (indent * 2))
  43. for constraint in contract.constraints:
  44. args_part = ""
  45. if constraint.args:
  46. print("%s// %s" % (indent *3, constraint.args_comment()))
  47. args_part = ", ".join(str(index) for index in constraint.args)
  48. args_part = "(%s)" % args_part
  49. print("%sConstraintInstruction::%s%s," % (
  50. indent * 3,
  51. to_initial_caps(constraint.command),
  52. args_part
  53. ))
  54. print(r""" ],
  55. aux: vec![],
  56. params: None,
  57. verifying_key: None,
  58. }
  59. }""")