Code Monkey home page Code Monkey logo

lowrisc / opentitan Goto Github PK

View Code? Open in Web Editor NEW
2.4K 108.0 720.0 138.94 MB

OpenTitan: Open source silicon root of trust

Home Page: https://www.opentitan.org

License: Apache License 2.0

Makefile 0.06% C 20.95% SystemVerilog 42.83% Shell 0.45% C++ 5.44% Tcl 1.31% Stata 0.01% Python 8.12% HTML 0.36% Assembly 2.52% Dockerfile 0.02% CSS 0.13% Smarty 3.59% Emacs Lisp 2.92% Rust 6.99% SCSS 0.07% Verilog 0.03% Starlark 4.05% JavaScript 0.09% Handlebars 0.05%

opentitan's Introduction

OpenTitan

OpenTitan logo

About the project

OpenTitan is an open source silicon Root of Trust (RoT) project. OpenTitan will make the silicon RoT design and implementation more transparent, trustworthy, and secure for enterprises, platform providers, and chip manufacturers. OpenTitan is administered by lowRISC CIC as a collaborative project to produce high quality, open IP for instantiation as a full-featured product. See the OpenTitan site and OpenTitan docs for more information about the project.

About this repository

This repository contains hardware, software and utilities written as part of the OpenTitan project. It is structured as monolithic repository, or "monorepo", where all components live in one repository. It exists to enable collaboration across partners participating in the OpenTitan project.

Documentation

The project contains comprehensive documentation of all IPs and tools. You can access it online at docs.opentitan.org.

How to contribute

Have a look at CONTRIBUTING and our documentation on project organization and processes for guidelines on how to contribute code to this repository.

Licensing

Unless otherwise noted, everything in this repository is covered by the Apache License, Version 2.0 (see LICENSE for full text).

opentitan's People

Contributors

a-will avatar alees24 avatar alphan avatar andreaskurth avatar cfrantz avatar cindychip avatar ctopal avatar dmcardle avatar engdoreis avatar gregac avatar hu90m avatar imphil avatar jadephilipoom avatar jdonjdon avatar jesultra avatar jwnrt avatar lenary avatar marnovandermaas avatar martin-lueker avatar matutem avatar mcy avatar milesdai avatar moidx avatar msfschaffner avatar mwbranstad avatar pamaury avatar rswarbrick avatar timothytrippel avatar vogelpi avatar weicaiyang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

opentitan's Issues

Refactor TL-UL Host adapter code into common code

We currently two pieces of code which convert a PULP-style bus host interface to TL-UL: One is in hw/ip/rv_dm/tlul_adapter_host.sv (used by the debug module), the other one is embedded in rv_core_ibex. We should combine this code and move it to hw/ip/tlul.

While doing so, we should double-check that we actually match the Protocol described here: https://ibex-core.readthedocs.io/en/latest/load_store_unit.html#protocol. (The address might change as long as no grant is received. This has led to confusion in the past.)

yapf: FInd config that works across different versions

