1+ # SPDX-FileCopyrightText: 2026 ETH Zurich and University of Bologna
2+ #
3+ # SPDX-License-Identifier: Apache-2.0
4+
5+ import numpy as np
6+ import onnx_graphsurgeon as gs
7+
8+ from Deeploy .DeeployTypes import ConstantBuffer , DeploymentEngine , DeploymentPlatform , NetworkContext , NodeMapper , \
9+ NodeTemplate , StructBuffer , TopologyOptimizer , TransientBuffer , VariableBuffer
10+
11+ from Deeploy .Targets .Generic .Templates import AllocateTemplate as BasicAllocateTemplate
12+ from Deeploy .Targets .Generic .Bindings import BasicAddBindings
13+ from Deeploy .Targets .Generic .Parsers import AddParser
14+ from Deeploy .Targets .Generic .Layers import AddLayer
15+
16+ from Deeploy .Targets .Magia .Templates import AllocateTemplate , FreeTemplate
17+
18+ AddMapper = NodeMapper (AddParser (), BasicAddBindings )
19+
20+ MagiaMapping = {
21+ 'Add' : AddLayer ([AddMapper ])
22+ }
23+
24+ class MagiaVariableBuffer (VariableBuffer ):
25+
26+ initTemplate = AllocateTemplate .magiaInitTemplate
27+ allocTemplate = AllocateTemplate .magiaAllocateTemplate
28+ deallocTemplate = FreeTemplate .magiaFreeTemplate
29+
30+ def _bufferRepresentation (self ):
31+
32+ if hasattr (self , "_memoryLevel" ):
33+ memoryLevel = self ._memoryLevel
34+ else :
35+ memoryLevel = None
36+
37+ return {
38+ "type" : self ._instance ,
39+ "name" : self .name ,
40+ "size" : int (np .prod (self .shape )),
41+ "_memoryLevel" : memoryLevel
42+ }
43+
44+ class MagiaTransientBuffer (TransientBuffer ):
45+
46+ initTemplate = AllocateTemplate .magiaInitTemplate
47+ allocTemplate = AllocateTemplate .magiaAllocateTemplate
48+ deallocTemplate = FreeTemplate .magiaFreeTemplate
49+
50+ def _bufferRepresentation (self ):
51+
52+ if hasattr (self , "_memoryLevel" ):
53+ memoryLevel = self ._memoryLevel
54+ else :
55+ memoryLevel = None
56+
57+ return {"type" : self ._type ,
58+ "name" : self .name ,
59+ "size" : self .size ,
60+ "_memoryLevel" : memoryLevel
61+ }
62+
63+ class MagiaConstantBuffer (ConstantBuffer ):
64+
65+ initTemplate = AllocateTemplate .magiaGlobalInitTemplate
66+ allocTemplate = AllocateTemplate .magiaGlobalAllocateTemplate
67+ deallocTemplate = FreeTemplate .magiaGlobalTemplate
68+
69+ def _bufferRepresentation (self ):
70+ operatorRepresentation = super ()._bufferRepresentation ()
71+
72+ if hasattr (self , "_memoryLevel" ):
73+ memoryLevel = self ._memoryLevel
74+ else :
75+ memoryLevel = None
76+
77+ operatorRepresentation ["_memoryLevel" ] = memoryLevel
78+
79+ return operatorRepresentation
80+
81+ class MagiaStructBuffer (StructBuffer ):
82+
83+ initTemplate = BasicAllocateTemplate .referenceStructInitTemplate
84+ allocTemplate = BasicAllocateTemplate .referenceStructAllocateTemplate
85+ deallocTemplate = NodeTemplate ("" )
86+
87+
88+ MagiaOptimizer = TopologyOptimizer (
89+ [
90+ # Insert here the ONNX optimization passes.
91+ ],
92+ name = "MagiaOptimizer" )
93+
94+
95+ _includeList = [
96+ "tile.h" , "idma.h" , "redmule.h" , "eventunit.h"
97+ ]
98+
99+
100+ class MagiaMeshEngine (DeploymentEngine ):
101+
102+ def __init__ (self ,
103+ name : str ,
104+ Mapping = MagiaMapping ,
105+ initCode = "" ,
106+ includeList = _includeList ,
107+ n_tiles : int = 4 ) -> None :
108+ super ().__init__ (name , Mapping , initCode , includeList )
109+ self .n_tiles = n_tiles
110+
111+ class MagiaPlatform (DeploymentPlatform ):
112+
113+ def __init__ (self ,
114+ engines = [MagiaMeshEngine ("MagiaMesh" )],
115+ variableBuffer = MagiaVariableBuffer ,
116+ constantBuffer = MagiaConstantBuffer ,
117+ structBuffer = MagiaStructBuffer ,
118+ transientBuffer = MagiaTransientBuffer ) -> None :
119+ super ().__init__ (engines , variableBuffer , constantBuffer , structBuffer , transientBuffer )
0 commit comments