
Raw
PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…
LargeWordClock LargeKickstarter is an open-source printed circuit board by PCBench, from the PCBench/PCBench repository on GitHub, published under the MIT licence. It is a 2-layer board of 398.2 × 398.2 mm with 1,591 parts on 152 nets, routed with 7,882 tracks and 607 vias.
It is built around the HT16K33 and DS3231S#. Its parts include 20 resistors, 12 ICs, 8 capacitors, 6 diodes and 5 connectors. It belongs with the AVR (ATmega, ATtiny) boards of this library.
PCBench is a dataset for PCB routing task, it includes a dataset consisting of 164 printed circuit boards (PCB), a data augmentation script to expand the dataset for supervised learning (SL) tasks, and a reinforcement learning (RL) environment.
All the PCB designs in our dataset are stored in the folder PCBs, where each PCB design is stored in a subfolder named {author/org}_{PCB_name}_{design_version(optional)}. Below is the folder structure of the dataset.
├── PCBs
│ ├── master_metadata.json
│ ├── subfolder1
│ │ ├── raw.kicad_pcb
│ │ ├── processed.kicad_pcb
│ │ ├── final.json
│ │ ├── metadata.json
│ │ ├── visual.png
│ ├── subfolder2
│ │ ├── raw.kicad_pcb
│ │ ├── processed.kicad_pcb
│ │ ├── final.json
│ │ ├── metadata.json
│ │ ├── visual.png
│ ├── ...The raw.kicad_pcb is the raw PCB design file, process.kicad_pcb is the file after cleaning up, final.json stores only routing-related information used for ML tasks. metadata.json stores the meta information for each single PCB design. visual.png is a visualization of each single PCB design. master_meta.json contains metadata of all PCBs and global-level information.
We propose a JSON specification (final.json for each PCB design) called the PCB Routing Description Language (PCB-RDL) that expresses a PCB routing problem and its solutions intuitively using basic concepts in order to facilitate research into automated PCB routing using ML. Following figure shows is an example of PCB with marked components in PCB-RDL (Left) and it corrsponding PCB-RDL (Right).

