# What is this?

This is Project Shodan, a project to research the fusion of novel hardware and
software architectures to produce a low-power, ambient AI core. For more
information, see our
[internal site](https://sites.google.com/corp/google.com/cerebrahardware/projects/current-projects/shodan).

## Developing in this Codebase

We've stored our code in Gerrit, and like the Android developers before us, we
use `repo` to manage the projects in our Gerrit repositories.

To get started, first make sure you have a Git login for all our projects
by going to [googlesource.com/new-password](https://www.googlesource.com/new-password)
and pasting the provided script into a terminal.

Now you need to pull down a copy of the `repo`
tool from our public facing sites and add it to your path:

```bash
mkdir -p bin
export PATH=$PATH:$HOME/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
```

Make sure you've initialized git with your name and email address, and have
configured it properly for fetching the sources:

```bash
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
```

Once you've done this, you're actually ready to check out the sources. Make a
new directory where you'd like it to live, and initialize `repo` with the
current release branch.

```bash
repo init -u https://spacebeaker.googlesource.com/shodan/manifest -g default,internal --no-use-superproject
repo sync -j$(nproc)
```

## System Setup for Development

Development for shodan requires that the necessary tools and prerequisites be
installed.

To setup the build system:

```bash
source build/setup.sh
```

For non-gLinux systems: Add the bazel apt repository to your machines sources.
Instructions @ https://bazel.build/install/ubuntu#add-dis-uri

Install the prerequisites:

```bash
m prereqs
```

Install the tools used for development:

```bash
m tools
```

## Day-to-day Development Workflow

In general, working with repo is relatively simple:

  1. Create a working topic branch to make changes on with `repo start
     ${TOPICNAME}`
  2. Make your changes to the files. Add them with `git add -A` and commit with
     `git commit`.
  3. Upload your changes with `repo upload --re ${REVIEWER} --cc ${CC_LIST}`
  4. Go to the URL repo spits out to read and reply to comments.
  5. Eventually your reviewer will give you a +2 LGTM on your change. To submit,
     click the "SUBMIT" button on the change in the web interface.
  6. Run `repo sync -j$(nproc)` to update.
  7. Run `repo prune` to remove your topic branch.

For more information on how to use repo and git effectively, take a look at the
[official documentation](https://source.android.com/setup/create/coding-tasks).

### A Note on Code Review Policies

In the Shodan project, we follow a "sticky +2" policy.

What this means is that you *must* get a +2 Code Review from a peer, or a TL.
Gerrit will automatically pass any +2 Code Review scores you receive when you
upload a patchset with minor changes. This policy is in place so that we can
quickly get through code review and get our code submitted without requiring
lots of round-trips with your reviewers.

If you change significant parts of the CL post-+2, please ask for additional
review from your peers in a reply. Note: two +1s does *not* count as a +2!

You can't self-+2 your own CL, no matter the urgency or how simple the
change is! This policy ensures the code change is peer reviewed, and prevent us
from getting in trouble with security/compliance. If you don't know who to send
a CL to, put one of the TLs on the review list, and they'll redirect it
appropriately, or review your change.

As a reviewer, please use good judgement to help the team keep the good
momentum: If you provide a +1 score, please note in your comment who should
provide the +2; if your comments are minor changes about style, format, etc.,
and not related to the functionality of the code, please provide +2 so the code
owner can address the comments and submit the code without further review.

### Who are the TLs?

At the time of this writing, the TLs are:

Cindy Liu <hcindyl@>
June Tate-Gans <jtgans@>
Bangfei Pan <pbf@>
Steve Xu <stevexu@>

Finally, if you can't get one of the above people, please put Kai Yick
<kingkai@> on the review line.

*Special note if you're listed above*: you still must get your +2 from someone
else -- we need the TLs to lead by example and demonstrate the appropriate
behavior.

### How to sync my local copy with latest?

```bash
repo sync -j$(nproc)
```

Then if you have any outstanding branches, a `repo rebase` will help.

### How to send code for review?

To upload a branch to gerrit for review, do this:

```bash
repo upload --re reviewer1,reviewer2 --cc email@host.com,email2@host2.com
```

Reviewers can be specified as usernames or full email addresses, likewise for
`--cc`.

Repo will then output a URL for you to visit that allows you to make comments
and abandon and merge the changes into the repository. To make changes during
the review process, make your changes to the files, then:

```bash
git add -A                                    # To add the files you've changed
git commit --amend                            # To update the previous change
repo upload -t --re ${REVIEWER} --cc ${CC_LIST} # To upload the change to Gerrit for review
```

### Help! I'm on a limited-bandwidth connection, and need to stop downloading tooling!

There's an environment variable you can set called `PIN_TOOLCHAINS` to prevent
download attempts for various toolchains in the system. The format is a
space-delimited list of words that includes which toolchains you wish to prevent
downloading automatically during a build.

At the moment, this environment variable can be set to any of the following
words:

  `renode` - prevents downloading of the latest Renode binary build.

  `iree`   - prevents downloading of the latest IREE compiler toolchain.

Ie:

```bash
export PIN_TOOLCHAINS="renode iree"
```

*Note well*: if you set this variable, the output or behavior of any of the
preceding toolchains may be bad or incorrect. Please do not file bugs against
these components if you have this variable set!

### Help! IREE, Renode, or another toolchain is misbehaving!

Did you set `PIN_TOOLCHAINS`? If so, please unset this environment variable and
retry your build.

## Repository Layout

Our layout is pretty simple:

### build/

Contains build scripts for the whole tree. This is effectively just an
orchestration layer to make building the whole shebang easier. Each subtree may
have its own build systems and have their own ways of building.

### cache/

The cached cross-compilation toolchain, including rust and RISC-V GCC/LLVM
toolchain.

### cicd/

Contains continuous integration scripts and tooling for Jenkins, our CI/CD tool.

### docs/

Lots of extra documentation (we hope) about how the repo is laid out, how the
build system works, code reviews, licensing, etc.

### hw/

Contains all of the source code and RTL required to build the Shodan
hardware, as well as simulate it in Verilator.

#### opentitan

Security core.

#### ibex

System management controller (SMC).

#### springbok

Vector core for ML acceleration.

### kata/

Operating system software for the SMC; including seL4 kernel & CAmkES framework,
and custom CAmkES components that support Shodan (or maybe KataOS) applications.

### manifest/

The repo manifest used to glue all the git repositories together.

### scripts/

Contains utility scripts to help automate a few things.

### sim/

Contains tools and src for simulators (Renode and Verilator) of the shodan system.

### sw/

Contains the source code of applications running in all shodan cores.

#### libtock-rs

**TODO**: add more details

#### multihart_boot_rom

Bootstrap for System Management Controller, Security Core, and Vector Core. This
is the first software to run after reset; it does low-level hardware setup and
starts TockOs (SC) and seL4 (SMC).

#### pigweed

pigweed frameworks. Currently it is used for vector core functional tests.

#### tock

The operating system running on the Security Core.

#### vec

Springbok BSP, as well as the RVV instruction functional tests.

#### vec_iree

Springbok IREE application. It builds IREE runtime applications for ML models
using IREE libraries and Spingbok BSP.

### toolchain/

Contains the src to build the RISCV QEMU emulator, and
[IREE](https://github/com/google/iree) toolchain for ML models.

## Build and Test ML Artifacts

The ML executable is built with [IREE](https://github.com/google/iree) workflow,
targeted to RISCV 32-bit bare-metal config.

To build the IREE targets:

```bash
m iree_no_wmmu
```

The IREE compiler sits in `out/host/iree_compiler`, while the runtime library/example
sits in `out/springbok_iree_no_wmmu`.
To run the toy example (four-element vector element-wise multiplication) for
testing:

```bash
sim_springbok out/springbok_iree_no_wmmu/springbok_iree/samples/simple_vec_mul/simple_int_vec_mul_bytecode_static
```

The output should be shown as:

```bash
21:27:11.0241 [INFO] cpu2: simprint: "INFO |simple_vec_mul finished successfully", 0 (0x0)
21:27:11.0248 [INFO] cpu2: simprint: "main returned: ", 0 (0x0)
```

(Enter `quit` or `q` to exit the Renode simulation)

## Running The Full Shodan System Simulation

The simulator used for Shodan is [Renode](https://renode.io/). The configuration
for the Shodan system is `sim/config/platforms/shodan.repl`, while and starting script
is in `sim/config/shodan.resc`

To run the full system simulation, build the default target:

```bash
m
```

After all the artifacts are bulit, the Renode simulation session automatically
starts, and you should see the secured core and SMC booted

```bash
10:11:43.1993 [INFO] uart5: init_kernel()
10:11:43.2012 [INFO] uart5: Init local IRQ
10:11:43.2018 [INFO] uart5: Bootstrapping kernel
10:11:43.2053 [INFO] uart5: Initialing PLIC...
10:11:43.2830 [INFO] uart5: Booting all finished, dropped to user space
10:11:43.2978 [INFO] uart5: kata_os_rootserver::Bootinfo: 130550 empty slots 1 nodes 56 untyped 131072 cnode slots
10:11:43.3008 [INFO] uart5: kata_os_rootserver::Model: 3750 objects 32 irqs 0 untypeds 2 asids
10:11:43.3123 [INFO] uart5: kata_os_rootserver::capDL spec: 0.33 Mbytes
10:11:43.3142 [INFO] uart5: kata_os_rootserver::CAmkES components: 1.02 Mbytes
10:11:43.3191 [INFO] uart5: kata_os_rootserver::Rootserver executable: 0.40 Mbytes
```

At this point, you should be able to connect to the SMC debug console.

### Setting Up Debug Console Communication

Install socat to your machine

```bash
sudo apt install socat
```

In a new shell session, launch the debug console with

```bash
scripts/kshell.sh
```

You will see the kataOS prompt showing up when you hit `enter`. Use `ctrl-c` to leave the console.

### Connecting to Renode Console

Renode has its own console to control the emulation environment. You can connect to it by

```bash
telnet localhost 1234
```

For example, you can check the core status

```bash
(matcha) cpu1 IsHalted
False
```

or stop the whole emulation with

```bash
(matcha) quit
```

### Launch ML Job on the Vector Core

You can launch the ML workload execution by communicating through the debug console

Check existing builtin applications

```bash
KATA> builtins
```

Install the embedded ML model app; for example,

```bash
KATA> install mobilenet_v1_emitc_static.model
```

and you should see model installed with a bundle ID issued.

```bash
KATA> Bundle "fake.26" installed
```

You can then launch the ML job with `test_mlexecute <bundle ID> <model name>`

```bash
KATA> test_mlexecute fake.26 mobilenet_v1_emitc_static.model
```

with the Renode console log printed as

```bash
15:17:59.9864 [INFO] uart5: kata_ml_coordinator::Load successful.
...
15:18:02.6868 [INFO] cpu2: simprint: "main returned: ", 0 (0x0)

```

## More Information

For more available Shodan build targets, please see [Build target lists](./BuildTargetsExplained.md),
or use the in-project command of `hmm` and `hmm <target name>`.

Also, [Information on how to use repo](https://go/repo)
