# 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
```

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
```

## 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
```

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

```bash
sim_springbok out/springbok_iree/samples/simple_vec_mul/simple_int_vec_mul_embedded_sync
```

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)
