# 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 remove any +2 Code Review scores you receive when you
upload a patchset. In this case, once a peer has given you a +2 Code Review, you
are free to re-+2 your change yourself if the changes are minor or otherwise
address comments in the CL.

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 may *not* self-+2 your own CLs, no matter the urgency or how simple the
change is! Resist the temptation! 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.

Please don't abuse this policy and use good judgement: 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. If we abuse the policy by +2-ing before
peer review, this privilige will unfortunately have to be revoked, slowing down
the entire team in the process, and possibly getting yourself in trouble with
security/compliance.

### 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:40:14.6784 [INFO] uart1: [output] init_kernel()
10:40:14.6807 [INFO] uart1: [output] Init local IRQ
10:40:14.6831 [INFO] uart1: [output] Bootstrapping kernel
10:40:14.6842 [INFO] uart1: [output] Initialing PLIC...
10:40:14.7028 [INFO] uart0: [output] OpenTitan initialisation complete. Entering main loop
10:40:14.7066 [INFO] uart0: [output] Woo Tock!
10:40:14.7346 [INFO] uart0: [output] Hello Tock World
10:40:15.8820 [INFO] uart1: [output] Booting all finished, dropped to user space
```

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

```bash
KATA> test_mlexecute
```

and you should see

```bash
15:17:59.9864 [INFO] uart1: [output] KATA> test_mlexecute
...
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).

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