Skip to the content
8 layers12.9 × 31.2 mmJetson orin baseboard, the printed circuit board in 3D

Jetson orin baseboard

taogya/gerber2ems_fork

This project is a Python script that aims to streamline signal integrity simulations using open source tools. It takes PCB production files as input (Gerber, drill files, stackup information) and simulates trace SI…

Size
12.9 × 31.2 mm
Copper layers
8
Thickness
1.62 mm
Parts
20
Nets
482
Pads
26
Tracks, vias
7,814, 18
Pours
90
Routed
Yes
KiCad
KiCad 7 (file 20221018)
Created
17 Mar 2025
Updated
18 Mar 2025

Overview

Jetson orin baseboard is an open-source printed circuit board by taogya, from the taogya/gerber2ems_fork repository on GitHub, published under the Apache-2.0 licence. It is an 8-layer board of 12.9 × 31.2 mm with 20 parts on 482 nets, routed with 7,814 tracks and 18 vias.

It is built around the TPD4E05U06QDQARQ1, CR0402-FX-4990GLF and PJE138K_R1_00001, with the EXB-18VR000X among its other parts. Its parts include 3 resistors, 1 IC and 1 transistor. It belongs with the computers and single-board computers boards of this library.

Main components

4

README

README.md

gerber2ems - openEMS simulation based on Gerber files

Copyright (c) 2023-2025 Antmicro

This project is a Python script that aims to streamline signal integrity simulations using open source tools. It takes PCB production files as input (Gerber, drill files, stackup information) and simulates trace SI performance using openEMS - a free and open source electromagnetic field solver that uses the FDTD method.

Installation

Required dependencies

1. OpenEMS

Install the following packages (on Debian/Ubuntu):

bash
sudo apt install build-essential cmake git libhdf5-dev libvtk9-dev libboost-all-dev libcgal-dev libtinyxml-dev qtbase5-dev libvtk9-qt-dev python3-numpy python3-matplotlib cython3 python3-h5py

Clone the repository, compile and install openEMS:

bash
git clone --recursive https://github.com/thliebig/openEMS-Project.git
cd openEMS-Project
./update_openEMS.sh ~/opt/openEMS --python
2. Gerbv

For Ubuntu/Debian:

bash
sudo apt install gerbv

Optional dependencies

1. Paraview

For Ubuntu/Debian:

bash
sudo apt install paraview

Script installation

It is suggested to update pip before installation.

bash
python3 -m pip install pip -U

To install the script, run the commands below:

bash
git clone https://github.com/antmicro/gerber2ems.git
cd ./gerber2ems
pip install .

Virtual environment

To install the script along with its Python dependencies inside a virtual environment on Debian/Ubuntu, follow these steps:

  • Install the virutalenv package with:
    bash
    sudo apt install python3-venv
  • Create a virtual environment:
    bash
    python3 -m venv .venv --system-site-packages
    --system-site-packages enables access to the system-wide openEMS installation
  • Activate the environment:
    bash
    source .venv/bin/activate
  • Install the script and its Python dependencies:
    text
    pip install .
  • Deactivate the environment:
    text
    deactivate

For the script installed inside a virtual environment to be accessible globally without the need to manually enable the virtual environment, you can create a bash script as follows:

bash
#!/usr/bin/env bash
source /path/to/repository/.venv/bin/activate
python3 /path/to/repository/src/gerber2ems/main.py "$@"
deactivate

Then:

  • Mark the script executable: chmod +x gerber2ems.sh
  • Add it to your PATH, e.g. ln -sf "$(pwd)/gerber2ems.sh" "$HOME/.local/bin/gerber2ems"

Then, you can simply call gerber2ems to run the script from any location.

Usage

For quick lookup, use gerber2ems --help.

To simulate a trace, follow these steps:

Results

This software returns the following types of output:

Impedance chart

Plot of each excited port vs. frequency.

S-parameter chart

Plot of each S-parameter measured during each excitation.

Smith chart

Plot of parameter S-11 for each excitation.

S-parameter and impedance data

Impedance and S-parameter data gathered during the simulations, stored in CSV format with a header.

How it works

Project preparation

