1 Commits

Author SHA1 Message Date
AllSpiceAlice 4c8d0a2419 Update README.md 2024-11-12 04:51:42 +00:00
8 changed files with 1 additions and 305 deletions
-21
View File
@@ -1,21 +0,0 @@
columns:
- name: "Manufacturer"
part_attributes:
- "Manufacturer"
- "MANUFACTURER"
sort: "asc"
- name: "Part Number"
part_attributes:
- "PART"
- "MANUFACTURER #"
- "_part_id"
remove_rows_matching: "TP|MTG|FID"
- name: "Designator"
part_attributes: "Designator"
grouped_values_separator: ", "
grouped_values_sort: "asc"
- name: "Description"
part_attributes:
- "PART DESCRIPTION"
- "_description"
-110
View File
@@ -1,110 +0,0 @@
#! /usr/bin/env python3
# Generate a Netlist from a PcbDoc file.
# For more information, read the README file in this directory.
import argparse
import os
import sys
from contextlib import ExitStack
from allspice import AllSpice
from allspice.utils.netlist_generation import generate_netlist
if __name__ == "__main__":
print("Hello World")
# Parse command line arguments. If you're writing a special purpose script,
# you can hardcode these values instead of using command line arguments.
parser = argparse.ArgumentParser(
prog="generate_pcb_netlist", description="Generate a netlist from a PCB file."
)
parser.add_argument("repository", help="The repo containing the project")
parser.add_argument(
"pcb_file",
help="The path to the PCB file in the source repo.",
)
parser.add_argument(
"--source_ref",
help="The git reference the netlist should be generated for (eg. branch name, tag name, commit SHA). Defaults to main.",
default="main",
)
parser.add_argument(
"--allspice_hub_url",
help="The URL of your AllSpice Hub instance. Defaults to https://hub.allspice.io.",
)
parser.add_argument(
"--output_file",
help="The path to the output file. If absent, the output will direct to the command line.",
)
args = parser.parse_args()
# Use Environment Variables to store your auth token. This keeps your token
# secure when sharing code.
auth_token = os.environ.get("ALLSPICE_AUTH_TOKEN")
if auth_token is None:
print("Please set the environment variable ALLSPICE_AUTH_TOKEN")
exit(1)
if args.allspice_hub_url is None:
allspice = AllSpice(token_text=auth_token)
else:
allspice = AllSpice(
token_text=auth_token, allspice_hub_url=args.allspice_hub_url
)
try:
# Test connection and key
print("AllSpice Version: " + allspice.get_version())
# Test private API call
print("API-Token belongs to user: " + allspice.get_user().username)
except Exception as e:
print(f"Could not connect to AllSpice Hub: {e}")
exit(1)
repo_owner, repo_name = args.repository.split("/")
try:
print(f"repo_owner={repo_owner}, repo_name={repo_name}")
repository = allspice.get_repository(repo_owner, repo_name)
except Exception as e:
print(f"Could not find repository {args.repository}: {e}")
exit(1)
pcb_file = args.pcb_file
print("Generating PCB Netlist...🏃", file=sys.stderr)
netlist_rows = generate_netlist(
allspice,
repository,
pcb_file,
args.source_ref,
)
with ExitStack() as stack:
if args.output_file is not None:
writer = stack.enter_context(open(args.output_file, "w"))
else:
writer = sys.stdout
nets = list(netlist_rows.keys())
# It's helpful to sort here to generate repeatable netlist files
nets.sort()
# You can change formatting here
for net in nets:
writer.write(net + "\n")
pins_on_net = netlist_rows[net]
try:
# Convert to list if it's not already, and then sort
if not isinstance(pins_on_net, list):
pins_on_net = list(pins_on_net)
pins_on_net.sort()
except Exception as e:
print(f"Error sorting pins on net {net}: {e}", file=sys.stderr)
writer.write(" " + " ".join(pins_on_net) + "\n")
print("Generated PCB netlist.", file=sys.stderr)
-1
View File
@@ -1 +0,0 @@
print("Hello World!")
-57
View File
@@ -1,57 +0,0 @@
# HelloWorld.py
# If you're new to scripting, this is a great place to start.
# Hello World starts you out easy with some simple server requests.
# This will help you troubleshoot your connection and show you the basics of making an api request
#
# For more information read our README.md
from allspice import AllSpice
import argparse, sys
print("Starting Test")
parser = argparse.ArgumentParser(
prog="Allspice_API_BIST", description="Test connection and execution of API actions"
)
parser.add_argument(
"--allspice_hub_url",
help="The URL of your AllSpice Hub instance. Defaults to https://hub.allspice.io.",
)
parser.add_argument(
"--allspice_token",
help="Your AllSpice application token. Generate a token: https://hub.allspice.io/user/settings/applications",
)
print("Parsing args")
args = parser.parse_args()
auth_token = args.allspice_token
if auth_token is None:
print("Please supply a token with --allspice_token <your_token> Generate a token: https://hub.allspice.io/user/settings/applications")
sys.exit(1)
print(f"Auth token {auth_token}")
if args.allspice_hub_url is None:
allspice = AllSpice(token_text="https://hub.allspice.io")
else:
try:
allspice = AllSpice(
token_text=auth_token, allspice_hub_url=args.allspice_hub_url
)
except Exception as e:
print("Error")
sys.exit(1)
print("Finish making connection")
# Test connection and key
print("AllSpice Version: " + allspice.get_version())
# Test private API call
print("API-Token belongs to user: " + allspice.get_user().username)
print("End test")
-2
View File
@@ -1,2 +0,0 @@
py-allspice~=3.0
rich~=13.0
-60
View File
@@ -1,60 +0,0 @@
# AllSpice Running common Actions workflow
# Action triggers on push and issues
# Action runs "generate-bom-altium" action
# .allspice/workflows/generate_bom.yml
name: Generate BOM
on:
push:
issues:
types: [opened, closed, reopened]
jobs:
Generate_BOM:
runs-on: ubuntu-latest
steps:
# Checkout is only needed if columns.json is committed in your Altium project repo.
- name: Checkout
uses: actions/checkout@v3
- name: Generate BOM
uses: https://hub.allspice.io/Actions/generate-bom@v0.8
with:
# The path to the project file in your repo (.PrjPcb for Altium, .DSN for OrCad).
source_path: Archimajor.PrjPcb
# [optional] A path to a YAML file mapping columns to the component attributes
# This file must be provided.
# Default: 'columns.json'
columns: .allspice/columns.yml
# [optional] The path to the output file that will be generated.
# Default: 'bom.csv'
output_file_name: bom.csv
# [optional] A comma-separated list of columns to group the BOM by. If empty
# or not present, the BOM will be flat.
# Default: ''
group_by: 'Part Number'
# [optional] The variant of the project to generate the BOM for. If empty
# or not present, the BOM will be generated for the default variant.
# Default: ''
variant: ''
# Print bom.csv to terminal
- name: Show BOM
run: cat bom.csv
- name: Convert BOM to Excel
uses: https://hub.allspice.io/Actions/csv_to_excel@v0.15
with:
source_path: bom.csv
output_file_name: bom.xlsx
start_cellname: A1
- name: Upload file as artifact
uses: actions/upload-artifact@v3
with:
name: BOM.csv
path: bom.csv
- name: Upload file as artifact
uses: actions/upload-artifact@v3
with:
name: BOM.xlsx
path: bom.xlsx
-54
View File
@@ -1,54 +0,0 @@
# Python-py-allspice demo repository
# This workflow demonstrates how to use Python and py-allspice to interact with the AllSpice API
# AllSpice Actions documentation: https://learn.allspice.io/docs/actions-cicd
name: Python-py-allspice
on:
push:
issues:
types: [opened, closed, reopened]
jobs:
py-allspice test:
runs-on: ubuntu-latest
steps:
# Check out repository code
- name: "[📚->🖥️] Check out repository code"
uses: actions/checkout@v3
- name: "[🔎->📂] List files in repo 🔎"
run: |
ls -la ${{ allspice.workspace }}
# Installs python requirements from the requirements.txt file
- name: "[🤼->🖥️] Install python requirements"
run: pip install -r .allspice/utils/requirements.txt
# Call a python script from the .allspice/utils directory
- name: "[🏃->🐍] Run .allspice/utils/hello-world.py 🔎"
run: python .allspice/utils/hello-world.py
# Run the py-allspice self-test script, this will ping the server and verify the API is working
# Parameters: ${allspice.server_url} and ${allspice.token} are automatic Workflow variables and are used to authenticate the AllSpice API
- name: "[🔑->🕸️] Test AllSpice API with py-allspice 🔎"
run: python .allspice/utils/py-allspice-BIST.py --allspice_hub_url ${{ allspice.server_url }} --allspice_token ${{ allspice.token }}
# Generate a netlist from Altium .PcbDoc file
# Run the generate_netlist.py script from the .allspice/utils directory
- name: Generate Netlist
run: |
echo -e "repo ${{ allspice.repository }}"
ALLSPICE_AUTH_TOKEN=${{ allspice.token }} python .allspice/utils/generate_netlist.py "${{ allspice.repository }}" "Archimajor.PcbDoc" --allspice_hub_url "${{ allspice.server_url }}" --output_file Archimajor.pcbdoc.netlist.txt
# Print the netlist file to the terminal
- name: Show Netlist 🔎
run: cat Archimajor.pcbdoc.netlist.txt
# Archive the netlist file as an artifact file
- name: Archive code coverage results
uses: actions/upload-artifact@v3
with:
name: Archimajor.PcbDoc.netlist.txt
path: Archimajor.pcbdoc.netlist.txt
+1
View File
@@ -4,6 +4,7 @@
### Altium DEMO
This is an AllSpice demo showcasing the Archimajor board. With this repo you can explore all the functionalities and compatibility of AllSpice with the Altium ECAD tool .
Board is an all in one 3D printer motherboard. It is an original RAMBo style design with the 32bit Atmel SAM3X8E processor (same as Arduino Due) and TMC2130 stepper drivers all on one integrated PCB. Archim is named after the mathematician Archimedes. The RAMBo stands for (R)epRap (A)rduino-compatible (M)other (Bo)ard.