def type_check_RMV(context, field): if not is_reserved_field(field.field): if field.field in context.header: del context.header[field.field] else: raise TypeError("field (%s) is not present in the header." % str(field.field)) else: raise TypeError("field (%s) is a reserved field." % str(field.field)) context.labels = Labels(syntax.Label(''))
def type_check_ADD(context, field, size): if not is_reserved_field(field.field): if field.field not in context.header: context.header[field.field] = size else: raise TypeError("field (%s) is already present in the header." % str(field.field)) else: raise TypeError("field (%s) is a reserved field." % str(field.field)) context.labels = Labels(syntax.Label(''))
def is_reserved_or_argument_field(field, argument_fields): return is_reserved_field(field) or (field in argument_fields)
def defines(flow_graph, field, argument_fields): instructions = set() for _, node in flow_graph.iteritems(): for instruction in node.basic_block: if isinstance(instruction, I.ADD): if instruction.field.field == field: instructions |= {instruction} elif isinstance(instruction, I.LD): if isinstance(instruction.destination, O.Field): if instruction.destination.field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} elif isinstance(instruction, I.OP): if isinstance(instruction.destination, O.Field): if instruction.destination.field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} elif isinstance(instruction, I.LDt): if isinstance(instruction.destinations, O.Operands__): for operand in instruction.destinations: if isinstance(operand, O.Field): if operand.field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} break else: raise RuntimeError() elif isinstance(instruction, I.LKt): if isinstance(instruction.index, O.Field): if instruction.index.field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} elif isinstance(instruction, I.CRC): if isinstance(instruction.destination, O.Field): if instruction.destination.field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} elif isinstance(instruction, I.HSH): if isinstance(instruction.destination, O.Field): if instruction.destination.field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} elif isinstance(instruction, I.CNC): if isinstance(instruction.codes, I.Codes): for code in instruction.codes: for _field in code.argument_fields: if _field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} break else: raise RuntimeError() elif isinstance(instruction, I.ATM): if isinstance(instruction.code, I.Code): for _field in instruction.code.argument_fields: if _field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} break else: raise RuntimeError() elif isinstance(instruction, I.SEQ): if isinstance(instruction.code, I.Code): for _field in instruction.code.argument_fields: if _field == field: if not (is_reserved_field(field) or field in argument_fields): instructions |= {instruction} break else: raise RuntimeError() elif isinstance(instruction, I.Instruction): pass else: raise RuntimeError() return instructions
def field(instruction, argument_fields, exclude_list): operands = set() if any(map(lambda instruction_type: isinstance(instruction, instruction_type), exclude_list)): pass # I.ID # I.DRP # I.CTR elif isinstance(instruction, I.ADD): operands |= {instruction.field.field} # I.RMV elif isinstance(instruction, I.LD): if isinstance(instruction.destination, O.Field): if not ( is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields ): operands |= {instruction.destination.field} # I.ST elif isinstance(instruction, I.OP): if isinstance(instruction.destination, O.Field): if not ( is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields ): operands |= {instruction.destination.field} # I.PUSH # I.POP # I.BR # I.JMP # I.LBL elif isinstance(instruction, I.LDt): if isinstance(instruction.destinations, O.Operands__): for operand in instruction.destinations: if isinstance(operand, O.Field): if not (is_reserved_field(operand.field) or operand.field in argument_fields): operands |= {operand.field} else: raise RuntimeError() # I.STt # I.INCt elif isinstance(instruction, I.LKt): if isinstance(instruction.index, O.Field): if not (is_reserved_field(instruction.index.field) or instruction.index.field in argument_fields): operands |= {instruction.index.field} elif isinstance(instruction, I.CRC): if isinstance(instruction.destination, O.Field): if not ( is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields ): operands |= {instruction.destination.field} elif isinstance(instruction, I.HSH): if isinstance(instruction.destination, O.Field): if not ( is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields ): operands |= {instruction.destination.field} # I.HLT elif isinstance(instruction, I.CNC): if isinstance(instruction.codes, I.Codes): for code in instruction.codes: for field in code.argument_fields: operands |= {field} else: raise RuntimeError() elif isinstance(instruction, I.ATM): if isinstance(instruction.code, I.Code): for field in instruction.code.argument_fields: operands |= {field} else: raise RuntimeError() elif isinstance(instruction, I.SEQ): if isinstance(instruction.code, I.Code): for field in instruction.code.argument_fields: operands |= {field} else: raise RuntimeError() elif isinstance(instruction, I.Instruction): pass else: raise RuntimeError() return operands
def field(instruction, argument_fields, exclude_list): operands = set() if any( map( lambda instruction_type: isinstance( instruction, instruction_type), exclude_list)): pass # I.ID # I.DRP # I.CTR elif isinstance(instruction, I.ADD): operands |= {instruction.field.field} # I.RMV elif isinstance(instruction, I.LD): if isinstance(instruction.destination, O.Field): if not (is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields): operands |= {instruction.destination.field} # I.ST elif isinstance(instruction, I.OP): if isinstance(instruction.destination, O.Field): if not (is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields): operands |= {instruction.destination.field} # I.PUSH # I.POP # I.BR # I.JMP # I.LBL elif isinstance(instruction, I.LDt): if isinstance(instruction.destinations, O.Operands__): for operand in instruction.destinations: if isinstance(operand, O.Field): if not (is_reserved_field(operand.field) or operand.field in argument_fields): operands |= {operand.field} else: raise RuntimeError() # I.STt # I.INCt elif isinstance(instruction, I.LKt): if isinstance(instruction.index, O.Field): if not (is_reserved_field(instruction.index.field) or instruction.index.field in argument_fields): operands |= {instruction.index.field} elif isinstance(instruction, I.CRC): if isinstance(instruction.destination, O.Field): if not (is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields): operands |= {instruction.destination.field} elif isinstance(instruction, I.HSH): if isinstance(instruction.destination, O.Field): if not (is_reserved_field(instruction.destination.field) or instruction.destination.field in argument_fields): operands |= {instruction.destination.field} # I.HLT elif isinstance(instruction, I.CNC): if isinstance(instruction.codes, I.Codes): for code in instruction.codes: for field in code.argument_fields: operands |= {field} else: raise RuntimeError() elif isinstance(instruction, I.ATM): if isinstance(instruction.code, I.Code): for field in instruction.code.argument_fields: operands |= {field} else: raise RuntimeError() elif isinstance(instruction, I.SEQ): if isinstance(instruction.code, I.Code): for field in instruction.code.argument_fields: operands |= {field} else: raise RuntimeError() elif isinstance(instruction, I.Instruction): pass else: raise RuntimeError() return operands