@@ -38,6 +38,7 @@ def assemble(text_program):
3838 labels = {}
3939 instructions = []
4040 sideset_count = 0
41+ sideset_enable = 0
4142 for line in text_program .split ("\n " ):
4243 line = line .strip ()
4344 if not line :
@@ -55,6 +56,7 @@ def assemble(text_program):
5556 pass
5657 elif line .startswith (".side_set" ):
5758 sideset_count = int (line .split ()[1 ])
59+ sideset_enable = 1 if "opt" in line else 0
5860 elif line .endswith (":" ):
5961 label = line [:- 1 ]
6062 if label in labels :
@@ -64,7 +66,7 @@ def assemble(text_program):
6466 # Only add as an instruction if the line isn't empty
6567 instructions .append (line )
6668
67- max_delay = 2 ** (5 - sideset_count ) - 1
69+ max_delay = 2 ** (5 - sideset_count - sideset_enable ) - 1
6870 assembled = []
6971 for instruction in instructions :
7072 # print(instruction)
@@ -76,10 +78,13 @@ def assemble(text_program):
7678 raise RuntimeError ("Delay too long:" , delay )
7779 instruction .pop ()
7880 if len (instruction ) > 1 and instruction [- 2 ] == "side" :
81+ if sideset_count == 0 :
82+ raise RuntimeError ("No side_set count set" )
7983 sideset_value = int (instruction [- 1 ])
8084 if sideset_value > 2 ** sideset_count :
8185 raise RuntimeError ("Sideset value too large" )
82- delay |= sideset_value << (5 - sideset_count )
86+ delay |= sideset_value << (5 - sideset_count - sideset_enable )
87+ delay |= sideset_enable << 4
8388 instruction .pop ()
8489 instruction .pop ()
8590
@@ -186,6 +191,6 @@ def assemble(text_program):
186191 else :
187192 raise RuntimeError ("Unknown instruction:" + instruction [0 ])
188193 assembled [- 1 ] |= delay << 8
189- # print(hex (assembled[-1]))
194+ # print(bin (assembled[-1]))
190195
191196 return array .array ("H" , assembled )
0 commit comments