Ejemplo n.º 1
0
class GroupDocEditor(object):
    def __init__(self, group_inst):

        builder = gtk.Builder()
        builder.add_from_file(GLADE_GTXT)
        self.group_doc = builder.get_object('group_text')
        self.group_title = builder.get_object('group_title')
        self.group_inst = group_inst
        self.buffer = builder.get_object('overview1').get_buffer()
        pango_font = pango.FontDescription("monospace")
        builder.get_object('overview1').modify_font(pango_font)

        self.__prj_preview = PreviewEditor(
            self.buffer, builder.get_object('scroll_webkit1'))

        self.buffer.set_text(group_inst.docs)
        self.group_title.set_text(group_inst.title)

        builder.get_object("button2").connect("button-press-event", self._save)
        builder.get_object("button3").connect("button-press-event",
                                              self._cancel)
        builder.get_object('title').set_text(group_inst.name)
        if PREVIEW_ENABLED:
            self.__prj_preview.enable()
        else:
            self.__prj_preview.disable()
        self.__spell = Spell(builder.get_object('overview1'))

        self.group_doc.connect('delete-event', self.on_delete_event)
        self.group_doc.connect('destroy-event', self.on_destroy_event)
        self.group_doc.show()

    def on_destroy_event(self, obj):
        self.__spell.detach()

    def on_delete_event(self, obj, event):
        self.__spell.detach()

    def _cancel(self, obj, data):
        self.group_doc.destroy()

    def _save(self, obj, data):
        self.group_inst.docs = self.buffer.get_text(
            self.buffer.get_start_iter(), self.buffer.get_end_iter(), False)
        self.group_inst.title = self.group_title.get_text()
        self.group_doc.destroy()
Ejemplo n.º 2
0
class GroupDocEditor(object):
    def __init__(self, group_inst, callback):

        builder = gtk.Builder()
        builder.add_from_file(GLADE_GTXT)
        self.callback = callback
        self.group_doc = builder.get_object('group_text')
        self.group_title = builder.get_object('group_title')
        self.group_inst = group_inst
        self.buffer = builder.get_object('overview1').get_buffer()
        pango_font = pango.FontDescription("monospace")
        builder.get_object('overview1').modify_font(pango_font)

        self.__prj_preview = PreviewEditor(
            self.buffer, builder.get_object('scroll_webkit1'))

        self.buffer.set_text(group_inst.docs)
        self.group_title.set_text(group_inst.title)

        builder.get_object("overview1").connect("key-press-event",
                                                self.on_key_press_event)
        builder.get_object("button2").connect("button-press-event", self._save)
        builder.get_object("button3").connect("button-press-event",
                                              self._cancel)
        builder.get_object('title').set_text(group_inst.name)
        if PREVIEW_ENABLED:
            self.__prj_preview.enable()
        else:
            self.__prj_preview.disable()
        self.__spell = Spell(builder.get_object('overview1'))

        self.group_doc.connect('delete-event', self.on_delete_event)
        self.group_doc.connect('destroy-event', self.on_destroy_event)
        self.group_doc.show()

    def on_key_press_event(self, obj, event):
        if event.keyval == gtk.keysyms.F12:
            clean_format_if_needed(obj)
            return True
        return False

    def on_destroy_event(self, obj):
        self.__spell.detach()

    def on_delete_event(self, obj, event):
        self.__spell.detach()

    def _cancel(self, obj, data):
        self.group_doc.destroy()

    def _save(self, obj, data):

        new_docs = self.buffer.get_text(
            self.buffer.get_start_iter(), self.buffer.get_end_iter(), False)
        new_title = self.group_title.get_text()

        if self.group_inst.docs != new_docs:
            self.group_inst.docs = new_docs
            self.callback(True)
        if self.group_inst.title != new_title:
            self.group_inst.title = new_title
            self.callback(True)
        self.group_doc.destroy()
