Skip to content

Commit fc690ea

Browse files
committedDec 2, 2014
runtime: support clock switching
1 parent 94218f7 commit fc690ea

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed
 

‎artiq/coredevice/comm_serial.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import logging
88

99
from artiq.language import core as core_language
10+
from artiq.language import units
1011
from artiq.coredevice.runtime import Environment
1112
from artiq.coredevice import runtime_exceptions
1213

@@ -23,6 +24,7 @@ class _H2DMsgType(Enum):
2324
LOAD_OBJECT = 2
2425
RUN_KERNEL = 3
2526
SET_BAUD_RATE = 4
27+
SWITCH_CLOCK = 5
2628

2729

2830
class _D2HMsgType(Enum):
@@ -37,6 +39,8 @@ class _D2HMsgType(Enum):
3739
KERNEL_EXCEPTION = 9
3840
KERNEL_STARTUP_FAILED = 10
3941
RPC_REQUEST = 11
42+
CLOCK_SWITCH_COMPLETED = 12
43+
CLOCK_SWITCH_FAILED = 13
4044

4145

4246
def _write_exactly(f, data):
@@ -135,12 +139,21 @@ def get_runtime_env(self):
135139
runtime_id += chr(reply)
136140
if runtime_id != "AROR":
137141
raise UnsupportedDevice("Unsupported runtime ID: "+runtime_id)
138-
(ref_freq_i, ref_freq_fn, ref_freq_fd) = struct.unpack(
142+
ref_freq_i, ref_freq_fn, ref_freq_fd = struct.unpack(
139143
">lBB", _read_exactly(self.port, 6))
140-
ref_period = 1/(ref_freq_i + Fraction(ref_freq_fn, ref_freq_fd))
144+
ref_freq = (ref_freq_i + Fraction(ref_freq_fn, ref_freq_fd))*units.Hz
145+
ref_period = 1/ref_freq
141146
logger.debug("environment ref_period: {}".format(ref_period))
142147
return Environment(ref_period)
143148

149+
def switch_clock(self, external):
150+
_write_exactly(self.port, struct.pack(
151+
">lbb", 0x5a5a5a5a, _H2DMsgType.SWITCH_CLOCK.value,
152+
int(external)))
153+
msg = self._get_device_msg()
154+
if msg != _D2HMsgType.CLOCK_SWITCH_COMPLETED:
155+
raise IOError("Incorrect reply from device: "+str(msg))
156+
144157
def load(self, kcode):
145158
_write_exactly(self.port, struct.pack(
146159
">lblL",

‎artiq/coredevice/core.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,20 @@ def _no_debug_unparse(label, node):
4242

4343

4444
class Core:
45-
def __init__(self, comm, runtime_env=None):
45+
def __init__(self, comm, external_clock=None, runtime_env=None):
4646
if runtime_env is None:
4747
runtime_env = comm.get_runtime_env()
4848
self.runtime_env = runtime_env
4949
self.comm = comm
5050
self.core = self
5151

52+
if external_clock is None:
53+
self.ref_period = self.runtime_env.internal_ref_period
54+
self.comm.switch_clock(False)
55+
else:
56+
self.ref_period = external_clock
57+
self.comm.switch_clock(True)
58+
5259
def transform_stack(self, func_def, rpc_map, exception_map,
5360
debug_unparse=_no_debug_unparse):
5461
lower_units(func_def, rpc_map)
@@ -57,7 +64,7 @@ def transform_stack(self, func_def, rpc_map, exception_map,
5764
remove_inter_assigns(func_def)
5865
debug_unparse("remove_inter_assigns_1", func_def)
5966

60-
quantize_time(func_def, self.runtime_env.ref_period)
67+
quantize_time(func_def, self.ref_period.amount)
6168
debug_unparse("quantize_time", func_def)
6269

6370
fold_constants(func_def)
@@ -69,7 +76,7 @@ def transform_stack(self, func_def, rpc_map, exception_map,
6976
interleave(func_def)
7077
debug_unparse("interleave", func_def)
7178

72-
lower_time(func_def, self.runtime_env.initial_time)
79+
lower_time(func_def, self.runtime_env.warmup_time/self.ref_period)
7380
debug_unparse("lower_time", func_def)
7481

7582
remove_inter_assigns(func_def)

‎artiq/coredevice/runtime.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,11 @@ def _debug_dump_obj(obj):
141141

142142

143143
class Environment(LinkInterface):
144-
def __init__(self, ref_period):
144+
def __init__(self, internal_ref_period):
145145
self.cpu_type = "or1k"
146-
self.ref_period = ref_period
146+
self.internal_ref_period = internal_ref_period
147147
# allow 1ms for all initial DDS programming
148-
self.initial_time = int(Fraction(1, 1000)/self.ref_period)
148+
self.warmup_time = 1*units.ms
149149

150150
def emit_object(self):
151151
tm = lt.TargetMachine.new(triple=self.cpu_type, cpu="generic")
@@ -155,4 +155,4 @@ def emit_object(self):
155155

156156
def __repr__(self):
157157
return "<Environment {} {}>".format(self.cpu_type,
158-
str(units.Hz/self.ref_period))
158+
str(1/self.ref_period))

‎soc/runtime/comm_serial.c

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ enum {
1111
MSGTYPE_LOAD_OBJECT,
1212
MSGTYPE_RUN_KERNEL,
1313
MSGTYPE_SET_BAUD_RATE,
14+
MSGTYPE_SWITCH_CLOCK,
1415
};
1516

1617
/* device to host */
@@ -30,6 +31,9 @@ enum {
3031
MSGTYPE_KERNEL_STARTUP_FAILED,
3132

3233
MSGTYPE_RPC_REQUEST,
34+
35+
MSGTYPE_CLOCK_SWITCH_COMPLETED,
36+
MSGTYPE_CLOCK_SWITCH_FAILED,
3337
};
3438

3539
static int receive_int(void)
@@ -169,6 +173,9 @@ void comm_serve(object_loader load_object, kernel_runner run_kernel)
169173
send_int(0x5a5a5a5a);
170174
uart_sync();
171175
uart_tuning_word_write(ftw);
176+
} else if(msgtype == MSGTYPE_SWITCH_CLOCK) {
177+
rtiocrg_clock_sel_write(receive_char());
178+
send_char(MSGTYPE_CLOCK_SWITCH_COMPLETED);
172179
} else
173180
send_char(MSGTYPE_MESSAGE_UNRECOGNIZED);
174181
}

0 commit comments

Comments
 (0)
Please sign in to comment.