Skip to content

Commit df50bd1

Browse files
authored
serialize to/from json helper functions (#583)
Added helper functions so that EDSLs do not need to write their own to and from jsons. Adds `encode_json` and `decode_json` methods to the `DialectGroup` class to and from JSON strings.
1 parent 9188954 commit df50bd1

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/kirin/ir/group.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@
2222
from kirin.ir.method import Method
2323
from kirin.ir.traits import SymbolTable, SymbolOpInterface
2424
from kirin.ir.exception import CompilerError, ValidationError
25+
from kirin.serialization.jsonserializer import get_json_serializer
2526

2627
if TYPE_CHECKING:
27-
from kirin.ir import Dialect, Statement
28+
from kirin.ir import Method, Dialect, Statement
2829
from kirin.lowering import Python
2930
from kirin.registry import Registry
3031
from kirin.serialization.base.serializer import Serializer
@@ -330,6 +331,14 @@ def decode(self, encoded: "SerializationModule") -> Method:
330331
deserializer = Deserializer(dialect_group=self)
331332
return deserializer.decode(encoded)
332333

334+
def encode_json(self, program: Method) -> str:
335+
encoded_module = self.encode(program)
336+
return get_json_serializer().encode(encoded_module)
337+
338+
def decode_json(self, json_str: str) -> Method:
339+
decoded_module = get_json_serializer().decode(json_str)
340+
return self.decode(decoded_module)
341+
333342

334343
def dialect_group(
335344
dialects: Iterable[Union["Dialect", ModuleType]],

src/kirin/serialization/jsonserializer.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from typing import Any
2+
from typing import Any, Optional
33

44
from kirin.serialization.core.serializationunit import SerializationUnit
55
from kirin.serialization.core.serializationmodule import SerializationModule
@@ -74,3 +74,14 @@ def decode(self, data: str) -> SerializationModule:
7474
if not isinstance(result, SerializationModule):
7575
raise TypeError("decoded payload is not a SerializationModule")
7676
return result
77+
78+
79+
_json_serializer_instance: Optional[JSONSerializer] = None
80+
81+
82+
def get_json_serializer() -> JSONSerializer:
83+
"""Lazily return a single JSONSerializer instance (module-level singleton)."""
84+
global _json_serializer_instance
85+
if _json_serializer_instance is None:
86+
_json_serializer_instance = JSONSerializer()
87+
return _json_serializer_instance

0 commit comments

Comments
 (0)