def __init__(self, repo, current, base, project, project_path, caches=None, diffs=join(".", "proj_mes_diffs")): """ :param caches: Path to directory with existing QVCs. Use it iff QVC building algorithm testing is not required. """ super(QDTMeasurer, self).__init__(repo, current, base) self.qdtgit = repo self.clone_prefix = "qdt" qvd = qvd_get(project.build_path, version=project.target_version) self.qproject = project self.qemugit = qemugit = Repo(qvd.src_path) self.qp_path = project_path self.caches = caches # generated code will be saved as a patch diffs = join(abspath(diffs), datetime.now().strftime("%Y%m%d-%H%M%S")) if not isdir(diffs): makedirs(diffs) self.diffs = diffs target_commit = git_find_commit(qemugit, project.target_version) self.qvc_pattern = ("qvc*_%s.py" % target_commit.hexsha)
def rebuild_cache(self): try: qvd = qvd_get(self.proj.build_path, version=self.proj.target_version) except BadBuildPath as e: showerror( title=_("Cache rebuilding is impossible").get(), message=(_("Selected Qemu build path is bad. Reason: %s") % (e.message)).get()) return # if 'reload_build_path_task' is not failed if hasattr(self.pw, 'reload_build_path_task'): # reload_build_path_task always run at program start that is why # it's in process when it's not in finished_tasks and not failed if self.pw.reload_build_path_task not in self.pw.tm.finished_tasks: ans = askyesno(self, title=_("Cache rebuilding"), message=_("Cache building is already \ in process. Do you want to start cache rebuilding?")) if not ans: return qvd.remove_cache() self.pw.reload_build_path()
def __init__(self, root, *args, **kw): GUIDialog.__init__(self, master=root, *args, **kw) self.qom_type_var = root.qom_type_var self.title(_("Device Tree")) self.grid() self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.columnconfigure(2, minsize=200) self.attributes("-topmost", 1) geom = "+" + str(int(root.winfo_rootx())) \ + "+" + str(int(root.winfo_rooty())) self.geometry(geom) self.focus() self.device_tree = VarTreeview(self) self.device_tree["columns"] = ("Macros") self.device_tree.heading("#0", text=_("Devices")) self.device_tree.heading("Macros", text=_("Macros")) self.device_tree.bind("<ButtonPress-1>", self.on_b1_press_dt) self.device_tree.grid(row=0, column=0, sticky="NEWS") #Add Scrollbar ysb = Scrollbar(self, orient="vertical", command=self.device_tree.yview) xsb = Scrollbar(self, orient="horizontal", command=self.device_tree.xview) self.device_tree['yscroll'] = ysb.set self.device_tree['xscroll'] = xsb.set ysb.grid(row=0, column=1, sticky="NS") xsb.grid(row=1, column=0, sticky="EW") self.add_button = VarButton(self, text=_("Select"), command=self.on_select_qom_type) self.add_button.grid(row=1, column=2, sticky="WE") self.add_button.config(state="disabled") self.fr = VarLabelFrame(self, text=_("Select QOM type")) self.fr.grid(row=0, column=2, sticky="SEWN") # Check exception before __init__ call. bp = root.mach.project.build_path qvd = qvd_get(bp, version=root.mach.project.target_version) # the QOM type of roots[0] is "device" roots = qvd.qvc.device_tree[0]["children"] self.qom_create_tree("", roots)
def main(self): try: yield self.reload_build_path_task except: self.prev_qvd = None # for `__finalize` raise RuntimeError("Cannot continue without a cache") cur_qvd = qvd_get(self.p.build_path, version=self.p.target_version) self.prev_qvd = cur_qvd.use() yield self.p.co_gen_all(self.s, known_targets=cur_qvd.qvc.known_targets)
def on_sel_tgt_qemu_version(self): try: qvd = qvd_get(self.proj.build_path) except: repo = None else: repo = qvd.repo new_target = GitVerSelDialog(self, repo).wait() if new_target is None: return self.pht.set_target(new_target)
def on_qvc_dirtied(self): # QOM tree is not actual now del self.p.qom_tree pht = self.pht if pht is not None: pht.all_pci_ids_2_values() try: qvd = qvd_get(self.p.build_path) except BadBuildPath: pass else: if qvd.qvc is not None: qvd.forget_cache() self.reload_build_path()
def on_qvc_available(self): pht = self.pht if pht is not None: pht.all_pci_ids_2_objects() # convert device tree to more convenient form qvc = qvd_get(self.p.build_path).qvc qt = self.p.qom_tree = from_legacy_dict(qvc.device_tree) # Note that system bus device have no standard name for input IRQ. next(qt.find(name="sys-bus-device")).out_gpio_names = [ "SYSBUS_DEVICE_GPIO_IRQ" ] # extend QOM tree with types from project for d in self.p.descriptions: self.__add_qtype_for_description(d)
def on_generate(self): try: t = self._project_generation_task except AttributeError: pass else: if not t.finished: showerror(title=_("Generation is cancelled").get(), message=_("At least one generation task is already \ in process.").get()) return if not self.proj.build_path: showerror( title=_("Generation is impossible").get(), message=_("No Qemu build path is set for the project.").get()) return try: qvd = qvd_get(self.proj.build_path, version=self.proj.target_version) except BadBuildPath as e: showerror( title=_("Generation is impossible").get(), message=(_("Selected Qemu build path is bad. Reason: %s") % (e.message)).get()) return if not hasattr(self.pw, "reload_build_path_task"): showerror(title=_("Generation is impossible").get(), message=_("Qemu version cache loading failed.").get()) return if not qvd.qvc_is_ready and not self.var_schedule_generation.get(): showerror(title=_("Generation is cancelled").get(), message=_("Qemu version cache is not ready yet. Try \ later.").get()) return self._project_generation_task = ProjectGeneration( self.proj, qvd.src_path, self.sig_qvc_dirtied, self.pw.reload_build_path_task, self.var_gen_chunk_graphs.get()) self.task_manager.enqueue(self._project_generation_task)
def on_generate(self): try: t = self._project_generation_task except AttributeError: pass else: if not t.finished: showerror(title=_("Generation is cancelled").get(), message=_("At least one generation task is already \ in process.").get()) return if not self.proj.build_path: showerror( title=_("Generation is impossible").get(), message=_("No Qemu build path is set for the project.").get()) return try: qvd = qvd_get(self.proj.build_path) except BadBuildPath as e: showerror( title=_("Generation is impossible").get(), message=(_("Selected Qemu build path is bad. Reason: %s") % (e.message)).get()) return if not qvd.qvc_is_ready: showerror(title=_("Generation is cancelled").get(), message=_("Qemu version cache is not ready yet. Try \ later.").get()) return self._project_generation_task = ProjectGeneration( self.proj, qvd.src_path, self.sig_qvc_dirtied) self.task_manager.enqueue(self._project_generation_task)
def __init__(self, project_widget): self.pw = project_widget self.qvd = qvd_get(project_widget.p.build_path) CoTask.__init__(self, generator=self.begin())
def __init__(self, device, *args, **kw): SettingsWidget.__init__(self, device, *args, **kw) self.dev = device common_fr = GUIFrame(self) common_fr.pack(fill = BOTH, expand = False) common_fr.columnconfigure(0, weight = 0) common_fr.columnconfigure(1, weight = 1) common_fr.rowconfigure(0, weight = 0) l = VarLabel(common_fr, text = _("QOM type")) v = self.qom_type_var = StringVar() e = HKEntry(common_fr, textvariable = v) v.trace_variable("w", self.__on_qom_type_var_changed) l.grid(row = 0, column = 0, sticky = "W") e.grid(row = 0, column = 1, sticky = "EW") b = VarButton(common_fr, text = _("Select"), command = self.on_press_select_qom_type ) b.grid(row = 0, column = 2, sticky = "EW") # Check for device tree bp = self.mach.project.build_path if bp is None: b["state"] = "disabled" else: qvd = qvd_get(bp, version = self.mach.project.target_version) if qvd.qvc is None or qvd.qvc.device_tree is None: # TODO: watch "qvc_available" signal b["state"] = "disabled" # parent bus editing widgets l = VarLabel(common_fr, text = _("Parent bus")) self.bus_var = StringVar() self.bus_var.trace_variable("w", self.on_parent_bus_var_changed) self.bus_cb = Combobox( common_fr, textvariable = self.bus_var, state = "readonly" ) l.grid(row = 1, column = 0, sticky = "W") self.bus_cb.grid(row = 1, column = 1, sticky = "EW") common_fr.rowconfigure(1, weight = 0) self.buses_lf = lf = VarLabelFrame( common_fr, text = _("Child buses") ) lf.grid(row = 2, column = 0, columns = 3, sticky = "NEWS") self.rowconfigure(2, weight = 1) lf.columnconfigure(0, weight = 1) self.child_buses_rows = [] # pack properties inside a frame with scrolling outer_frame = VarLabelFrame(self, text = _("Properties")) outer_frame.pack(fill = BOTH, expand = True) self.props_lf = add_scrollbars(outer_frame, GUIFrame) self.props_lf.columnconfigure(0, weight = 1) self.props_lf.columnconfigure(1, weight = 0) self.props_lf.columnconfigure(2, weight = 1) self.props_lf.columnconfigure(3, weight = 0) self.prop2field = {} self.bt_add_prop = VarButton( self.props_lf, text = _("Add"), command = self.on_prop_add ) self.bt_add_prop.grid( column = 3, sticky = "NEWS" )
def __init__(self, root, *args, **kw): GUIDialog.__init__(self, master=root, *args, **kw) self.qom_type_var = root.qom_type_var self.title(_("Device Tree")) self.grid() self.columnconfigure(0, weight=1, minsize=300) self.columnconfigure(2, weight=1, minsize=100) self.rowconfigure(0, weight=1) geom = "+" + str(int(root.winfo_rootx())) \ + "+" + str(int(root.winfo_rooty())) self.geometry(geom) self.focus() self.device_tree = dt = VarTreeview(self, selectmode="browse") dt["columns"] = "Macros" dt.heading("#0", text=_("Devices")) dt.heading("Macros", text=_("Macros")) dt.bind("<ButtonPress-1>", self.on_b1_press_dt) dt.grid(row=0, column=0, sticky="NEWS") add_scrollbars_native(self, dt) column_fr = Frame(self, borderwidth=0) column_fr.grid(row=0, column=2, rowspan=2, sticky="SEWN") column_fr.columnconfigure(0, weight=1) column_fr.rowconfigure(0, weight=1) column_fr.rowconfigure(1, weight=1, minsize=100) fr_at = VarLabelFrame(column_fr, text=_("Architecture filter")) fr_at.grid(row=0, column=0, sticky="SEWN") self.fr_qt = VarLabelFrame(column_fr, text=_("Select QOM type")) self.fr_qt.grid(row=1, column=0, sticky="SEWN") self.add_button = VarButton(column_fr, text=_("Select"), command=self.on_select_qom_type) self.add_button.grid(row=2, column=0, sticky="EW") self.add_button.config(state="disabled") qtype_dt = self.qtype_dt = qvd_get( root.mach.project.build_path, version=root.mach.project.target_version).qvc.device_tree arch_buttons = Frame(fr_at, borderwidth=0) arch_buttons.pack(fill="x") arch_buttons.columnconfigure(0, weight=1, minsize=60) arch_buttons.columnconfigure(1, weight=1, minsize=60) arch_buttons.columnconfigure(2, weight=1, minsize=60) bt_all_arches = VarButton(arch_buttons, text=_("All"), command=self.select_arches) bt_all_arches.grid(row=0, column=0, sticky="EW") bt_none_arches = VarButton(arch_buttons, text=_("None"), command=self.deselect_arches) bt_none_arches.grid(row=0, column=1, sticky="EW") bt_invert_arches = VarButton(arch_buttons, text=_("Invert"), command=self.invert_arches) bt_invert_arches.grid(row=0, column=2, sticky="EW") if not qtype_dt.arches: bt_all_arches.config(state="disabled") bt_none_arches.config(state="disabled") bt_invert_arches.config(state="disabled") arch_selector_outer = Frame(fr_at, borderwidth=0) arch_selector_outer.pack(fill="both", anchor="w") arch_selector, scrolltag = add_scrollbars_with_tags( arch_selector_outer, GUIFrame) ac = self.arches_checkbox = [] for a in sorted(list(qtype_dt.arches)): v = IntVar() c = Checkbutton(arch_selector, text = a, variable = v, command = lambda arch = a, var = v: \ self.on_toggle_arch(arch, var) ) c.pack(expand=1, anchor="w") c.bindtags((scrolltag, ) + c.bindtags()) c.select() ac.append(c) # key: item # value: ItemDesc self.detached_items = {} self.all_items = {} self.disabled_arches = set() self.qom_create_tree("", qtype_dt.children)
def main(self): proj = self.pw.p self.qvd = qvd_get(proj.build_path, version=proj.target_version) if self.qvd.qvc is None: yield self.qvd.co_init_cache() self.pw.qvd = self.qvd
def begin(self): self.prev_qvd = qvd_get(self.p.build_path).use() yield self.p.co_gen_all(self.s)