Simulating an entire PCB is extremely resource-intensive, so it is important to separate a region of interest as small in size as possible - unneeded traces, pours etc., should be removed. If entire layers are redundant, you can remove them in later steps.

Ports of interest should be marked by a virtual component in positions files. Their designator should begin with "SP" and be followed by port number.

Origin point for drill files should be placed in bottom-left corner.

Every trace or pour that is somehow terminated in reality and will exist in the simulation should also be terminated using a simulation port or connected to ground.

For now, capacitors are not simulated and, for high frequency simulation, they can be aproximated by shorting them using a trace.

PCB input file preparation

This script requires multiple input files for geometry creation. They should all reside in the "fab" folder and are listed below:

  • Gerber files - each simulated copper layer should have a corresponding Gerber file named in the following format: "<optional-text>-<name-from-stackup-file>.gbr"

  • Stackup file - a file describing the PCB stackup, named "stackup.json". Example format:

json
{
    "layers": [
        {
            "name": "F.Cu",
            "type": "copper",
            "color": null,
            "thickness": 0.035,
            "material": null,
            "epsilon": null,
            "lossTangent": null
        },
        {
            "name": "dielectric 1",
            "type": "core",
            "color": null,
            "thickness": 0.2,
            "material": "FR4",
            "epsilon": 4.5,
            "lossTangent": 0.02
        }
    ],
    "format_version": "1.0"
}
  • Drill file - Drill file in excellon format with plated through-holes. Filename should end with "-PTH.drl"

  • Position file - File describing positions of ports.

    • Filename should end with "-pos.csv"

    • Coordinates should be given in relation to bottom left corner

    • The area of the port is calculated using the formulas in the table below, based on the Width and Length values from the simulation.json file:

      Rotation [°]X spanY spanWave travel direction
      0(PosX-Width/2, PosX+Width/2)(PosY, PosY+Length)Along Y
      90(PosX-Length, PosX)(PosY-Width/2, PosY+Width/2)Opposite to X
      180(PosX-Width/2, PosX+Width/2)(PosY-Length, PosY)Opposite to Y
      270(PosX, PosX+Length)(PosY-Width/2, PosY+Width/2)Along X
    • Example file:

      text
      # Ref     Val              Package                PosX       PosY       Rot  Side
      SP1       Simulation_Port  Simulation_Port      3.0000    11.7500  180.0000  top

Config preparation

The simulation.json file configures the entire simulation. You can find sample files in the example_gerbers folder. All dimensions in this file are specified in micrometers. This config file consists of three sections:

Miscellaneous
  • format_version - specifies the format of the config file When writing a new config, it should be the newest supported version (visible in the constants.py file)
  • frequency - start specifies the lowest frequency of interest and stop the highest (in Hz)
  • max_steps - max number of simulation steps after which the simulation will stop unconditionally
  • pixel_size - size of pixel in microns. Used during gerber conversion (default: 5) (due to a limitation of libcairo, this needs to be increased for larger boards, but try to keep as low as possible)
  • via/plating_thickness - via plating thickness (micrometers)
  • via/filling_epsilon - dielectric constant of the material the vias are filled in with If they are not filled in, it should be 1
Grid
  • inter_layers - number of grid lines in Z axis between neighboring PCB layers (default: 4)
  • optimal - basic mesh grid pitch (micrometers) (used for cells on metal edge) (default: 50)
  • diagonal - mesh grid pitch (micrometers) (used for regions with diagonal paths) (default: 50)
  • perpendicular - mesh grid pitch (micrometers) (used for regions with paths perpendicular to grid) (default: 200)
  • max - maximum mesh grid pitch (micrometers) (used outside of the board area) (default: 500)
  • cell_ratio/xy - optimal neighboring cell size ratio (X/Y axis) (default: 1.2)
  • cell_ratio/xy - optimal neighboring cell size ratio (Z axis) (default: 1.5)
  • margin/xy - margin size in X/Y axis (micrometers) (how far beyond pcb the grid spreads) (default: 1000)
  • margin/z - margin size in Z axis (micrometers) (default: 1000).
  • margin/from_trace - Limit simulation space based on nets-of-interest bounding box (default: True) (if False, board b-box is used).

