<html><head> <title>YosysJS Example Application #01</title> <script type="text/javascript" src="yosysjs.js"></script> </head><body onload="document.getElementById('command').focus()"> <h1>YosysJS Example Application #01</h1> <table width="100%"><tr><td><div id="tabs"></div></td><td align="right"><tt>[ <span onclick="load_example()">load example</span> ]</tt></td></tr></table> <svg id="svg" style="display: none; position: absolute; padding: 10px; width: calc(100% - 40px); height: 480px;"></svg> <div><textarea id="output" style="width: 100%; height: 500px"></textarea></div> <div id="wait" style="display: block"><br/><b><span id="waitmsg">Loading...</span></b></div> <div id="input" style="display: none"><form onsubmit="window.setTimeout(run_command); return false"><br/><tt><span id="prompt"> </span></tt><input id="command" type="text" onkeydown="history(event)" style="font-family: monospace; font-weight: bold;" size="100"></form></div> <script type='text/javascript'> function print_output(text) { var el = document.getElementById('output'); el.value += text + "\n"; } YosysJS.load_viz(); var ys = YosysJS.create("", function() { print_output(ys.print_buffer); document.getElementById('wait').style.display = 'none'; document.getElementById('input').style.display = 'block'; document.getElementById('waitmsg').textContent = 'Waiting for yosys.js...'; document.getElementById('prompt').textContent = ys.prompt(); update_tabs(); }); ys.echo = true; var history_log = []; var history_index = 0; var history_bak = ""; function history(ev) { if (ev.keyCode == 38) { el = document.getElementById('command'); if (history_index == history_log.length) history_bak = el.value if (history_index > 0) el.value = history_log[--history_index]; } if (ev.keyCode == 40) { if (history_index < history_log.length) { el = document.getElementById('command'); if (++history_index < history_log.length) el.value = history_log[history_index]; else el.value = history_bak; } } } var current_file = ""; var console_messages = ""; var svg_cache = { }; function update_tabs() { var f, html = "", flist = ys.read_dir('.'); if (current_file == "") { html += '<tt>[ <b>Console</b>'; } else { html += '<tt>[ <span onclick="open_file(\'\')">Console</span>'; } for (i in flist) { f = flist[i] if (f == "." || f == "..") continue; if (current_file == f) { html += ' | <b>' + f + '</b>'; } else { html += ' | <span onclick="open_file(\'' + f + '\')">' + f + '</span>'; } } html += ' | <span onclick="open_file(prompt(\'Filename:\'))">new file</span> ]</tt>'; document.getElementById('tabs').innerHTML = html; if (current_file == "" || /\.dot$/.test(current_file)) { var element = document.getElementById('output'); element.readOnly = true; element.scrollTop = element.scrollHeight; // focus on bottom document.getElementById('command').focus(); } else { document.getElementById('output').readOnly = false; document.getElementById('output').focus(); } } function open_file(filename) { if (current_file == "") console_messages = document.getElementById('output').value; else if (!/\.dot$/.test(current_file)) ys.write_file(current_file, document.getElementById('output').value); if (filename == "") { document.getElementById('output').value = console_messages; } else { try { document.getElementById('output').value = ys.read_file(filename); } catch (e) { document.getElementById('output').value = ""; ys.write_file(filename, document.getElementById('output').value); } } if (/\.dot$/.test(filename)) { dot = document.getElementById('output').value; YosysJS.dot_into_svg(dot, 'svg'); document.getElementById('svg').style.display = 'block'; document.getElementById('output').value = ''; } else { document.getElementById('svg').innerHTML = ''; document.getElementById('svg').style.display = 'none'; } current_file = filename; update_tabs() } function startup() { } function load_example() { open_file('') var txt = ""; txt += "// a simple yosys.js example. run \"script example.ys\".\n"; txt += "\n"; txt += "module example(input clk, input rst, input inc, output reg [3:0] cnt);\n"; txt += " always @(posedge clk) begin\n"; txt += " if (rst)\n"; txt += " cnt <= 0;\n"; txt += " else if (inc)\n"; txt += " cnt <= cnt + 1;\n"; txt += " end\n"; txt += "endmodule\n"; txt += "\n"; ys.write_file('example.v', txt); var txt = ""; txt += "# a simple yosys.js example. run \"script example.ys\".\n"; txt += "\n"; txt += "design -reset\n"; txt += "read_verilog example.v\n"; txt += "proc\n"; txt += "opt\n"; txt += "show\n"; txt += "\n"; ys.write_file('example.ys', txt); open_file('example.ys') document.getElementById('command').focus(); } function run_command() { var cmd = document.getElementById('command').value; document.getElementById('command').value = ''; if (history_log.length == 0 || history_log[history_log.length-1] != cmd) history_log.push(cmd); history_index = history_log.length; var show_dot_before = ""; try { show_dot_before = ys.read_file('show.dot'); } catch (e) { } open_file(''); document.getElementById('wait').style.display = 'block'; document.getElementById('input').style.display = 'none'; function run_command_bh() { try { ys.run(cmd); } catch (e) { ys.write('Caught JavaScript exception. (see JavaScript console for details.)'); console.log(e); } print_output(ys.print_buffer); document.getElementById('wait').style.display = 'none'; document.getElementById('input').style.display = 'block'; document.getElementById('prompt').textContent = ys.prompt(); var show_dot_after = ""; try { show_dot_after = ys.read_file('show.dot'); } catch (e) { } if (show_dot_before != show_dot_after) open_file('show.dot'); update_tabs(); } window.setTimeout(run_command_bh, 50); return false; } </script> </body></html>