Currently we have in our experimental CI setup (#246) the following failure:

find ./util -iname '*.py' -print0 | xargs -0 -n1 $PWD/util/lintpy.py -f
========================== Starting Command Output ===========================
[command]/bin/bash --noprofile --norc /home/vsts/work/_temp/315cc780-ed8b-4927-be16-919a17390cd3.sh
Lint failed:
yapf -d ./util/docgen/stwg_renderer.py
	--- ./util/docgen/stwg_renderer.py	(original)
	+++ ./util/docgen/stwg_renderer.py	(reformatted)
	@@ -178,8 +178,8 @@
	     formatter.noclasses = True
	 
	     def __init__(self, *extras, style='default', srcfile='', wavejs=False):
	-        super().__init__(*chain((StwgEscape, RegRef,
	-                                 CodeFenceDirective), extras))
	+        super().__init__(
	+            *chain((StwgEscape, RegRef, CodeFenceDirective), extras))
	         self.formatter.style = get_style(style)
	         self.regs = None
	         self.wavejs = wavejs
##[error]Bash exited with code '123'.
##[section]Finishing: Run Python lint

I use the same version (0.26.0) of yapf locally but I don't see that failure when running it locally.
However, I'm running openSUSE Tumbleweed and not Ubuntu 16.04, and Python 3.7.2 instead of 3.5.1. But we should find a way to make yapf independent of those things and give consistent results.

[util/topgen] Top module generator

The goals of the task are:

  1. To define top configuration hjson format.
  2. To generate top-level connection RTL, which has following modules, crossbars, peripherals, processor block, alert handler, pinmux, and padring (having multiple PAD instances).
  3. To give editable template of the top module. Most of the top module is generated by the tool but it gives flexibility to include sub template files at the couple of the point. For instance, uart.header.svh file may be included in front of uart instantiation.

Document: https://docs.google.com/document/d/1LKzddc7UlF_avTnY1MZ0PFcrhzKkfvW1coZrREht72s/edit?usp=sharing

Azure Pipelines: Give contributors access to build log

Currently this repository and the Azure Pipelines builds are "private", which means failing PRs only show a single line of (rather useless) build output. Since Azure Pipelines doesn't support syncing the team permissions from GitHub we need to manually add users with write permissions to stwg-base also to Azure Pipelines.

For now, if you want to see the full CI build log, please drop me a mail with your Microsoft or Skype account name. I'll add you to the right group.

If we want to go fancy (and have time), we can explore a couple more options:

  • It seems the GitHub checks API and the Azure Pipelines integration is rather new and we could open an issue with the pipelines team to see if they can add more information to the build status through the GitHub Checks API.
  • We could have the CI job itself post the failing build status to the PR as comment.

Or we could just wait until we go public or choose another CI solution and the permission problems vanish.

[reg, rtl] create field and csr arrays in uvm reg module, rtl IOs in parameterized modules

TL; DR;
This affects parameterized modules that create variable number of csrs, fields and RTL IOs - example: rv_timer. Having arrayed implementations of IOs / CSRs / FIELDS will be a lot beneficial for DV.

Taking rv_timer as an example: It has 2 parameters - number of timers and number of harts per timer. At this point, the number of timers and harts is fixed to 1 each. In future, this may increase based on need.

The RTL creates individual IOs corresponding to each timer / hart.
Example: rv_timer output port - intr_timer_expired_0_0.
As the parameter values changes, more individual IOs will be created. It will be beneficial for DV to make this an array instead. Sure, we can create the array in our testbench and use that to do our checks, however the onus still is on the DV engineer to make the change in the testbench when more such IOs are added in RTL. Had the RTL output been an array instead, NO change will be required to be made in DV and all testing will automatically adjust to the new parameter values. Designer can simply change the parameter value and run DV regression suite to confirm no breakage and wouldn't need to involve DV at all.

This problem extends to the reg hjson as well. We have rv_timer template hjson which is converted to the actual hjson that meets the current parameter value requirements (num timers = 1, num harts = 1).

The generated hjson is problematic for our DV field abstraction, which looks like this:

    { multireg: {
        name: "CTRL",
        desc: "Control register",
        count: 1,
        cname: "TIMER",
        swaccess: "rw",
        hwaccess: "hro",
        fields: [
          { bits: "0", name: "active", desc: "If 1, timer operates" }
        ],
      }
    },

This ends up creating a fixed field abstraction called 'active0' in the ctrl register abstraction. This is problematic for DV since it is not scalable. When num timers parameter increases, this will result in additional fields 'active1', 'active2' and so on. This makes it hard to write a generic DV code to target a particular timer, since the field model objects are unique for each timer instance. We will end up having to write an if-else loop to check the timer value and then set that particular field (or do a string based field search within the register for all accesses, which ends up being compute intensive and may slow down the simulation):

function enable_timer(int timer);
  if (timer == 0)         ral.ctrl.active0.set(1'b1);
  else if (timer == 1)  ral.ctrl.active1.set(1'b1);
  ...

  OR
  uvm_reg_field fld = ral.ctrl.get_field_by_name($sformatf("active%0d", timer));
  fld.set(1'b1);
  ...
endfunction

The field 'active' should instead be a bit vector [NUM_TIMERS-1:0], which will make our code much simpler:

function enable_timer(int timer);
  wdata = ral.ctrl.active.get(); // get previous value written
  wdata |= 1 << timer;
  ral.ctrl.active.set(wdata);
  ...
endfunction

The generated hjson is also problematic for the following register abstraction, which looks like this:

    { skipto: "0x100" },
    { name: "CFG0",
      desc: "Configuration for Hart 0",
      swaccess: "rw",
      hwaccess: "hro",
      fields: [
        { bits: "11:0", name: "prescale", desc: "Prescaler to generate tick" },
        { bits: "23:16", name: "step", resval: "0x1", desc: "Incremental value for each tick" },
      ],
    },

This creates a fixed register called 'cfg0' for hart # 0. When the number of harts parameter is increased, this will create additional 'cfg1', cfg2' and so on registers. This is again problematic for DV since it is not scalable. We end up having to do a string based lookup similar to the field example above.

At this point, this is a tiny bench so compute-intensiveness is not an issue. However, it might be a problematic for chip top sims or other larger parameterized IPs we might end up adding in future. Also, the string based lookup to make the DV bench generic is not an elegant solution. It would be worthwhile to invest in a better solution to this problem - perhaps enhance the reg hjson semantics to support such parameterized implementations natively, such that it creates arrayed implementations of csr and field abstractions for DV.

Thanks
Sri

[ip/hmac] Wipe out secrets when hash/hmac done

When hmac is done, wipe out (XOR with random value (eventually from LSFR)) internal variables.

  1. SHA256: w[15:0][31:0], hash (not digest), stored message length (txcount), state
  2. HMAC: secret_key (? is it necessary?), received message length, txcount. state.

[top] discuss auto-generation build plan

We have a hodgepodge of build scripts, makefiles, fusesocs, templates, etc. More are coming with the generation of the top-level based upon hjson files. Targeting mid-late May, let's discuss how we want to plug all of these together, how to automate, when/if/what to check-in, etc. Goal is to have the flow ready for honing at our get-together in Zurich in June

[gpio] synchronizers needed?

At the moment there is no notion of synchronization on the GPIO input pins (nor in the spec). There is selectable debounce logic which has some sense of synchronization, but isn't quite the same. I can imagine SW might want as fast of sampling as possible in some cases, so perhaps we simply ensure that synchronization is achieved if debounce is enabled. But either way, we need to address this in the specification (and eventually in the design and test bench)

@eunchan @gaurangchitroda

Possible improvements for fusesoc Ascentlint support

Hi Philipp,

two possible improvements for fusesoc's Ascentlint support:

  • Would be nice if fusesoc could print out the path to the ascentlint.rpt file, e.g. build/lowrisc_ip_gpio_0.1/lint-ascentlint/ascentlint.rpt.
  • Improve fusesoc so we can just type "fusesoc lint lowrisc:ip:gpio" or simply "fusesoc lint gpio" to run lint on GPIO.

[rv_timer]: issues found by running CSR test suite

1: intr_state0 timer status is set right out of reset

In timer_core, the intr_state0 is set right out of reset without any timer configuration. In the timer reg hjson file, intr_state0 reset value is indicated as 0 - but the rtl is reading back 1, causing the test to fail.

On further inspection, looks like timer_core generates interrupt signal when mtime >= mtimecomp, both of which are 0 right out of reset. This results in intr_state0 to be set.

Is this an expected behavior? If yes, then please advise how to proceed - either exclude this register from reset value check, or fix the reg hjson to indicate the reset value of 1.

[usbdpi] Improvements to USB DPI interface

The usbdpi interface currently includes the test stimulus in the main-line code and is quite fragile as regards to timing.

Improvements:

  • Read stimulus from a file (will require the DPI state machine to understand higher level constructs like packets)

  • Build in initialization of USB device and make the simulation available as a usbip device. This allows the simulated USB device to be "plugged in" to a virtual USB port on the host.

[dv reggen] automate csr exclusions

  1. Add write / read exclude tags to csr fields in hjson.
  2. Extend uvm_reg_field and uvm_reg classes to add csr exclusion tag which will set during the automation.
  3. CSR sequences will read the tag to apply the appropriate exclusion.

[fusesoc] Compile DPI modules into shared libraries and link them afterwards

Currently we compile all DPI code together with the Verilator-generated C++ code. We need to extend fusesoc to first compile the DPI modules into shared libraries, and then pass those libraries to the Verilator makefile to link all components together into one simulation.

This allows us to actually compile C code with a C compiler, as opposed to a C++ compiler (that's what we do right now).

Check definition of uart status register

Verilator gives a warning:
%Warning-UNUSED: ../src/lowrisc_ip_uart_0.1/rtl/uart_core.sv:12: Bits of signal are not used: reg2hw[99:88]

This corresponds to the q and re bits for the status register. Should the register be declared hwo and not have hwre set? (I think at one point there were some read side-effects)

[gpio] Incorrect register mask values in specification

Hi Eunchan,

Register Mask values for following GPIO registers seem incorrect to me:
(1) gpio.INTR_STATE @ + 0x0
mask 0x1
(2) gpio.INTR_ENABLE @ + 0x4
mask 0x1
(3) gpio.INTR_TEST @ + 0x8
mask 0x1

For all 3 registers above, I think that mask value should be 0xffff_ffff as all 32-bits are defined.
I am not sure whether mask means represents "defined"/"unreserved" bits or "writable bits"?
Also, I see "Register enable =" in all registers. Are we missing some information here?

Best Regards,
Gaurang

Verilator compilation error (jtagdpi) on macOS

I am seeing below error(jtagdpi.c) on macOS with verilator.

      ssize_t num_written = send(ctx->cfd, &tdo_ascii, sizeof(tdo_ascii),
                                 MSG_NOSIGNAL);

It complains MSG_NOSIGNAL isn't defined. Does anyone see this?

[hw/tlul] Create generic module for re-order buffer to support out-of-order responses

as @NilsGraf mentioned in lowRISC/stwg-base#474 a_source should be unique. If a host wants to send multiple requests, it needs to handle out-of-order responses. It looks like {a|c}_source may consider NoC case but it introduces a little bit of complex in a simple interconnect like the one in OpenTitan.

It is planned to implement DMA module later, so we should prepare the general logic to handle out-of-order response.

Idea is: to have general re-order buffer under tlul. It is parameterized ( #ofOutstandings ). Internal interface should be similar to the tilelink but a_source can be ignored. The re-order buffer will take care of it (assigning new tag(source id) and releasing it).

@taoliug @sriyerg could you please check if current tlul_agent uses arbitrary a_source value for each request?

Reggen validate should have explicit boolean type

Currently reggen notes fields as strings and talks about them being true/false.

Need to add an input type for boolean. Anything being checked with check_bool should me made this type and the type table explain that the value should be true/false with any case.

[CI] Expose Vivado build logs as artifacts

When Vivado fails, the info on stdout is not useful. It would be good to expose the more detailed log files as artifacts for people to review. The fact this is probably reliant on having access to the Azure org makes it a bit inconvenient, but there may be other options (e.g. scp to bubble.servers.lowrisc.org/ci_artifacts/prNNN/).

From @imphil on zulip:

Philipp Wagner: yes, Vivado doesn't output synthesis results on stdout (it does output implementation results ...) You need to look into the *.runs/synth_1/runme.log file. This and other *.rpt files from the impl_1 and synth_1 directories should be available as artifacts, otherwise debugging is almost impossible

Philipp Wagner: This is what we do for optimsoc: https://github.com/optimsoc/optimsoc-autobuild/blob/master/.gitlab-ci.yml#L130-L133

[doc] Expand github_notes document to include info on how to do pull requests

Several things come up repeatedly and should be added to the docs:

  • You can update a pull request by force-pushing to it
  • You should use git rebase to clean up the history before things are merged
  • git commit --amend is often easier than git rebase
  • Commit message rules: 50 character summary, empty line, longer description (why this change?)

Move top_earlgray_usb to use auto generation

Need to auto generate the top_earlgray_usb (for now it is still in the old standalone model). Hope to have some time to do this next week. (I don't know how to cc you so added as assignees for the questions)

@eunchan is there documentation on this? I didn't find on bubble but I seem to remember it in a review.

@eunchan @imphil as part of this should I move to a new top_earlgray_usb directory? Originally it made sense to keep them in the same place because there was so much shared and you only had to update files like the xilinx clock generation in one place, but if things are generated there should be almost nothing shared. Or since we are soon moving on from earlgrey should I keep it where it is? Or maybe just rtl_usb in the top_earlgrey?

Investigate why Verilator is slowed down when tlul_assert is included

When enabling tlul_assert in tlul_socket_m1 and tlul_socket_1n the Verilator build is slowed down significantly. Investigate why this is, and potentially open a bug report with Verilator upstream.

See lowRISC/stwg-base#626 for an initial discussion, lowRISC/stwg-base#642 and lowRISC/stwg-base#643 for two workarounds.

vendor_hw script: Add include_from_upstream directive

Currently we have exclude_from_upstream to exclude certain files/directories from an upstream repository. Having the opposite mechanism would help in cases like tinyfpga, where we only want to include a specific directory (common in the tinyfpga case).

Come up with reset strategy

We need to think about the various reset signals, how they should interact and what they should reset:

  • Power on Reset (PoR)
  • ndmreset (from the debug module)
  • A (potentially available) reset button on the board
  • JTAG SRST (system reset)
  • JTAG TRST (test reset)

ndmreset

All the debug spec has to say about it is this:

This bit controls the reset signal from the DM to
the rest of the system. The signal should reset
every part of the system, including every hart,
except for the DM and any logic required to access
the DM. To perform a system reset the debugger
writes 1, and then writes 0 to deassert the reset.

-- Debug Spec 0.13.1, p. 25

Make SRAM_INIT_FILE/ROM_INIT_FILE a parameter

We want to have multiple sram instances which have a different initialization file. Currently this initialization file name is passed as define, this needs to be a parameter instead.

First discussed in lowRISC/stwg-base#472

[top] inter-module connection

@tjaychen @sjgitty
I would like to discuss the top gen inter module connection scheme here.

hjson struct in IP vs in Top

Current comportability spec has available_{input|output|inout}_list for the module connection. As the ports are usually connected to Pinmux, all port signals have cio_ prefix. But some of the signals could connect to the other modules (for instance, eFlash and eFlash controller). We should choose between below two options to enable this.

  1. specifying the port isn't goes to Pinmux or outside of the top in the IP. It means the entry in available_{input|output|inout}_list will have name, width, and now inter_module (boolean). If inter_module(name can be changed) is set to true, the port won't have cio_ prefix but have a direct name. For instance, if keymgr_secretkey input port has inter_module as true, then the port will be defined as input [width-1:0] keymgr_secretkey_i.

    It still needs the top hjson to define the relationship such as:

    inter_module: [
      { from: keymgr.secretkey, to: [hmac.keymgr_secretkey, aes.keymgr_secretkey] }
      ...
    ]
    
  2. all assumed as a input/output in the IP, and top configuration determines the connection property. It means all ports in a IP will have cio_ prefix but some of the signals connecting to the other modules.

    With above (item 1) example, the top gen will assume from as an output, to as an input and put cio_ prefix and _o or _i postfix accordingly.

input/output data type

The other issue on inter module connection is the input/ output data type.

to reduce the connection between the modules, struct packed type can be used. Issue is, where the struct type should be defined.

  1. From the output module means it introduces extra dependencies between the IPs (not good in my opinion)
  2. Common definition in hw/common/ directory. (still not that beautiful. just moving the dependencies to common directory)
  3. Assume input/output always logic. width is defined in available_{input|output|inout}_list item. Each module will have its own casing from/to the struct packed type. In this case, the sizeof(struct packed) needs to be calculated by the designer or the tool. by tool will be difficult. and width mismatch can happen.
  4. Just stop using struct packed define each signals in the available IO list

clocking information

If the signal is used in the other modules and if the other modules are clocked in another clock, then CDC logic is needed. But it isn't recognized until the clocks are defined in the top. And FPGA version and the ASIC version can have different clock scheme.

So, putting the CDC logic inside IPs isn't feasible in my opinion. Top needs to have CDC logic if needed.

  1. by tool: input, output list have clock information if the signal isn't clock by main IP clock. Tool recognizes clock differences and put the CDC (2ff sync if 1 bit if multibit valid/ready on both sides are mandatory). This is hard problem.
  2. Just do it manually by the top-level designer.

lowRISC/stwg-base#230

Building both SIM and non-SIM hello code in the same make

Currently as I switch from verilator to FPGA and back I have to remember to rebuild the
hello_world/hello_usbdev program with or without SIM=1. I keep forgetting which makes me think that things have broken.

Would be nice if we could either:

  • Build both versions in the default make $(PROGRAM) and $(PROGRAM)-sim or something.
  • Make it dynamic based on where the code is running (since we have unused gpios maybe tie one based on the verilator or nexysvideo wrapper)?

Automate bootstrap on developer machines

We currently describe how to set up a development environment in our user guide. The current approach has two downsides:

  • Wrong descriptions can go unnoticed.
  • It's a manual process on the user's side, which doesn't give new contributors a nice onboarding experience.
  • If updates are required, users need to be notified somehow and then need to apply the updates manually.

We can avoid all this through an automated bootstrap process. It takes an in-tree description of how the setup should be, and ensures that developers run this setup.

I'm currently working on an implementation of this, you can find a proof-of-concept version at https://github.com/imphil/stwg-base/tree/otx

[hmac] Add support for SHA / HMAC context switch

can i make a wishlist request (long term)? This is something that's come up a few times. It seems that a lot of software use cases end up in a situation where multiple threads want to use the SHA engine at the same time. However, if each is using the engine to SHA an indeterminate amount of data, it means that the SHA engine itself needs to context switch (ie, a thread cannot hold on to it forever). So it would be nice to be able to save SHA context and restore another to proceed with data dumping.

Just something to think about. Even if we don't need it, I am sure someone in the OT community will eventually.

Pass discovered modules to fusesoc generators

Fusesoc builds a dynamic list of source files, parameters, and other settings by (1) scanning a search path (called CORES_ROOT) for individual *.core files, and (2) resolving a dependency tree from a given top-level module, while taking external constraints (such as the synthesis tool) into consideration. This behavior enables us today to have the right set of source files for a given synthesis or simulation target. Since the search path is dynamic it can be locally extended (on the user's machine) to search code in directories which might or might not be available, such as a private repository or network share containing technology primitives.

Fusesoc also has a feature called "generators", by which it calls an external script to create additional source files on the fly. (https://fusesoc.readthedocs.io/en/master/generators.html)

What's missing is a way to pass (a) all core files fusesoc found, and (b) the resolved dependency tree to a generator. (See the discussion in olofk/fusesoc#250).

We have two use cases for such a feature:

  • The automatic toplevel generation (#230) needs to know the resolved dependency tree, and a list of configuration *.json files which are included in the build.
  • The implementation-dependent primitives code in lowRISC/stwg-base#237 needs to know all core files which match a given name.

Note: we can work-around this missing feature in fusesoc by essentially replicating the search and dependency resolution logic that fusesoc uses. However I'd love to avoid that, and adding this missing feature to fusesoc shouldn't be too hard.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.