Grid pitch options should follow optimal<=diagonal<=perpendicular<=max<=λmin/10

Ports

ports is a list of ports. Each port has the following parameters:

  • width - width of the port (micrometers)
  • length - length of the port (ports are currently composed of microstripline fragments whose length should be at least 8x mesh cell size) (micrometers)
  • impedance - terminating impedance of the port (impedance of driver or receiver) (Ohms)
  • layer - the number of the copper layer where the port is located (counting from the top)
  • plane - the number of the copper layer where the reference plane of the microstrip is located (counting from the top)
  • excite - whether the simulator should use this port as an input port (for multiple excited ports, they will be excited in separate simulations).
differential_pairs/traces

differential_pairs/traces are lists of simulated signals. Each signal can have following fields:

  • start_p, stop_p, start_n, stop_n - port numbers used for signal (differential_pair)
  • start, stop - port numbers used for signal (single ended trace)
  • name - optional name that allows to identify the signal
  • nets - list of nets to be included during grid generation (e.g. ["/CSI_A_CLK_N","/CSI_A_CLK_P"]). If not specified, data from netinfo.json file will be used. In case the file is also not present, all nets (except GND) will be considered during grid generation.

Geometry creation

This is an automatic step commenced with the -g flag. The script locates all the files needed for creating the geometry (Gerbers, drill files, pnp files, stackup file, simulation config file). Then it converts Gerber files to PNG using gerbv. The PNG's are then processed into triangles and input into the geometry. This also adds via geometries as well as port geometries. Everything is placed on correct Z heights using the stackup file.

You can view the generated geometry, which is saved to ems/geometry/geometry.xml, using AppCSXCAD (installed during openEMS installation).

Simulation

This is an automatic step commenced with the -s flag. The script loads the geometry and config files. It inputs all the information into the engine and starts the simulations, iterating over every excited port.

At this step, the user should verify if the indicated number of timesteps is sufficient. The engine recommends that it should be at least 3x as long as the pulse:

text
Excitation signal length is: 3211 timesteps (3.18343e-10s)
Max. number of timesteps: 10000 ( --> 3.11429 * Excitation signal length)

The simulator converts the geometry into voxels and starts solving Maxwell equations for each edge in the mesh. It does that for a number of timesteps (maximum number specified in config) and then exits. For each timestep, electric field data from planes between copper planes is saved to files in the ems/simulation folder. Port voltage and current data is also saved.

During the simulation, one of the ports is excited using a gaussian pulse (wideband frequency content). This pulse traverses the network and exits using ports (it can also get emitted outside the board).

You can monitor the simulation by looking at the engine output:

text
[@ 20s] Timestep: 4620 || Speed:  294.4 MC/s (3.372e-03 s/TS) || Energy: ~4.16e-16 (- 7.15dB)

This way you can see:

  • what timestep you are on
  • how many mesh voxels per second the simulator processes
  • how much energy is left in the system

The energy should drop during the simulation as it exits through the ports (after the excitation pulse ends), however due to inaccuracies and energy radiated it won't drop to 0.

After the simulation finishes, the user can verify the data using Paraview (described in a section below).

Postprocessing

This is an automatic step commenced with the -p flag. The script loads simulation data for each excited port. It then computes an FFT to get data in the frequency domain. It then converts the incident and reflected wave data to impedance and S parameters. These are saved in CSV format in the ems/results/S-parameters folder. This data is also automatically plotted and the plots are saved to ems/results.

Paraview

To view simulation data in Paraview, follow these steps:

  • Run gerber2ems -a --export-field
  • Run ems2paraview <port>

<port> is a simulated port number, defined in the simulation.json, to list all available ports use: ems2paraview -l

Licensing

This project is published under the Apache-2.0 license.

Parts

20
QtyValueFootprintReferences
14Simulation_Portantmicro-footprints:Simulation_PortSP1, SP2, SP3, SP4, SP5, SP6, SP7, SP8, SP9, SP10, SP11, SP12, SP13, SP14
2R_499R_0402jetson-orin-baseboard-footprints:R_0402_1005MetricR209, R210
1PJE138Kjetson-orin-baseboard-footprints:SOT-523Q2
1R_4x0R_0201_arrayjetson-orin-baseboard-footprints:R_Array_4x0201_Panasonic_EXB18VR34
1TPD4E05U06QDQARQ1jetson-orin-baseboard-footprints:USON-10_2.5x1mm_P0.5mmU45
1TP_0.75mm_SMDjetson-orin-baseboard-footprints:TP_SMD_0.75mmTP57