Ejemplo n.º 3
0
class BitFieldEditor(object):
    """
    Bit field editing class.
    """

    def __init__(self, dbase, register, bit_field, modified, top_builder):
        self.__db = dbase
        self.__modified = modified
        self.__register = register
        self.__bit_field = bit_field
        self.__builder = gtk.Builder()
        self.__top_builder = top_builder
        self.__builder.add_from_file(GLADE_BIT)
        self.__top_window = self.__builder.get_object("editfield")
        self.__control_obj = self.__builder.get_object('control')
        self.__name_obj = self.__builder.get_object("field_name")
        self.__register_obj = self.__builder.get_object("register_name")
        self.__output_obj = self.__builder.get_object("output")
        self.__type_obj = self.__builder.get_object('type')
        self.__input_obj = self.__builder.get_object("input")
        self.__reset_obj = self.__builder.get_object("reset_value")
        self.__static_obj = self.__builder.get_object('static')
        self.__text_buffer = self.__builder.get_object("descr").get_buffer()
        self.__value_tree_obj = self.__builder.get_object('values')
        self.__output_enable_obj = self.__builder.get_object("outen")
        self.__side_effect_obj = self.__builder.get_object("side_effect")
        self.__verilog_obj = self.__builder.get_object('verilog_code')
        self.__volatile_obj = self.__builder.get_object('volatile')
        self.__col = None
        self.__top_window.set_title(
            "Edit Bit Field - [%02x] %s" % (register.address,
                                            register.register_name))

        self.__spell = Spell(self.__builder.get_object("descr"))

        self.__top_window.set_icon_from_file(
            os.path.join(INSTALL_PATH, "media", "flop.svg"))
        (input_enb, control_enb) = TYPE_TO_ENABLE[bit_field.field_type]
        self.__input_obj.set_sensitive(input_enb)
        self.__control_obj.set_sensitive(control_enb)

        pango_font = pango.FontDescription("monospace")
        self.__builder.get_object("descr").modify_font(pango_font)

        self.build_values_list()

        self.__list_model = gtk.ListStore(str, str, str)
        self.__model_selection = self.__value_tree_obj.get_selection()
        self.__value_tree_obj.set_model(self.__list_model)

        self.__used_tokens = set()
        for value in self.__bit_field.values:
            self.__used_tokens.add(value[1])
            self.__list_model.append(row=value)

        self.__initialize_from_data(bit_field)
        self.__output_obj.set_sensitive(self.__output_enable_obj.get_active())
        self.__check_data()

        self.__text_buffer.connect('changed', self.__description_changed)

        try:
            edge = "posedge" if self.__db.reset_active_level else "negedge"
            condition = "" if self.__db.reset_active_level else "~"
            be_level = "" if self.__db.byte_strobe_active_level else "~"

            name_map = {'MODULE': self.__db.module_name,
                        'BE_LEVEL': be_level,
                        'RESET_CONDITION': condition,
                        'RESET_EDGE': edge }
            text = REG[TYPE_TO_ID[bit_field.field_type].lower()] % name_map
        except KeyError:
            text = ""

        if USE_HIGHLIGHT:
            buff = CodeBuffer(lang=SyntaxLoader("verilog"))
            self.__verilog_obj.set_buffer(buff)
        else:
            self.__verilog_obj.modify_font(pango_font)
            buff = self.__verilog_obj.get_buffer()

        buff.set_text(text)
        self.__builder.connect_signals(self)
        self.__top_window.show_all()

    def __initialize_from_data(self, bit_field):
        """
        Initializes the dialog's data fields from the object
        """
        self.__register_obj.set_text("<b>%s</b>" %
                                     self.__register.register_name)
        self.__register_obj.set_use_markup(True)

        start = self.__bit_field.start_position
        stop = self.__bit_field.stop_position
        if start == stop:
            name = bit_field.field_name
        else:
            name = "%s[%d:%d]" % (bit_field.field_name, stop, start)

        self.__name_obj.set_text(name)
        self.__type_obj.set_text(TYPE_TO_DESCR[bit_field.field_type])

        if bit_field.reset_type == BitField.RESET_NUMERIC:
            self.__reset_obj.set_text("%x" % bit_field.reset_value)
        else:
            self.__reset_obj.set_text(bit_field.reset_parameter)

        (input_enb, control_enb) = TYPE_TO_ENABLE[bit_field.field_type]
        if input_enb and not bit_field.input_signal:
            bit_field.input_signal = "%s_DATA_IN" % bit_field.field_name

        if control_enb and not bit_field.control_signal:
            bit_field.control_signal = "%s_LOAD" % bit_field.field_name

        self.__output_obj.set_text(bit_field.output_signal)
        self.__input_obj.set_text(bit_field.input_signal)

        self.__volatile_obj.set_active(bit_field.volatile)

        self.__static_obj.set_active(bit_field.output_is_static)
        self.__side_effect_obj.set_active(bit_field.output_has_side_effect)
        self.__text_buffer.set_text(bit_field.description)
        self.__output_enable_obj.set_active(bit_field.use_output_enable)
        self.__control_obj.set_text(self.__bit_field.control_signal)

    def on_help_clicked(self, obj):
        HelpWindow(self.__top_builder, "bitfield_value_help.rst")

    def on_property_help_clicked(self, obj):
        HelpWindow(self.__top_builder, "bitfield_signal_prop_help.rst")

    def on_signal_help_clicked(self, obj):
        HelpWindow(self.__top_builder, "bitfield_signal_help.rst")

    def on_output_changed(self, obj):
        self.__bit_field.output_signal = obj.get_text()
        self.__check_data()
        self.__modified()

    def on_input_changed(self, obj):
        self.__bit_field.input_signal = obj.get_text()
        self.__check_data()
        self.__modified()

    def on_volatile_changed(self, obj):
        self.__bit_field.volatile = obj.get_active()
        self.__modified()

    def on_static_toggled(self, obj):
        self.__bit_field.output_is_static = obj.get_active()
        self.__modified()

    def on_control_changed(self, obj):
        self.__bit_field.control_signal = obj.get_text()
        self.__check_data()
        self.__modified()

    def build_values_list(self):
        """
        Builds the columns associated with the list view
        """
        render = gtk.CellRendererText()
        render.set_property('editable', True)
        render.connect('edited', self.__change_val)
        column = gtk.TreeViewColumn('Value', render, text=0)
        column.set_min_width(50)
        self.__value_tree_obj.append_column(column)
        self.__col = column

        render = gtk.CellRendererText()
        render.set_property('editable', True)
        render.connect('edited', self.__change_text)
        column = gtk.TreeViewColumn('Token', render, text=1)
        column.set_min_width(100)
        self.__value_tree_obj.append_column(column)

        render = gtk.CellRendererText()
        render.set_property('editable', True)
        render.connect('edited', self.__change_description)
        column = gtk.TreeViewColumn('Description', render, text=2)
        self.__value_tree_obj.append_column(column)

    def on_add_clicked(self, obj):
        """
        Called with the add button is clicked. Search the existing values
        in the list, finding the next highest value to use as the default.
        """

        start = self.__bit_field.start_position
        stop = self.__bit_field.stop_position
        last = len(self.__list_model)
        max_values = 2 ** (stop - start + 1)

        if last >= max_values:
            ErrorMsg("Maximum number of values reached",
                     "The width of the field only allows for %d values" % last)
            return

        try:
            largest = max([int(val[0], 16) for val in self.__list_model
                           if val[0] != ""])
        except ValueError:
            largest = -1

        last -= 1
        if (last == -1 or self.__list_model[last][0] or
            self.__list_model[last][1] or self.__list_model[last][2]):
            if largest >= max_values:
                new_val = ""
            else:
                new_val = "%x" % (largest + 1,)
            node = self.__list_model.append(row=(new_val, '', ''))
            path = self.__list_model.get_path(node)
        else:
            path = (last, )

        self.__value_tree_obj.set_cursor(path, focus_column=self.__col,
                                         start_editing=True)
        self.__modified()

    def on_remove_clicked(self, obj):  # IGNORE:W0613 - obj is unused
        """
        Called with the remove button is clicked
        """
        self.__list_model.remove(self.__model_selection.get_selected()[1])
        self.__update_values()
        self.__modified()

    def __change_val(self, text, path, new_text):  # IGNORE:W0613
        """
        Called with the value has changed value field. Checks to make sure that
        value is a valid hex value, and within the correct range.
        """
        new_text = new_text.strip()

        start = self.__bit_field.start_position
        stop = self.__bit_field.stop_position
        maxval = (2 ** (stop - start + 1)) - 1

        try:
            if new_text == "" or int(new_text, 16) > maxval:
                return
        except ValueError:
            return

        node = self.__list_model.get_iter(path)
        self.__list_model.set_value(node, 0, new_text)
        self.__update_values()
        self.__modified()

    def on_side_effect_toggled(self, obj):
        self.__bit_field.output_has_side_effect = obj.get_active()
        self.__modified()

    def __update_values(self):
        new_list = []
        for row in self.__list_model:
            new_list.append((row[0], row[1], row[2]))
        self.__bit_field.values = new_list

    def __change_text(self, text, path, new_text):
        """
        Updates the data model when the text value is changed in the model.
        """
        if new_text in self.__used_tokens:
            ErrorMsg("Duplicate token",
                     'The token "%s" has already been used' % new_text)
        else:
            node = self.__list_model.get_iter(path)
            old_text = self.__list_model.get_value(node, 1)
            self.__list_model.set_value(node, 1, new_text)

            if old_text and old_text in self.__used_tokens:
                self.__used_tokens.remove(old_text)
            if new_text:
                self.__used_tokens.add(new_text)
            self.__update_values()
            self.__modified()

    def __change_description(self, text, path, new_text):
        """
        Updates the data model when the text value is changed in the model.
        """
        node = self.__list_model.get_iter(path)
        try:
            new_text.decode("ascii")
        except:
            ErrorMsg("Invalid ASCII characters detected",
                     "Look for strange punctuations, like dashs and "
                     "quotes that look valid, but are not actual "
                     "ascii characters.")
        self.__list_model.set_value(node, 2, new_text)
        self.__update_values()
        self.__modified()

    def on_output_enable_toggled(self, obj):
        """
        Enables the output field based on the output enable field
        """
        active = self.__output_enable_obj.get_active()
        self.__bit_field.use_output_enable = active
        self.__output_obj.set_sensitive(obj.get_active())
        self.__check_data()
        self.__modified()

    def on_descr_key_press_event(self, obj, event):
        """
        Called on a double click event. If we detect a double click with
        the first button, we call the edit_register method.
        """
        if event.keyval == gtk.keysyms.F10:
            bounds = self.__text_buffer.get_selection_bounds()
            if bounds:
                old_text = self.__text_buffer.get_text(bounds[0], bounds[1])
                new_text = " ".join(old_text.replace("\n", " ").split())
                self.__text_buffer.delete(bounds[0], bounds[1])
                self.__text_buffer.insert(bounds[0], new_text)
                self.__modified()
            return True
        return False

    def on_destroy_event(self, obj):
        self.__spell.detach()

    def on_delete_event(self, obj, event):
        self.__spell.detach()

    def on_close_clicked(self, obj):
        """
        Saves the data from the interface to the internal BitField structure
        """
        self.__top_window.destroy()

    def __description_changed(self, obj):
        self.__bit_field.description = self.__text_buffer.get_text(
            self.__text_buffer.get_start_iter(),
            self.__text_buffer.get_end_iter(), False)
        self.__modified()

    def __check_data(self):
        """
        Checks the input signal validity
        """
        input_error = False
        output_error = False
        control_error = False

        if control_error is False:
            clear_error(self.__control_obj)
        if input_error is False:
            clear_error(self.__input_obj)
        if output_error is False:
            clear_error(self.__output_obj)