From e0e2e832a9cdcf5d7f63a96c2d101fe21ab0b609 Mon Sep 17 00:00:00 2001 From: Dennis Liew Date: Thu, 20 Nov 2025 16:21:23 -0500 Subject: [PATCH 1/2] serialize to/from json helper functions --- src/kirin/ir/group.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/kirin/ir/group.py b/src/kirin/ir/group.py index b97ac7502..d9b319fc4 100644 --- a/src/kirin/ir/group.py +++ b/src/kirin/ir/group.py @@ -24,7 +24,7 @@ from kirin.ir.exception import CompilerError, ValidationError if TYPE_CHECKING: - from kirin.ir import Dialect, Statement + from kirin.ir import Method, Dialect, Statement from kirin.lowering import Python from kirin.registry import Registry from kirin.serialization.base.serializer import Serializer @@ -330,6 +330,22 @@ def decode(self, encoded: "SerializationModule") -> Method: deserializer = Deserializer(dialect_group=self) return deserializer.decode(encoded) + def encode_json(self, program: Method) -> str: + from kirin.serialization.jsonserializer import JSONSerializer + + encoded_module = self.encode(program) + json_serializer = JSONSerializer() + json_str = json_serializer.encode(encoded_module) + return json_str + + def decode_json(self, json_str: str) -> Method: + from kirin.serialization.jsonserializer import JSONSerializer + + json_serializer = JSONSerializer() + decoded_module = json_serializer.decode(json_str) + program = self.decode(decoded_module) + return program + def dialect_group( dialects: Iterable[Union["Dialect", ModuleType]], From 55be33771f6c4d0fc9b9d94cf72f163b95c8886b Mon Sep 17 00:00:00 2001 From: Dennis Liew Date: Wed, 26 Nov 2025 13:48:37 -0500 Subject: [PATCH 2/2] Refactor JSON serialization to use a singleton instance --- src/kirin/ir/group.py | 15 ++++----------- src/kirin/serialization/jsonserializer.py | 13 ++++++++++++- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/kirin/ir/group.py b/src/kirin/ir/group.py index d9b319fc4..e9e72aba9 100644 --- a/src/kirin/ir/group.py +++ b/src/kirin/ir/group.py @@ -22,6 +22,7 @@ from kirin.ir.method import Method from kirin.ir.traits import SymbolTable, SymbolOpInterface from kirin.ir.exception import CompilerError, ValidationError +from kirin.serialization.jsonserializer import get_json_serializer if TYPE_CHECKING: from kirin.ir import Method, Dialect, Statement @@ -331,20 +332,12 @@ def decode(self, encoded: "SerializationModule") -> Method: return deserializer.decode(encoded) def encode_json(self, program: Method) -> str: - from kirin.serialization.jsonserializer import JSONSerializer - encoded_module = self.encode(program) - json_serializer = JSONSerializer() - json_str = json_serializer.encode(encoded_module) - return json_str + return get_json_serializer().encode(encoded_module) def decode_json(self, json_str: str) -> Method: - from kirin.serialization.jsonserializer import JSONSerializer - - json_serializer = JSONSerializer() - decoded_module = json_serializer.decode(json_str) - program = self.decode(decoded_module) - return program + decoded_module = get_json_serializer().decode(json_str) + return self.decode(decoded_module) def dialect_group( diff --git a/src/kirin/serialization/jsonserializer.py b/src/kirin/serialization/jsonserializer.py index db737d828..a173b0d8b 100644 --- a/src/kirin/serialization/jsonserializer.py +++ b/src/kirin/serialization/jsonserializer.py @@ -1,5 +1,5 @@ import json -from typing import Any +from typing import Any, Optional from kirin.serialization.core.serializationunit import SerializationUnit from kirin.serialization.core.serializationmodule import SerializationModule @@ -74,3 +74,14 @@ def decode(self, data: str) -> SerializationModule: if not isinstance(result, SerializationModule): raise TypeError("decoded payload is not a SerializationModule") return result + + +_json_serializer_instance: Optional[JSONSerializer] = None + + +def get_json_serializer() -> JSONSerializer: + """Lazily return a single JSONSerializer instance (module-level singleton).""" + global _json_serializer_instance + if _json_serializer_instance is None: + _json_serializer_instance = JSONSerializer() + return _json_serializer_instance