More from taogya/gerber2ems_fork

2
  • 2 layers4 × 16 mmDifferential, the printed circuit board in 3D

    Differential

    taogya/gerber2ems_fork

    This project is a Python script that aims to streamline signal integrity simulations using open source tools. It takes PCB production files as input (Gerber, drill files, stackup information) and simulates trace SI…

    8 partsApache-2.0
  • 2 layers9 × 14 mmBasic, the printed circuit board in 3D

    Basic

    taogya/gerber2ems_fork

    This project is a Python script that aims to streamline signal integrity simulations using open source tools. It takes PCB production files as input (Gerber, drill files, stackup information) and simulates trace SI…

    7 partsApache-2.0

Similar boards

  • 8 layers120 × 60 mmJetson orin baseboard, the printed circuit board in 3D

    Jetson orin baseboard

    antmicro/jetson-orin-baseboard

    Baseboard targetting the NVIDIA Jetson Orin Nano and Jetson Orin NX

    681 parts305Apache-2.0
  • 8 layers120 × 90 mmAtlas brain, the printed circuit board in 3D

    Atlas brain

    AtlasAutoware/carv2

    Atlas Autoware car v2: drive board (ESC, BMS, USB-C charging), Jetson carrier, printed kit

    366 parts
  • 10 layers120.4 × 90 mmBmc reference carrier board, the printed circuit board in 3D

    Bmc reference carrier board

    antmicro/dc-scm-osm-l-carrier-card

    DC-SCM Card supporting OSM-L System on Modules

    568 parts13Apache-2.0
  • 4 layers210 × 148 mmFibel2, the printed circuit board in 3D

    Fibel2

    nikolozka/Fibel2

    Repository of hardware design files Jetson Orin based Fibel

    514 parts
  • 6 layers70 × 50 mmThunderbolt pcie adapter, the printed circuit board in 3D

    Thunderbolt pcie adapter

    antmicro/thunderbolt-pcie-adapter

    This project contains open hardware design files for an adapter board wrapping 4-lane (i.e. 4x) PCIe Gen 3.0 devices into a Thunderbolt 3 uplink. It is based on the Intel/JHL6340SLLSQ Thunderbolt controller.

    272 parts82Apache-2.0
  • 14 layers55 × 40 mmPolarfire som, the printed circuit board in 3D

    Polarfire som

    antmicro/polarfire-som

    System on Module based on Microchip PolarFire MPFS250T SoC

    473 parts48Apache-2.0
  • 8 layers115.3 × 25.3 mmPROC091G, the printed circuit board in 3D

    PROC091G

    um-kiho/ti_radar

    AWR6843AOP (Antenna-on-Package) 60GHz FMCW 레이더를 이용한 존재 감지(Presence Detection) 시스템입니다. 내장 ARM Cortex-R4F MCU + C674x DSP에서 신호 처리 및 존재 판정을 수행하고, UART로 결과를 출력합니다.

    446 parts
  • 6 layers107 × 68 mmCm4-baseboard, the printed circuit board in 3D

    Cm4-baseboard

    antmicro/cm4-baseboard

    Experimental baseboard supporting System on Modules with Raspberry Pi CM4/CM5 pinout

    516 parts36Apache-2.0

Questions

How big is the Jetson orin baseboard PCB?

It measures 12.9 × 31.2 mm and has 8 copper layers, 1.62 mm thick.

What parts does the Jetson orin baseboard use?

20 parts, built around the TPD4E05U06QDQARQ1, CR0402-FX-4990GLF, PJE138K_R1_00001 and EXB-18VR000X. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Jetson orin baseboard KiCad files?

From the taogya/gerber2ems_fork repository on GitHub, at the commit this page was made from: the board is examples/job-simulation-part/jetson-orin-baseboard.kicad_pcb and its schematic examples/basic/basic.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Jetson orin baseboard design in my own project?

Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).