Транслятор с языка Sim-nML » History » Version 15
Alexander Kamkin, 09/30/2011 03:02 PM
1 | 1 | Alexander Kamkin | h1. Транслятор с языка Sim-nML |
---|---|---|---|
2 | |||
3 | Данный документ содержит описание схемы трансляции спецификаций микропроцессоров на языке Sim-nML в набор Java классов, которые могут быть использованы инструментом MicroTESK для автоматизированной генерации тестовых программ. |
||
4 | |||
5 | h2. Язык Sim-nML |
||
6 | |||
7 | Язык Sim-nML является расширением языка nML. |
||
8 | |||
9 | h2. Java классы, создаваемые при трансляции |
||
10 | |||
11 | Список Java классов, которые создаются при трансляции: |
||
12 | 2 | Alexander Kamkin | |
13 | 3 | Alexander Kamkin | # Класс @ProcessorName@, который наследуется от класса @Processor@. Содержит большую часть информации о специфицируемом процессоре. |
14 | 2 | Alexander Kamkin | |
15 | >> *TODO:* уточнить, каким образом формируется имя этого класса. Возможен вариант получаеть это имя из имени файла со спецификацией на Sim-nML, или же можно требовать задавания этого имени от пользователя в качестве одного из параметров метода, который осуществляет трансляцию, или же можно использовать какие-то специальные аннотации в самой спецификации. |
||
16 | 1 | Alexander Kamkin | |
17 | 3 | Alexander Kamkin | h2. Правила грамматики для «общих» нетерминальных символов |
18 | |||
19 | 4 | Alexander Kamkin | h3. Бинарная операция |
20 | |||
21 | <pre> |
||
22 | 5 | Alexander Kamkin | BinOp : ''+'' |
23 | | ''-'' |
||
24 | | ''*'' |
||
25 | | ''/'' |
||
26 | | ''%'' |
||
27 | | DOUBLE_STAR |
||
28 | | LEFT_SHIFT |
||
29 | | RIGHT_SHIFT |
||
30 | | ROTATE_LEFT |
||
31 | | ROTATE_LEFT |
||
32 | | ROTATE_RIGHT |
||
33 | | ''<'' |
||
34 | | ''>'' |
||
35 | | LEQ |
||
36 | | GEQ |
||
37 | | EQ |
||
38 | | NEQ |
||
39 | | ''&'' |
||
40 | | ''^'' |
||
41 | | ''|'' |
||
42 | | AND |
||
43 | | OR |
||
44 | 4 | Alexander Kamkin | </pre> |
45 | |||
46 | h3. Числовая константа |
||
47 | |||
48 | 6 | Alexander Kamkin | <pre> |
49 | 7 | Alexander Kamkin | ConstNumExpr : ConstExprVal |
50 | | ConstNumExpr BinOp ConstExprVal |
||
51 | 1 | Alexander Kamkin | |
52 | 7 | Alexander Kamkin | ConstExprVal : CARD_CONST |
53 | | FIXED_CONST |
||
54 | | HEX_CONST |
||
55 | | ''!'' ConstNumExpr |
||
56 | | ''~'' ConstNumExpr |
||
57 | | ''+'' ConstNumExpr %prec ''~'' |
||
58 | | ''-'' ConstNumExpr %prec ''~'' |
||
59 | | ''('' ConstNumExpr '')'' |
||
60 | 6 | Alexander Kamkin | </pre> |
61 | 1 | Alexander Kamkin | |
62 | 6 | Alexander Kamkin | >> *TODO:* предлагается все числовые константные выражения сразу вычислять, в оттранслированный Java код вставлять уже только значения выражений. |
63 | 1 | Alexander Kamkin | |
64 | 6 | Alexander Kamkin | h3. Выражение |
65 | 1 | Alexander Kamkin | |
66 | 6 | Alexander Kamkin | <pre> |
67 | Bit_Expr : ID |
||
68 | | Bit_Expr ''+'' Bit_Expr |
||
69 | | Bit_Expr ''-'' Bit_Expr |
||
70 | | Bit_Expr ''*'' Bit_Expr |
||
71 | | Bit_Expr ''/'' Bit_Expr |
||
72 | | Bit_Expr ''%'' Bit_Expr |
||
73 | | Bit_Expr DOUBLE_STAR Bit_Expr |
||
74 | | ''('' Bit_Expr '')'' |
||
75 | | FIXED_CONST |
||
76 | | CARD_CONST |
||
77 | | STRING_CONST |
||
78 | | BINARY_CONST |
||
79 | | HEX_CONST |
||
80 | </pre> |
||
81 | 1 | Alexander Kamkin | |
82 | 6 | Alexander Kamkin | h3. OR правило |
83 | 1 | Alexander Kamkin | |
84 | 6 | Alexander Kamkin | <pre> |
85 | OrRule : Identifier_Or_List |
||
86 | 1 | Alexander Kamkin | |
87 | 6 | Alexander Kamkin | Identifier_Or_List : ID |
88 | | Identifier_Or_List ''|'' ID |
||
89 | </pre> |
||
90 | 1 | Alexander Kamkin | |
91 | 6 | Alexander Kamkin | h3. AND правило |
92 | 1 | Alexander Kamkin | |
93 | 6 | Alexander Kamkin | <pre> |
94 | AndRule : ''('' ParamList '')'' |
||
95 | 1 | Alexander Kamkin | |
96 | 6 | Alexander Kamkin | ParamList : |
97 | | ParamListPart |
||
98 | | ParamList '','' ParamListPart |
||
99 | 1 | Alexander Kamkin | |
100 | 6 | Alexander Kamkin | ParamListPart : ID '':'' TypeExpr |
101 | | ID '':'' ID |
||
102 | 1 | Alexander Kamkin | </pre> |
103 | |||
104 | h3. Атрибуты |
||
105 | 6 | Alexander Kamkin | |
106 | 1 | Alexander Kamkin | В языке Sim-nML атрибуты используются для описания свойств инструкций и режимов адресации. Описание каждого такого объекта может содержать произвольное число атрибутов. Атрибуты можно разделить на два класса: предопределенные атрибуты и пользовательские атрибуты. Описание предопределенных атрибутов приведено ниже. |
107 | |||
108 | 8 | Alexander Kamkin | <pre> |
109 | AttrDefList : |
||
110 | | AttrDefList AttrDef |
||
111 | 1 | Alexander Kamkin | |
112 | 8 | Alexander Kamkin | AttrDef : ID ''='' AttrDefPart |
113 | | SYNTAX ''='' ID ''.'' SYNTAX |
||
114 | | SYNTAX ''='' AttrExpr |
||
115 | | IMAGE ''='' ID ''.'' IMAGE |
||
116 | | IMAGE ''='' AttrExpr |
||
117 | | ACTION ''='' ID ''.'' ACTION |
||
118 | | ACTION ''='' ''{'' Sequence ''}'' |
||
119 | | USES ''='' UsesDef |
||
120 | 1 | Alexander Kamkin | |
121 | 8 | Alexander Kamkin | AttrDefPart : Expr |
122 | | ''{'' Sequence ''}'' |
||
123 | </pre> |
||
124 | 1 | Alexander Kamkin | |
125 | 8 | Alexander Kamkin | h4. Атрибут syntax |
126 | 1 | Alexander Kamkin | |
127 | Атрибут syntax используется для описания ассемблерного кодирования инструкции или режима адресации. Значения данного атрибута должны иметь строковый тип. Можно выделить следующие основные варианты определения атрибута syntax: |
||
128 | 9 | Alexander Kamkin | |
129 | # Строковая константа — значение определяется посредством строковой константы. Например, “nop”. |
||
130 | # Атрибут параметра — значение атрибута определяется как значение этого же атрибута syntax у одного из параметров описываемого объекта. Например, x.syntax. |
||
131 | # Форматированная строка — значение атрибута определяется с помощью специальной конструкции format. Данная конструкция является аналогом оператора printf в языке программирования С. Например, format(“%5b”, r). |
||
132 | |||
133 | >> *TODO:* добавить полное формальное описание конструкции format + описание транслчции данной конструкции в строковое выражение Java. |
||
134 | |||
135 | h5. Трансляция |
||
136 | |||
137 | 1 | Alexander Kamkin | При трансляции данного атрибута в классе, соответствующем описываемому объекту создается метод со следующей сигнатурой: |
138 | 9 | Alexander Kamkin | |
139 | <pre> |
||
140 | 1 | Alexander Kamkin | public String syntax() |
141 | 9 | Alexander Kamkin | </pre> |
142 | |||
143 | 1 | Alexander Kamkin | Для случая 1 из приведенного выше списка тело метода просто возвращает данную строковую константу. Для случая 2 метод возвращает результат вызова метода syntax соответствующего аргумента данного объекта. Такой аргумент должен содержаться в качестве поля в классе, соответствующем описываемому объекту. Для случая 3 метод возвращает результат трансляции конструкции format в строковое выражение языка Java. |
144 | 9 | Alexander Kamkin | |
145 | h4. Атрибут image |
||
146 | |||
147 | 1 | Alexander Kamkin | Атрибут image используется для описания бинарного кодирования описываемого объекта. Значения данного атрибута должны иметь строковый тип, причем допустимы только строки, содержащие символы «0», «1» и пробел. Пробелы используются для улучшения читаемости. Варианты определения атрибута image совпадают с вариантами определения атрибута syntax. |
148 | 10 | Alexander Kamkin | |
149 | h5. Трансляция: |
||
150 | |||
151 | 1 | Alexander Kamkin | Полностью аналогична трансляции атрибута syntax. |
152 | 9 | Alexander Kamkin | |
153 | 1 | Alexander Kamkin | h4. Атрибут action |
154 | |||
155 | Атрибут action используется для описания семантики выполнения инструкций. |
||
156 | |||
157 | 10 | Alexander Kamkin | h5. Трансляция: |
158 | |||
159 | >> *TODO:* при трансляции атрибута action обратить внимание на то, что в некоторых спецификациях данные между соседними в дереве инструкциями передают с использованием переменных (var). Это надо корректно учитывать, так как по умолчанию при трансляции таких объектов предлагается создавать локальные переменные соответствующих методов. С другой стороны, использование переменных для передачи данных между операциями противоречит описанию языка, в котором сказано, что состояние переменных не сохраняется при переходе от одной инструкции к другой. |
||
160 | |||
161 | 1 | Alexander Kamkin | h4. Атрибут uses |
162 | |||
163 | В текущей версии инструмента данный атрибут не рассматриваем. |
||
164 | |||
165 | 10 | Alexander Kamkin | h2. Основные конструкции языка |
166 | |||
167 | 1 | Alexander Kamkin | h3. Конструкция let |
168 | |||
169 | 10 | Alexander Kamkin | Конструкция let используется для объявления констант. Константы обладают следующими свойствами: |
170 | 1 | Alexander Kamkin | |
171 | 10 | Alexander Kamkin | # Константы получают глобальную область видимости. |
172 | # Константа может быть определена только один раз. |
||
173 | 1 | Alexander Kamkin | |
174 | 10 | Alexander Kamkin | <pre> |
175 | LetDef : LET ID ''='' LetExpr |
||
176 | 1 | Alexander Kamkin | |
177 | 10 | Alexander Kamkin | LetExpr : ConstNumExpr |
178 | | STRING_CONST |
||
179 | | IF ConstNumExpr THEN LetExpr OptionalElseLetExpr ENDIF |
||
180 | | SWITCH ''('' ConstNumExpr '')'' ''{'' CaseLetExprList ''}'' |
||
181 | 1 | Alexander Kamkin | |
182 | 10 | Alexander Kamkin | OptionalElseLetExpr : |
183 | | ELSE LetExpr |
||
184 | 1 | Alexander Kamkin | |
185 | 10 | Alexander Kamkin | CaseLetExprList : CaseLetExprList1 |
186 | | CaseLetExprList1 DEFAULT '':'' LetExpr |
||
187 | 1 | Alexander Kamkin | |
188 | 10 | Alexander Kamkin | CaseLetExprList1 : CaseLetExprStat |
189 | | CaseLetExprList1 CaseLetExprStat |
||
190 | 1 | Alexander Kamkin | |
191 | 10 | Alexander Kamkin | CaseLetExprStat : CASE ConstNumExpr '':'' LetExpr |
192 | </pre> |
||
193 | 1 | Alexander Kamkin | |
194 | 11 | Alexander Kamkin | h4. Примеры |
195 | |||
196 | <pre> |
||
197 | 1 | Alexander Kamkin | let REGS = 5 |
198 | let byte_order = “big” |
||
199 | let PC = “NIA” |
||
200 | let SP = “GPR[29]” |
||
201 | 11 | Alexander Kamkin | </pre> |
202 | |||
203 | h4. Проблемы |
||
204 | |||
205 | 1 | Alexander Kamkin | Не ясна семантика if и switch в том случае, когда определяемая величина не получает никакого значения, например |
206 | 11 | Alexander Kamkin | |
207 | <pre> |
||
208 | 1 | Alexander Kamkin | let c = if 0 then 0 endif |
209 | 11 | Alexander Kamkin | </pre> |
210 | |||
211 | h4. Ограничения |
||
212 | |||
213 | 1 | Alexander Kamkin | На первом этапе разработки прототипа предлагается ограничить поддержку конструкции let только простыми вариантами (без if и switch). Сложные вариаты let практически не используются на практике (ни один из примеров спецификаций представленных на сайте языка не содержал таких конструкций), их ценность представляется сомнительной. |
214 | 11 | Alexander Kamkin | |
215 | h4. Трансляция |
||
216 | |||
217 | 1 | Alexander Kamkin | Если LetExpr является ConstNumExpr, то вычисляется значение этого выражения. Для каждой определенной в спецификации константы определяется поле к классе ProcessorName следующего вида |
218 | 11 | Alexander Kamkin | |
219 | <pre> |
||
220 | public static final <type> ID = LetExpr; |
||
221 | </pre> |
||
222 | |||
223 | 1 | Alexander Kamkin | где <type> может принимать следующие значения: |
224 | |||
225 | 11 | Alexander Kamkin | * String – в случае, если LetExpr является STRING_CONST |
226 | * int – в случае, если LetExpr является числовым выражением и вычисленное значение есть целое.число, убирающееся в int. |
||
227 | * long – в случае, если LetExpr является числовым выражением и вычисленное значение есть целое.число, не убирающееся в int. |
||
228 | * float – в случае, если LetExpr является числовым выражением и его вычисленное значение есть число с фиксированной или плавающей точкой, убирающееся в тип float. |
||
229 | * double – в случае, если LetExpr является числовым выражением и его вычисленное значение есть число с фиксированной или плавающей точкой, не убирающееся в тип float. |
||
230 | 1 | Alexander Kamkin | |
231 | 11 | Alexander Kamkin | h4. Ошибочные ситуации: |
232 | 1 | Alexander Kamkin | |
233 | 11 | Alexander Kamkin | * наличие целых чисел, которые «не убираются» в long |
234 | * наличие чисел с плавающей точкой, которые «не убираются» в double |
||
235 | 1 | Alexander Kamkin | |
236 | 11 | Alexander Kamkin | h3. Конструкция type |
237 | 1 | Alexander Kamkin | |
238 | 11 | Alexander Kamkin | Конструкция type используется для определения синонимов новых типов. Синонимы определяются на основе существующих стандартных типов: |
239 | 1 | Alexander Kamkin | |
240 | 11 | Alexander Kamkin | * bool: определяет булевский тип, имеющий два предопределенных значений false и true. При применении преобразования типов (смотри coerces) false отображается в 0, true – в 1. При обратном преобразовании 0 отображается в false, любое ненулевое значение отображается в true. |
241 | 15 | Alexander Kamkin | * int(n): определяет сегмент целых чисел @[-2^(n-1), 2^(n-1)-1]@ |
242 | * card(n): определяет сегмент целых чисел @[0, 2^n-1]@ |
||
243 | * float: определяет число с плавающей точкой согласно стандарту IEEE 754 |
||
244 | 12 | Alexander Kamkin | >> *TODO:* несоответствие грамматики и описания |
245 | * fix(n, m): определяет число с фиксированной точкой, в котором n бит отводятся под мантису и m бит под экспоненту |
||
246 | >> *TODO:* уточнить, что описано в документации |
||
247 | 1 | Alexander Kamkin | * [n..m]: определяет интервал натуральных чисел (ограничение) |
248 | 12 | Alexander Kamkin | * enum(): определяет перечислимый тип, где именованные константы принимают значения от 0 до n-1. Будет совпадать с типом card(ceiling()) |
249 | 1 | Alexander Kamkin | |
250 | 11 | Alexander Kamkin | <pre> |
251 | 12 | Alexander Kamkin | TypeSpec : TYPE ID ''='' TypeExpr |
252 | 11 | Alexander Kamkin | |
253 | 12 | Alexander Kamkin | TypeExpr : BOOL |
254 | | INT ''('' ConstNumExpr '')'' |
||
255 | | CARD ''('' ConstNumExpr '')'' |
||
256 | | FIX ''('' ConstNumExpr '','' ConstNumExpr '')'' |
||
257 | | FLOAT ''('' ConstNumExpr '','' ConstNumExpr'')'' |
||
258 | | ''['' ConstNumExpr DOUBLE_DOT ConstNumExpr '']'' |
||
259 | | ENUM ''('' IdentifierList '')'' |
||
260 | 1 | Alexander Kamkin | |
261 | 11 | Alexander Kamkin | IdentifierList : ID |
262 | 12 | Alexander Kamkin | | ID ''='' CARD_CONST |
263 | | IdentifierList '','' ID |
||
264 | | IdentifierList '','' ID ''='' CARD_CONST |
||
265 | 1 | Alexander Kamkin | </pre> |
266 | |||
267 | h4. Примеры |
||
268 | |||
269 | 12 | Alexander Kamkin | <pre> |
270 | type bit = card ( 1 ) |
||
271 | type byte = card ( 8 ) |
||
272 | type address = card ( REGS ) |
||
273 | type breakcode = card ( 20 ) |
||
274 | </pre> |
||
275 | 1 | Alexander Kamkin | |
276 | h4. Проблемы |
||
277 | |||
278 | Моделирование чисел с фиксированной точкой. |
||
279 | |||
280 | h4. Ограничения |
||
281 | 11 | Alexander Kamkin | |
282 | В текущей реализации не рассматриваем случаи, когда определяется интервал, по мощности превосходящий максимальный соответствующий стандартный тип а Java. Например, исключаем из рассмотрения card (128). |
||
283 | |||
284 | h4. Трансляция: |
||
285 | |||
286 | Для каждого такого типа-синонима создается новый класс с именем ID, единственным полем которого будет переменная объемлющего типа, а методы будут обеспечивать корректность работы с этой переменной, контролируя невыход их множества допустимых значений. В случае нарушения данных ограничений метод должен выбрасывать исключение. |
||
287 | 12 | Alexander Kamkin | |
288 | 11 | Alexander Kamkin | Необходимо учесть, что при трансляции операторов присваивания таким переменным, надо использовать методы set из соответствующих классов. Причем эти методы set должны в качестве параметров принимать так же номер строки и позицию в nml файле, по которой находится данный оператор присваивания. Эти данные используются отладки спецификаций в случае ошибок. |
289 | 12 | Alexander Kamkin | |
290 | 11 | Alexander Kamkin | Перечисления транслируются в стандартные Java перечисления. Например, пусть есть перечисление: |
291 | 12 | Alexander Kamkin | |
292 | <pre> |
||
293 | type <name> = enum(id1 = val1, id2 = val2, ..., idn = valn) |
||
294 | </pre> |
||
295 | |||
296 | 11 | Alexander Kamkin | Оно транслируется в отдельный файл <name>.java, который содержит Java перечисление следующего вида: |
297 | |||
298 | 1 | Alexander Kamkin | <pre> |
299 | 11 | Alexander Kamkin | public enum <name> { |
300 | 1 | Alexander Kamkin | id1(val1), id2(val2), ..., idn(valn) |
301 | 11 | Alexander Kamkin | } |
302 | </pre> |
||
303 | |||
304 | 1 | Alexander Kamkin | h4. Ошибочные ситуации |
305 | |||
306 | h3. Конструкция mem |
||
307 | |||
308 | Конструкция mem используется для описания памяти моделируемого микропроцессора. Общий вид такого определения представлен ниже: |
||
309 | 13 | Alexander Kamkin | |
310 | <pre> |
||
311 | 1 | Alexander Kamkin | mem M [N, type] [optional-properties] |
312 | 13 | Alexander Kamkin | </pre> |
313 | |||
314 | В этом определении, M – имя данного объекта памяти, N – количество ячеек памяти, и type – тип каждой такой ячейки памяти. Если тип не указан, то по умолчанию тип полагается равным card(8). Доступ к данным ячейкам памяти осуществляется по средствам оператора индексирования: M[0], M[1], ..., M[n-1]. Опциональные параметры могут быть следующими: |
||
315 | |||
316 | # alias – описывает новую память как синоним какойто части уже описанной памяти. В этом случае оба имени будут ссылать на одни и те же ячейки памяти, но могут интерпретировать их по разному. Например: |
||
317 | |||
318 | <pre> |
||
319 | 1 | Alexander Kamkin | mem A[6, int(32)] |
320 | mem M[3, card(32)] alias = A[3] |
||
321 | 13 | Alexander Kamkin | </pre> |
322 | |||
323 | 1 | Alexander Kamkin | В этом случае ячейки памяти, доступные по обращениям A[3], A[4], A[5], теперь могут быть доступны и по обращениям M[0], M[1], M[2] соответственно. Отличие заключается в том, что в случае обращений с использованием имени A содержимое ячейки интерпретируется как 32-ух разрядное знаковое число, в случае же, когда обращение идет по имени M, содержимое интерпретируется, как беззнаковое число. |
324 | |||
325 | 13 | Alexander Kamkin | <pre> |
326 | Bit_Optr : BIT_LEFT Bit_Expr DOUBLE_DOT Bit_Expr BIT_RIGHT |
||
327 | 1 | Alexander Kamkin | |
328 | 13 | Alexander Kamkin | MemorySpec : MEM ID ''['' SizeType '']'' OptionalMemVarAttr |
329 | 1 | Alexander Kamkin | |
330 | 13 | Alexander Kamkin | SizeType : TypeExpr |
331 | | ConstNumExpr |
||
332 | | ConstNumExpr '','' TypeExpr |
||
333 | 1 | Alexander Kamkin | |
334 | 13 | Alexander Kamkin | OptionalMemVarAttr : |
335 | | ALIAS ''='' MemLocation |
||
336 | 1 | Alexander Kamkin | |
337 | 13 | Alexander Kamkin | MemLocation : ID Opt_Bit_Optr |
338 | | ID ''['' NumExpr '']'' Opt_Bit_Optr |
||
339 | 1 | Alexander Kamkin | |
340 | 13 | Alexander Kamkin | Opt_Bit_Optr : |
341 | | Bit_Optr |
||
342 | 1 | Alexander Kamkin | |
343 | 13 | Alexander Kamkin | Bit_Optr : BIT_LEFT Bit_Expr DOUBLE_DOT Bit_Expr BIT_RIGHT |
344 | </pre> |
||
345 | 1 | Alexander Kamkin | |
346 | 13 | Alexander Kamkin | >> *TODO:* не ясна семантика Opt_Bit_Expr в грамматики для конструкции mem, в примерах использование именно такой формы тоже не было встречено. |
347 | |||
348 | h4. Примеры |
||
349 | |||
350 | <pre> |
||
351 | mem A[6, int(32)] |
||
352 | mem M[3, card(32)] alias = A[3] |
||
353 | </pre> |
||
354 | |||
355 | h4. Проблемы |
||
356 | |||
357 | h4. Ограничения |
||
358 | |||
359 | h4. Трансляция |
||
360 | |||
361 | 1 | Alexander Kamkin | Анализ спецификаций на языке Sim-nML позволил выявить, что конструкция mem может быть использована для двух различных целей. Во-первых, она может использоваться для описания памяти моделируемого микропроцессора. В этом случае число ячеек памяти в описании довольно большое (N >> 1). Необходимо найти описание с максимальным числом ячеек, именно оно будет транслироваться в класс, моделирующий память. При трансляции данного описания создается класс ProcessorNameMemory, который является наследником абстрактного класса Memory из библиотеки поддержки трансляции. Класс ProcessorNameMemory имеет следующий вид: |
362 | 13 | Alexander Kamkin | |
363 | <pre> |
||
364 | 1 | Alexander Kamkin | class ProcessorNameMemory { |
365 | 13 | Alexander Kamkin | public static final SIZE = <N>; |
366 | protected HashMap(Long, <type>) memoryHashMap = new HashMap(Long, <type>)(); |
||
367 | 1 | Alexander Kamkin | } |
368 | 13 | Alexander Kamkin | </pre> |
369 | |||
370 | 1 | Alexander Kamkin | Для всех других описаний памяти, которые являются синонимами основной памяти (используют alias <имя основной памяти>), в атрибутах action для операций необходимо изменять обращения по этим именам на обращения по имени основной памяти. |
371 | 13 | Alexander Kamkin | Второй класс описаний памяти составляют описания, которые имеют небольшое число ячеек (обычно 1 или 2). Такие описания используются в качестве локальных переменных при описании атрибутов action для инструкций. Все |
372 | такие описания при трансляции запоминаются. Затем при трансляции атрибутов action в методы инструкций, для каждой запомненной памяти, по которой присутствует обращение в данном атрибуте, вводится локальная переменная соответствующего типа. Все обращения по данным элементам памяти заменяются при трансляции на обращения к данной переменной. Например, |
||
373 | |||
374 | <pre> |
||
375 | mem tmp_signed_byte [ 1 , int (32) ] |
||
376 | ... |
||
377 | action = { |
||
378 | tmp_signed_byte = 31 |
||
379 | ... |
||
380 | } |
||
381 | </pre> |
||
382 | |||
383 | 1 | Alexander Kamkin | При трансляции атрибута action получаем получим: |
384 | |||
385 | 13 | Alexander Kamkin | <pre> |
386 | public void execute(...) { |
||
387 | int tmp_signed_byte |
||
388 | ... |
||
389 | } |
||
390 | </pre> |
||
391 | 1 | Alexander Kamkin | |
392 | 13 | Alexander Kamkin | >> *TODO:* определить абстрактный класс Memory |
393 | 1 | Alexander Kamkin | |
394 | 13 | Alexander Kamkin | h4. Ошибочные ситуации |
395 | |||
396 | 1 | Alexander Kamkin | h3. Конструкция reg |
397 | |||
398 | Конструкция reg используется для описания регистров микропроцессора. Общая форма описания регистров представлена ниже: |
||
399 | 13 | Alexander Kamkin | |
400 | <pre> |
||
401 | 1 | Alexander Kamkin | reg R [N, type] [optional-properties] |
402 | 13 | Alexander Kamkin | </pre> |
403 | |||
404 | 1 | Alexander Kamkin | В представленном определении R – имя регистрового файла, N – опциональный параметр, показывающий количество регистров в регистровом файле и type – тип каждого регистра. Если параметр N не указан, то по умолчанию он полагается равным 1.Доступ к регистрам данного регистрового файла осуществляется посредством оператора индексирования — R[0], R[1], …, R[N-1]. Определение регистров может иметь следующие опциональные атрибуты: |
405 | Ports: позволяет указать число портов чтения и записи для данного регистрового файла. Например: |
||
406 | 13 | Alexander Kamkin | |
407 | <pre> |
||
408 | 1 | Alexander Kamkin | reg R[16, int(8)] port = 3, 2 |
409 | 13 | Alexander Kamkin | </pre> |
410 | |||
411 | 1 | Alexander Kamkin | В представленном примере регистровый файл R имеет 3 порта для записи и 2 порта для чтения. Кроме того, каждый регистр в данном регистровом файле имеет 2 порта для чтения, так же как и весь регистровый файл, и один порт для записи. Порты чтения и записи для регистров рассматриваются в качестве ресурсов и используются для определения зависимостей между инструкциями. |
412 | Initial: позволяет указать начальное значение для описанных регистров. Например: |
||
413 | 13 | Alexander Kamkin | |
414 | <pre> |
||
415 | 1 | Alexander Kamkin | reg R[1, card(32)] initial = 100 |
416 | 13 | Alexander Kamkin | </pre> |
417 | 1 | Alexander Kamkin | |
418 | 13 | Alexander Kamkin | <pre> |
419 | RegisterSpec : REG ID ''['' SizeType '']'' OptionalRegAttr |
||
420 | 1 | Alexander Kamkin | |
421 | 13 | Alexander Kamkin | OptionalRegAttr : |
422 | | PortsDef |
||
423 | | InitialDef |
||
424 | | PortsDef InitialDef |
||
425 | | InitialDef PortsDef |
||
426 | 1 | Alexander Kamkin | |
427 | 13 | Alexander Kamkin | PortsDef : PORTS ''='' CARD_CONST '','' CARD_CONST |
428 | 1 | Alexander Kamkin | |
429 | 13 | Alexander Kamkin | InitialDef : INITIALA ''='' ConstNumExpr |
430 | </pre> |
||
431 | 1 | Alexander Kamkin | |
432 | 13 | Alexander Kamkin | h4. Примеры |
433 | 1 | Alexander Kamkin | |
434 | 13 | Alexander Kamkin | <pre> |
435 | reg GPR [2 ** REGS, signed_long] |
||
436 | reg LO [1, signed_long] |
||
437 | reg NIA [1, long] |
||
438 | </pre> |
||
439 | |||
440 | h4. Проблемы |
||
441 | |||
442 | h4. Ограничения |
||
443 | |||
444 | h4. Трансляция |
||
445 | |||
446 | 1 | Alexander Kamkin | Для каждого описанного регистрового файла создается класс RegisterFileName, который является наследником абстрактного класса библиотеки поддержки трансляции Register. Класс Register содержит следующие поля и методы: |
447 | 13 | Alexander Kamkin | |
448 | <pre> |
||
449 | 1 | Alexander Kamkin | class Register { |
450 | 13 | Alexander Kamkin | public static final int WRITE_PORTS = 1; |
451 | public static final int READ_PORTS = 1; |
||
452 | ... |
||
453 | 1 | Alexander Kamkin | } |
454 | 13 | Alexander Kamkin | </pre> |
455 | |||
456 | 1 | Alexander Kamkin | Класс RegisterFileName содержит следующие поля и методы: |
457 | 13 | Alexander Kamkin | |
458 | <pre> |
||
459 | 1 | Alexander Kamkin | class RegisterFileName { |
460 | 13 | Alexander Kamkin | public static final int READ_PORTS = <read_ports>; |
461 | protected <type> value = <init_value>; |
||
462 | ... |
||
463 | 1 | Alexander Kamkin | } |
464 | 13 | Alexander Kamkin | </pre> |
465 | |||
466 | 1 | Alexander Kamkin | Так же в класс ProcessorName добавляются следующие поля и методы: |
467 | 13 | Alexander Kamkin | |
468 | <pre> |
||
469 | public static final int RegisterFileName_WRITE_PORTS = <write_ports>; |
||
470 | |||
471 | protected RegisterFileName <some_uniq_name> [] = { |
||
472 | new RegisterFileName(), |
||
473 | ... |
||
474 | } |
||
475 | </pre> |
||
476 | |||
477 | 1 | Alexander Kamkin | Причем количество элементов в массиве RegisterFileName равно N. |
478 | 13 | Alexander Kamkin | |
479 | h4. Ошибочные ситуации |
||
480 | 1 | Alexander Kamkin | |
481 | h3. Конструкция var |
||
482 | |||
483 | Конструкция var используется для определения временных переменных. Типичная конструкция определения временной переменной выглядит следующим образом: |
||
484 | 14 | Alexander Kamkin | |
485 | <pre> |
||
486 | 1 | Alexander Kamkin | var TEMP[N, type] |
487 | 14 | Alexander Kamkin | </pre> |
488 | |||
489 | 1 | Alexander Kamkin | В приведенном выше определении TEMP – имя массива временных переменных, N – количество переменных в определенном массиве и type – тип каждой переменной в массиве. Если параметр N не определен, то по умолчанию он полагается равным 1. Доступ к переменным осуществляется посредством оператора индексирования — TEMP[0], TEMP[1], …, TEMP[N-1]. Важно отметить, что значения временных переменных не сохраняются при переходе от одной инструкции к другой. |
490 | |||
491 | 14 | Alexander Kamkin | >> *COMMENT:* по всей видимости переменные были введены в язык для прекращения нецелевого использования конструкций определения памяти для введения временных данных. Смотри второй класс конструкций определения памяти в разделе «трансляция» описания конструкции mem |
492 | |||
493 | >> *TODO:* противоречие между текстовым описанием и грамматикой |
||
494 | |||
495 | <pre> |
||
496 | VarSpec : VAR ID ''['' SizeType '']'' OptionalMemVarAttr |
||
497 | </pre> |
||
498 | |||
499 | h4. Примеры |
||
500 | |||
501 | <pre> |
||
502 | var amod[1, card(8)] |
||
503 | var carry[1, card(1)] |
||
504 | var op1[1, int(32)] |
||
505 | </pre> |
||
506 | |||
507 | h4. Проблемы |
||
508 | |||
509 | h4. Ограничения |
||
510 | |||
511 | h4. Трансляция |
||
512 | |||
513 | 1 | Alexander Kamkin | Трансляция выполняется аналогично второму классу конструкций определения памяти. Описание приводится в разделе «трансляция» описания конструкции mem. |
514 | 14 | Alexander Kamkin | |
515 | h4. Ошибочные ситуации |
||
516 | |||
517 | h3. Конструкция mode |
||
518 | |||
519 | 1 | Alexander Kamkin | Конструкция mode используется для спецификации механизмов адресации. Основу данного описания этих механизмов составляют два вида конструкций: «И»-правила и «ИЛИ»-правила. |
520 | «ИЛИ»-правила используются для описания логически связанной группы механизмов адресации. С помощью «ИЛИ»-правила можно задать группе таких механизмов общие атрибуты. Общий вид «ИЛИ»-правила следующий: |
||
521 | |||
522 | «И»-правила используются для описания листовых элементов в дереве механизмов адресации. Общий вид «И»-правила следующий: |
||
523 | |||
524 | 14 | Alexander Kamkin | <pre> |
525 | ModeRuleSpec : MODE ID ModeSpecPart |
||
526 | 1 | Alexander Kamkin | |
527 | 14 | Alexander Kamkin | ModeSpecPart : AndRule OptionalModeExpr AttrDefList |
528 | | OrRule |
||
529 | 1 | Alexander Kamkin | |
530 | 14 | Alexander Kamkin | OptionalModeExpr : |
531 | | ''='' Expr |
||
532 | </pre> |
||
533 | 1 | Alexander Kamkin | |
534 | 14 | Alexander Kamkin | h4. Примеры |
535 | 1 | Alexander Kamkin | |
536 | 14 | Alexander Kamkin | h4. Проблемы |
537 | |||
538 | h4. Ограничения |
||
539 | |||
540 | h4. Трансляция |
||
541 | |||
542 | 1 | Alexander Kamkin | Трансляция дерева «И»-«ИЛИ» правил проводится идентично как для инструкций, так и для режимов адресации. Подробные описания общих концепций трансляции приведены в разделе «Трансляция» описания конструкции op. Эти положения верны и при описании режимов адресации. Специфические моменты при трансляции этих описаний отражены ниже. |
543 | 14 | Alexander Kamkin | |
544 | 1 | Alexander Kamkin | У и правил конструкции mode может присутствовать дополнительный опциональный элемент, который вычисляет значение параметра, передающегося данным способом адресации. Для каждого правила, обладающего таким элементом, в соответствующем классе создается тело метода getValue() на основе описания данного элемента. Метод возвращает оттранслированное выражение записанное в правиле после знака равенства. |
545 | |||
546 | 14 | Alexander Kamkin | h4. Ошибочные ситуации |
547 | |||
548 | 1 | Alexander Kamkin | h3. Конструкция op |
549 | |||
550 | Конструкция op используется для описания системы команд моделируемого процессора. |
||
551 | |||
552 | 14 | Alexander Kamkin | <pre> |
553 | OpRuleSpec : OP ID OpRulePart |
||
554 | OpRulePart : AndRule AttrDefList |
||
555 | | OrRule |
||
556 | </pre> |
||
557 | 1 | Alexander Kamkin | |
558 | 14 | Alexander Kamkin | h4. Примеры |
559 | |||
560 | h4. Проблемы |
||
561 | |||
562 | h4. Ограничения |
||
563 | |||
564 | h4. Трансляция |
||
565 | |||
566 | 1 | Alexander Kamkin | Общие положения при трансляции древовидной структуры «И»-«ИЛИ» правил заключаются в следующем. Для каждого правила создается класс. Классы, соответствующие элементам из правых частей «ИЛИ» правил связываются с классом, соответствующим элементу в левой части, отношением наследования. Каждый класс, соответствующий элементу из списка параметров в «И»-правиле, связывается с классом, соответствующим элементу из левой части правила, отношением агрегации. На примере ниже продемонстрированы данные принципы с использованием нотации UML для отображения зависимостей между классами. |
567 | 14 | Alexander Kamkin | |
568 | <pre> |
||
569 | 1 | Alexander Kamkin | op instruction(inst alu_op) |
570 | op alu_instruction = add | sub |
||
571 | 14 | Alexander Kamkin | </pre> |
572 | |||
573 | 1 | Alexander Kamkin | В каждом из этих классов создаются методы, соответствующие атрибутам. Механизм трансляции атрибутов подробно описан в разделе «Атрибуты». Имена создаваемых классов должны содержать некоторый служебный суффикс, что будет говорить о служебном внутреннем использовании данных классов. |
574 | 14 | Alexander Kamkin | |
575 | 1 | Alexander Kamkin | Для каждого элемента из списка параметров «И» правила в соответствующем классе создаются поле. Для класса также создается конструктор с сигнатурой, соответствующей данному правилу, который инициализирует эти поля. |
576 | 14 | Alexander Kamkin | |
577 | >> *TODO:* посмотреть информацию про модификаторы доступа классов, пакетов для защиты служебных классов от некорректного использования |
||
578 | |||
579 | 1 | Alexander Kamkin | Далее, для каждого листового элемента в дереве инструкций создается еще один класс, который наследуется от класса Instruction (соответствует корню дерева). Эти классы распределяются по пакетам в соответствии со структурой дерева. Для каждого не листового узла дерева создается отдельный пакет, куда вложены все пакеты и классы, соответствующие потомкам данного узла. |
580 | 14 | Alexander Kamkin | |
581 | h4. Ошибочные ситуации |