The augmentation data can be generated with the script Scripts/Data_augmentation/augmentation.py. To generate 3 samples by randomly extracting 50% nets from the PCB 1Bitsy_1bitsy, please run the following command
cd Scripts/Data_augmentation/
python augmentation.py --num_samples 3 --net_ratio 0.5 --pcb_name 1Bitsy_1bitsyAll the generated PCBs will be stored in the folder named augmented_data under Scripts/Data_augmentation/. In augmented_data, all the generated samples will be stored in a subfolder with the name of selected PCB. Each generated sample has the name sample_index.json. For example, the above command will generate the following file under Scripts/Data_augmentation/
├── augmented_data
│ ├── 1Bitsy_1bitsy
│ │ ├── 1.json
│ │ ├── 2.json
│ │ ├── 3.jsonThe RL environment requires Python >= 3.7. You can simply install the environment with the following commands:
git clone https://github.com/PCBench/PCBench.git
cd PCBench
python setup.py installAfter installation, open a Python console and type
from RLEnv.EnvLayer.PCBRoutingEnv import PCBRoutingEnvIf no error occurs, you have successfully installed the PCB routing environment.
The following content shows an example of API usage of PCBRoutingEnv.
from RLEnv.EnvLayer.PCBRoutingEnv import PCBRoutingEnv
import random
resolution = [0.5, 0.5]
pcb_folder = '../PCBs/'
pcb_names = ["1Bitsy_1bitsy"]
iters = 30
env = PCBRoutingEnv(resolution=resolution, pcb_folder=pcb_folder, pcb_names=pcb_names)
obs, info = env.reset()
for _ in range(iters):
act = random.randint(0,5)
obs, rew, terminal, _, info = env.step(act)
if terminal:
env.reset()You can find more examples of customizing functions of reward and state observation from RLEnv/examples.ipynb.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 512 | LED | LikeClockwork:SMD_LED_PLCC_2 | 0-0, 0-1, 0-2, 0-10, 0-11, 0-12, 0-13, 0-14, 0-15, 0-16, 0-17, 0-18, 0-19, 0-20, 0-21, 0-22 +496 |
| 12 | 47K | LikeClockwork:R_0603_HandSoldering_noss | R3, R6, R8, R9, R10, R11, R12, R13, R14, R15, R16, R17 |
| 12 | JUMPER | LikeClockwork:solder_jumper_noss | JP1, JP2, JP3, JP4, JP5, JP6, JP7, JP8, JP9, JP10, JP11, JP12 |
| 9 | MountingHole_2-5mm | LikeClockwork:MountingHole_2-5mm | H1, H4, H5, H6, H7, H9, H10, M2, M3 |
| 6 | 0.1uF | LikeClockwork:C_0603_HandSoldering_noss | C1, C4, C5, C6, C7, C8 |
| 5 | 10K | LikeClockwork:R_0603_HandSoldering_noss | R1, R2, R4, R5, R7 |
| 4 | DIODE | LikeClockwork:SOD-323noss | D2, D3, D4, D5 |
| 4 | HT16K33 | LikeClockwork:SO28W_noss | U1, U4, U10, U12 |
| 4 | HT16K33_BOUT | LikeClockwork:HT16K33_Breakout | U5, U6, U9, U11 |
| 3 | 10K | Resistors_ThroughHole:Resistor_Horizontal_RM10mm | R18, R19, R20 |
| 1 | 10uF | LikeClockwork:nosilk_Elko_vert_11.2x7.5mm_RM2.5_CopperClear | C2 |
| 1 | 1uF | LikeClockwork:nosilk_Elko_vert_11.2x7.5mm_RM2.5_CopperClear | C3 |
| 1 | ATMEGA328-TQFP | adafruit:TQFP32-08 | U3 |
| 1 | Arduino_Nano | LikeClockwork:Arduino_Nano | U7 |
| 1 | BATTERY | SparkFun-Electromechanical:BATTCOM_20MM_PTH | BT1 |
| 1 | CONN_01X02 | Pin_Headers:Pin_Header_Straight_1x02 | P2 |
| 1 | CONN_01X03 | LikeClockwork:osilk_Diode_TO-220_Dual_CommonCathode_Horizontal_LargePads | P1 |
| 1 | CONN_01X05 | LikeClockwork:Pin_Header_Straight_1x05noss | P3 |
| 1 | CONN_01X06 | LikeClockwork:Pin_Header_Straight_1x06noss | P5 |
| 1 | CONN_02X03 | LikeClockwork:Pin_Header_Straight_2x03noss | P4 |
| 1 | DIODE | Diodes_ThroughHole:Diode_DO-41_SOD81_Horizontal_RM10 | D6 |
| 1 | DIODE | Diodes_SMD:Diode-SMA_Handsoldering | D1 |
| 1 | DS3231 | LikeClockwork:SOIC-16_7.5x10.3mm_Pitch1.27mmnoss | U2 |
| 1 | HOUR | SparkFun-Electromechanical:TACTILE-PTH-SIDEEZ | SW1 |
| 1 | LOGO | LikeClockwork:lc_logo_top | G***_2 |
| 1 | LOGO | LikeClockwork:power_section | G***_4 |
| 1 | LOGO | LikeClockwork:button_section | G***_3 |
| 1 | LOGO | LikeClockwork:top_matrix | G***_6 |
| 1 | LOGO | LikeClockwork:bottom_matrix | G***_5 |
| 1 | LOGO | LikeClockwork:shield_area_2 | G***_8 |
| 1 | LOGO | LikeClockwork:lc_logo_2 | G*** |
| 1 | LOGO | LikeClockwork:nano_section | G***_7 |
| 1 | LOGO | LikeClockwork:proto_area | G***_9 |
| 1 | MIN | SparkFun-Electromechanical:TACTILE-PTH-SIDEEZ | SW2 |
| 1 | SOFT | SparkFun-Electromechanical:TACTILE-PTH-SIDEEZ | SW4 |
| 1 | UNO_FOOTPRINT | LikeClockwork:shield_footprint | U8 |
The 597 most common of 1,591 parts.
It measures 398.2 × 398.2 mm and has 2 copper layers, 1.6 mm thick.
1,591 parts, built around the HT16K33 and DS3231S#. 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.
From the PCBench/PCBench repository on GitHub, at the commit this page was made from: the board is PCBs/LargeWordClock_LargeKickstarter/processed.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

PCBench/PCBench
resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…






Pesc0/Clock
A digital clock with a 7 segment display, attiny85, DS3231 and a lot of cool features

VoltMusic/OB-SX-Programmer-and-Interface
This contains the Arduino code and KiCAD project file for creating a OB-SX Programmer and Interface.
