Repositório de cooperação do time para organizar vários circuitos em um único layout de fabricação na nanoTOOLS (Applied Nanotools, processo NanoSOI).
O circuito de base é o do Lucivaldo, em circuito-lucivaldo-v2. O layout que vai para a foundry é montado em main: o script lê o GDS do Lucivaldo, inclui os circuitos secundários e grava main.gds e main.oas.
Datas da corrida de novembro de 2026. Os designs devem ser submetidos até a data final, no horário indicado, para entrar no run.
| Etapa | Data | Horário |
|---|---|---|
| Último dia para solicitar FaML ou janelas through-cladding (Layer 6) | terça-feira, 3 de novembro de 2026 | 18:00 MST |
| Último dia para revisão opcional de layout (draft) | terça-feira, 10 de novembro de 2026 | 18:00 MST |
| Submissão final (layouts DRC-clean) | terça-feira, 24 de novembro de 2026 | 18:00 MST |
Pedidos de customização extra (FaML, Layer 6 etc.) devem ser feitos duas semanas antes do prazo final de DRC, conforme as regras da foundry.
- Cada pessoa faz um fork deste repositório.
- Sobe o próprio layout em uma pasta separada, com o GDS do circuito.
- Passa o circuito pelo DRC da nanoTOOLS.
- Inclui o circuito na lista de
main/main.pye roda o script da main. O GDS do Lucivaldo não é editado.
O script main/main.py sempre refaz a main do zero:
- Gera
main/saida/main.gdsa partir da célulaTOPdo circuito do Lucivaldo. - Passa esse
main.gdspelo DRC e grava o relatório00. - Percorre
CIRCUITOS_SECUNDARIOS. A cada circuito, inclui o GDS nas coordenadas indicadas, regravamain.gdse roda o DRC de novo. - No final, o
main.gdscompleto passa por um último DRC e o script gravamain/saida/main.oase a figurafigs/main.png.
flowchart TD
inicio["uv run python main/main.py"] --> lerCfg["Ler PASTA_LUCIVALDO e CIRCUITOS_SECUNDARIOS"]
lerCfg --> host["Montar main.gds so com a TOP do Lucivaldo"]
host --> drc0["DRC 00 do circuito do Lucivaldo"]
drc0 --> loop{"Ha proximo circuito secundario?"}
loop -->|sim| inclui["Incluir o GDS na origem indicada e regravar main.gds"]
inclui --> drcN["DRC NN do circuito incluido"]
drcN --> loop
loop -->|nao| drcF["DRC final NN_DRC_main"]
drcF --> oas["Gravar main.oas e figs/main.png"]
Os relatórios ficam em main/relatorios/, na ordem de execução. O prefixo 00, 01, 02… organiza essa ordem. Cada rodada gera um .txt e um .lyrdb com o mesmo nome, por exemplo:
00_DRC_circuito-lucivaldo-v2.txt01_DRC_isa-jose-v1.txt02_DRC_isa-jose-v1-pdk.txt03_DRC_lucas-v1.txt04_DRC_mariana-v1.txt05_DRC_main.txt
A primeira rodada fixa a baseline de design_area, si_width e si_space. As seguintes não podem piorar essa baseline nem introduzir erro de metal. Avisos (pin_layer, black_box, window) entram no relatório e não interrompem o script. Camada 6/0, célula com nome repetido, silício (1, 0) sobreposto e bloco fora de ±4500 µm interrompem.
- Crie uma pasta só para o circuito, no mesmo nível das outras (por exemplo
circuito-fulano-v1). - Deixe o GDS dentro dessa pasta.
- Em
main/main.py, acrescente um item no fim deCIRCUITOS_SECUNDARIOS:
CIRCUITOS_SECUNDARIOS: list[CircuitoSecundario] = [
{
"nome": "isa-jose-v1",
"gds": "circuito-isa-jose-v1/mzi_O4_2estagios_gc_array.gds",
"celula": "MZI_O4_GC7",
"origem_um": (1780.731, -3655.679),
},
{
"nome": "isa-jose-v1-pdk",
"gds": "circuito-isa-jose-v1/mzi_O4_2estagios_gc_array_pdk.gds",
"celula": "MZI_O4_GC7_PDK",
"origem_um": (3222.971, -3655.679),
},
{
"nome": "fulano-v1",
"gds": "circuito-fulano-v1/circuito.gds",
"celula": "TOP",
"origem_um": (0.0, 0.0),
},
]nomeaparece no relatório (01_DRC_fulano-v1).gdsé o caminho do arquivo a partir da raiz do repositório.celulaé a célula desse GDS que entra na main.origem_umé o ponto(x, y), em µm, onde o circuito é colocado.
- Na raiz do repositório, rode de novo:
uv run python main/main.pyO script inclui todos os circuitos da lista, repete o DRC depois de cada um, atualiza main.gds e, no final, atualiza main.oas e figs/main.png.
O circuito de base não entra na lista de secundários. O caminho da pasta fica numa variável no topo de main/main.py:
PASTA_LUCIVALDO = "circuito-lucivaldo-v2"
GDS_LUCIVALDO = "CircuitoLucivaldoV2.gds"Se o Lucivaldo renomear a pasta ou o GDS, atualize essas duas variáveis. A célula lida continua sendo TOP.
Para recompilar o GDS do Lucivaldo a partir do notebook:
uv run python circuito-lucivaldo-v2/compile.pyO arquivo sai em circuito-lucivaldo-v2/CircuitoLucivaldoV2.gds. Depois rode main/main.py para remontar a main.
O ambiente Python é único, na raiz do repositório. Não crie um venv dentro da pasta de um circuito.
É preciso ter o KLayout instalado. O script procura klayout_app.exe no PATH, em %USERPROFILE%\KLayout, em Program Files, em Program Files (x86) e em %APPDATA%\KLayout.
uv sync
uv run python main/main.pyuv sync cria o .venv da raiz e instala as bibliotecas do layout (gdsfactory, PhotonForge e o que os circuitos importam).
A versão atual do PDK é a Version 8.0. O arquivo está com José Roberto.
Quem ainda não tiver o PDK pode solicitar por e-mail: jose.arcanjo@ee.ufcg.edu.br.
O DRC da main usa o deck NanoSOI Silicon v10 em main/drc/NanoSOI_Silicon_v10.drc.
-
As grades de entrada e saída devem estar direcionadas para lados opostos:
-
Sugestão adicional: as grades devem estar desalinhadas em x (não ficar na mesma coordenada horizontal).
-
Para medições com Fiber Array, utilizar o modelo
gc_fiber_array.gds:
O arquivo enviado à foundry é o main/saida/main.oas.
A figura abaixo é o layout atualizado.


