aboutsummaryrefslogtreecommitdiffstats
path: root/libmproxy/console/tabs.py
blob: 2c46e59e181a4cc01c854527b92856af7882fd44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import urwid

class Tabs(urwid.WidgetWrap):
    def __init__(self, tabs, tab_offset=0):
        urwid.WidgetWrap.__init__(self, "")
        self.tab_offset = tab_offset
        self.tabs = tabs
        self.show()

    def _tab(self, content, attr):
        p = urwid.Text(content, align="center")
        p = urwid.Padding(p, align="center", width=("relative", 100))
        p = urwid.AttrWrap(p, attr)
        return p

    def keypress(self, size, key):
        if key in ["tab", "l"]:
            self.tab_offset = (self.tab_offset + 1)%(len(self.tabs))
            self.show()
        elif key == "h":
            self.tab_offset = (self.tab_offset - 1)%(len(self.tabs))
            self.show()
        return self._w.keypress(size, key)

    def show(self):
        headers = []
        for i in range(len(self.tabs)):
            txt = self.tabs[i][0]()
            if i == self.tab_offset:
                headers.append(self._tab(txt, "heading"))
            else:
                headers.append(self._tab(txt, "heading_inactive"))
        headers = urwid.Columns(headers, dividechars=1)
        self._w = urwid.Frame(
            body = self.tabs[self.tab_offset][1](),
            header = headers
        )
        self._w.set_focus("body")
s="se">\\INIT_FILE").decode_string(); cell->unsetParam("\\INIT_FILE"); if (init_file == "") continue; /* Open file */ log("Processing %s : %s\n", RTLIL::id2cstr(cell->name), init_file.c_str()); std::ifstream f; f.open(init_file.c_str()); if (f.fail()) { log("Can not open file `%s`.\n", init_file.c_str()); continue; } /* Defaults to 0 */ memset(mem, 0x00, sizeof(mem)); /* Process each line */ bool in_comment = false; int cursor = 0; while (!f.eof()) { std::string line, token; std::getline(f, line); for (int i = 0; i < GetSize(line); i++) { if (in_comment && line.compare(i, 2, "*/") == 0) { line[i] = ' '; line[i+1] = ' '; in_comment = false; continue; } if (!in_comment && line.compare(i, 2, "/*") == 0) in_comment = true; if (in_comment) line[i] = ' '; } while (1) { bool set_cursor = false; long value; token = next_token(line, " \t\r\n"); if (token.empty() || token.compare(0, 2, "//") == 0) break; if (token[0] == '@') { token = token.substr(1); set_cursor = true; } const char *nptr = token.c_str(); char *endptr; value = strtol(nptr, &endptr, 16); if (!*nptr || *endptr) { log("Can not parse %s `%s` for %s.\n", set_cursor ? "address" : "value", nptr, token.c_str() ); continue; } if (set_cursor) cursor = value; else if (cursor >= 0 && cursor < 256) mem[cursor++] = value; else log("Attempt to initialize non existent address %d\n", cursor); } } /* Set attributes */ const char *hex = "0123456789ABCDEF"; for (int i=0; i<16; i++) { std::string val = ""; for (int j=15; j>=0; j--) val += std::bitset<16>(mem[i*16+j]).to_string(); cell->setParam("\\INIT_" + std::string(1, hex[i]), RTLIL::Const::from_string(val)); } } } struct Ice40BRAMInitPass : public Pass { Ice40BRAMInitPass() : Pass("ice40_braminit", "iCE40: perform SB_RAM40_4K initialization from file") { } void help() YS_OVERRIDE { // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| log("\n"); log(" ice40_braminit\n"); log("\n"); log("This command processes all SB_RAM40_4K blocks with a non-empty INIT_FILE\n"); log("parameter and converts it into the required INIT_x attributes\n"); log("\n"); } void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE { log_header(design, "Executing ICE40_BRAMINIT pass.\n"); size_t argidx; for (argidx = 1; argidx < args.size(); argidx++) { // if (args[argidx] == "-???") { // continue; // } break; } extra_args(args, argidx, design); for (auto module : design->selected_modules()) run_ice40_braminit(module); } } Ice40BRAMInitPass; PRIVATE_NAMESPACE_END