More emcc stuff
authorClifford Wolf <clifford@clifford.at>
Sun, 15 Feb 2015 16:14:09 +0000 (17:14 +0100)
committerClifford Wolf <clifford@clifford.at>
Sun, 15 Feb 2015 16:15:29 +0000 (17:15 +0100)
Makefile
kernel/yosys.cc
misc/yosys.html

index 775fce1aded3f835b8025d26fe368c4883ce76fb..c762bd38cd1a7e3935dfe11b7c996120ccbdaf58 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -95,10 +95,11 @@ CXXFLAGS += -std=gnu++0x -Os
 
 else ifeq ($(CONFIG),emcc)
 CXX = emcc
-CXXFLAGS := -std=c++11 $(filter-out -fPIC,$(filter-out -ggdb,$(CXXFLAGS)))
+CXXFLAGS := -std=c++11 $(filter-out -fPIC -ggdb,$(CXXFLAGS))
 EMCCFLAGS := -Os -Wno-warn-absolute-paths
 EMCCFLAGS += --memory-init-file 0 -s NO_EXIT_RUNTIME=1
 EMCCFLAGS += -s EXPORTED_FUNCTIONS="['_main','_run','_prompt']"
+EMCCFLAGS += --embed-file share
 # https://github.com/kripken/emscripten/blob/master/src/settings.js
 # EMCCFLAGS += -s ALLOW_MEMORY_GROWTH=1
 # EMCCFLAGS += -s DISABLE_EXCEPTION_CATCHING=0
@@ -111,7 +112,9 @@ LDFLAGS += $(EMCCFLAGS)
 LDLIBS =
 EXE = .js
 
+TARGETS := $(filter-out yosys-config,$(TARGETS))
 EXTRA_TARGETS += yosys.html
+
 yosys.html: misc/yosys.html
        $(P) cp misc/yosys.html yosys.html
 
index 530d787966e31fef3a939c80a5f1715ec3effe9e..b54836621f02b34b27d0685f99e775cfe6922574 100644 (file)
@@ -619,26 +619,33 @@ std::string proc_self_dirname()
        #error Dont know how to determine process executable base path!
 #endif
 
+#ifdef EMSCRIPTEN
+std::string proc_share_dirname()
+{
+       return "/share";
+}
+#else
 std::string proc_share_dirname()
 {
        std::string proc_self_path = proc_self_dirname();
-#ifdef _WIN32
+#  ifdef _WIN32
        std::string proc_share_path = proc_self_path + "share\\";
        if (check_file_exists(proc_share_path, true))
                return proc_share_path;
        proc_share_path = proc_self_path + "..\\share\\";
        if (check_file_exists(proc_share_path, true))
                return proc_share_path;
-#else
+#  else
        std::string proc_share_path = proc_self_path + "share/";
        if (check_file_exists(proc_share_path, true))
                return proc_share_path;
        proc_share_path = proc_self_path + "../share/yosys/";
        if (check_file_exists(proc_share_path, true))
                return proc_share_path;
-#endif
+#  endif
        log_error("proc_share_dirname: unable to determine share/ directory!\n");
 }
+#endif
 
 bool fgetline(FILE *f, std::string &buffer)
 {
index 929d0dd3b25894b1062bac553a47a4a61036113f..29d89e6fe73e9b9cf62e423d064290a25d40b507 100644 (file)
@@ -4,18 +4,18 @@
        <h1>yosys.js example application</h1>
        <div><textarea id="output" style="width: 100%" rows="30" cols="100"></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="return run_command()"><tt><span id="prompt"><br/>yosys&gt; </span></tt><input id="command" type="text" size="100"></form></div>
+       <div id="input" style="display: none"><form onsubmit="window.setTimeout(run_command); return false"><tt><span id="prompt">
+                       </span></tt><input id="command" type="text" style="font-family: monospace; font-weight: bold;" size="100"></form></div>
        <script type='text/javascript'>
                var got_log_messages = false;
+
                var Module = {
                        print: (function() {
                                var element = document.getElementById('output');
                                if (element) element.value = ''; // clear browser cache
                                return function(text) {
                                        if (!got_log_messages) {
-                                               document.getElementById('wait').style.display = 'none';
-                                               document.getElementById('input').style.display = 'block';
-                                               document.getElementById('waitmsg').innerText = 'Waiting for yosys.js...';
+                                               window.setTimeout(startup, 50);
                                                got_log_messages = true;
                                        }
                                        if (element && typeof(text) != "number") {
                                        }
                                };
                        })(),
-                       command: (function(cmd) {
-                               Module.ccall('run', '', ['string'], [cmd])
-                       }),
-                       prompt: (function(cmd) {
-                               return Module.ccall('prompt', 'string', [], [])
-                       })
                };
+
+               function startup() {
+                       document.getElementById('wait').style.display = 'none';
+                       document.getElementById('input').style.display = 'block';
+                       document.getElementById('waitmsg').innerText = 'Waiting for yosys.js...';
+                       document.getElementById('prompt').innerText = yosys_prompt();
+                       document.getElementById('command').focus();
+                       console.log('yosys.js loaded.');
+               }
+
+               function yosys_command(cmd) {
+                       Module.ccall('run', '', ['string'], [cmd])
+               }
+
+               function yosys_prompt() {
+                       return Module.ccall('prompt', 'string', [], [])
+               }
+
                function run_command() {
                        var cmd = document.getElementById('command').value;
                        document.getElementById('command').value = '';
-                       Module.print(Module.prompt() + cmd);
+                       Module.print(yosys_prompt() + cmd);
                        document.getElementById('wait').style.display = 'block';
                        document.getElementById('input').style.display = 'none';
 
                        function run_command_bh() {
                                try {
-                                       Module.command(cmd);
+                                       yosys_command(cmd);
                                } catch (e) {
                                        Module.print('Caught JavaScript exception. (see JavaScript console for details.)');
                                        console.log(e);
                                }
                                document.getElementById('wait').style.display = 'none';
                                document.getElementById('input').style.display = 'block';
-                               document.getElementById('prompt').innerText = Module.prompt();
+                               document.getElementById('prompt').innerText = yosys_prompt();
                                document.getElementById('command').focus();
                        }