T0 · D’un coup d’œil
À quoi ressemble le langage RNL
La notation ci-dessous est celle de la norme du langage 0.3 : 46 mots-clés ; écrites sous forme de phrases standards, les instructions se lisent comme de la prose, et elles peuvent aussi s’écrire en chinois. L’environnement d’exécution de la chaîne d’outils implémente chaque mot-clé. Les versions 0.x ne promettent aucune compatibilité entre elles ; les outils lisent toujours les fichiers en 0.2.
Anatomie d’une instruction
Deux façons d’écrire une même instruction
Le texte libre n’étant destiné qu’aux humains, une même instruction peut s’écrire en notation brute ou sous forme de phrase standard. Les machines lisent exactement la même chose, et les outils peuvent convertir d’un style à l’autre dans les deux sens.
Préfixes de référence
Distinguez d’un coup d’œil ce qui appartient à la netlist et ce qui appartient à RNL.
Instance dans la netlistréférencée, jamais crééeNetun nœud (équipotentielle) dans la netlistBornepar nom, ou par position telle que #M1:1 (à partir de 1)Port de ce sous-circuitdéfini par .subckt ; un # isolé désigne le sous-circuit lui-mêmeNom à ce niveaulié une seule fois par niveau, visible uniquement à ce niveauDéfinitionun symbole, un style, une définition ou un ensemble ; hérité vers le basRôle dans une définitionrempli par des objets lors de l’application ; dans un symbole, un ? isolé désigne l’instance dessinée avec luiPoint« _ » laisse cet axe au solveur ; %j = (10, 10) est un point nomméEnsembleordonné ; se déplie d’un niveau à l’intérieur d’un autre ensemble, tandis que {{…}} reste un seul membreBusun groupe de nets ou d’instances indicés, tel que #XI<3:0>Objet enfanttel qu’une étiquette nommée avec keyChaînagetransmet un résultat à l’étape suivante ; => %x le nommeFormes d’instructions
Place M1 en (10, 20). Un seul axe suffit aussi, comme dans @PLACE(x=10) ; l’autre est laissé au solveur.
Les accolades contiennent un groupe ordonné d’objets : M1 et M2 partagent le même y.
Les parenthèses placées juste après un objet indiquent quel rôle de la définition il occupe ; « and » et « are treated » sont du texte libre.
Nomme l’objet créé par l’instruction, afin que %g0 puisse être réutilisé plus loin, par exemple pour le placer ; => %g0 à la fin fait de même.
Chaque étape transmet son résultat à la suivante : d’abord le placer, puis lui appliquer un miroir gauche-droite.
Un enregistrement, avec des instructions séparées par des points-virgules. L’en-tête d’enregistrement s’applique à chaque instruction qu’il contient : author consigne qui l’a écrit, et priority définit la priorité par défaut (sauf pour AS et ATTACH, qui n’héritent de la priorité de l’enregistrement que lorsqu’elle vaut « disabled »).
Familles de mots-clés
Les 46 mots-clés se répartissent en neuf familles. Cliquez sur l’un d’eux pour voir son rôle et sa phrase standard.
Cinq contraintes de placement
Toute intention de placement se ramène à ces relations : les quatre premières agissent sur les coordonnées x ou y, la cinquième sur les orientations. Une contrainte qui ne nomme qu’un axe ne fixe aucun sens ; une direction telle que "left-to-right" fixe quel élément vient en premier.
Alignement : même y, sur une seule ligne horizontale.
Ordre : strictement le long de x. Avec seulement l’axe, l’ordre direct et l’ordre inverse conviennent tous deux ; "left-to-right" fixe le sens.
Distribution : pas égaux entre voisins, par exemple pour centrer le transistor de pied.
Distance : B au moins 3 unités à droite de A ; avec "x" comme direction, l’un ou l’autre peut venir en premier.
Relation d’orientation : B est l’image en miroir gauche-droite de A ; le sens dans lequel chacun est tourné est laissé au solveur.
Comment un niveau de circuit prend effet
Une fois tout un niveau lu, il est traité en neuf phases fixes. C’est pourquoi un nom peut être utilisé avant d’être défini et qu’une instruction erronée n’affecte qu’elle-même ; les objets générés par des règles, tels que les masses ajoutées par le paquet standard, reçoivent eux aussi des symboles et des positions.
Présentation du langageNeuf sections pratiques : phrases, définitions, valeurs par défaut du paquet standard, ensembles et sélections, fils, texte, orientation, priorité et en-tête.T1 · Phrases
Les instructions se lisent comme des faits : notation et phrases
Les machines ne lisent que la notation : les références commençant par # & % $, les mots-clés commençant par @, les paramètres entre parenthèses, les accolades, les points-virgules et =>. Les mots placés entre eux sont du texte libre, qu’ils soient présents ou non. Les phrases standards donnent ses mots à chaque mot-clé, afin que les instructions d’une même sorte se lisent partout de la même façon ; le paquet d’alias chinois traduit ces mêmes phrases en chinois.
- Les machines lisent
- Se lit comme
Comment sont écrites les phrases standards
- Des faits, pas des ordresUne instruction énonce ce qui est vrai dans le dessin, et non une action à accomplir. Les objets sont le sujet, le mot-clé est le verbe ou le nom, les paramètres sont ses valeurs ; seuls des mots de liaison tels que is, are, has et there is sont ajoutés.
- Rien de plus que ce qui est ditAucun mot qui affirme plus que l’instruction, tel que must, only ou required : les lecteurs humains les croient, tandis que les machines les ignorent.
- Une gloseUn code d’orientation ou un axe peut être suivi de « , i.e., … » précisant ce qu’il signifie :
#M2 @ORIENT("MX"), i.e., flipped upside down. - Ce que peut contenir le texte libreEn dehors des parenthèses, tout caractère hormis @ # & % $ ? " ; = { } ( ) [ ] < > peut figurer entre les jetons, y compris la ponctuation ; une espace doit précéder chaque @.
Quatre pièges courants
Une référence placée dans du texte libre reste une référence, tandis qu’un nom sans son préfixe devient du texte libre.
Le texte libre M3 porte le même nom que l’instance #M3 ; manque-t-il un préfixe ?
M3 n’a pas de #, c’est donc du texte libre : seuls M1 et M2 sont alignés.
Aucun message : cette écriture est parfaitement valide.
#M2 reste un objet même à l’intérieur de l’« explication » : PLACE reçoit deux objets et place chacun d’eux, de sorte que M2 se retrouve lui aussi en x = 0. Mettez les simples remarques entre /* */.
Une référence est suivie de . et d’un nom : les bornes utilisent :, donc .d est ici du texte libre.
Cela désigne M1 lui-même, et non son drain ; CURRENT n’acceptant que des bornes, l’instruction échoue. Écrivez #M1:d.
Une référence est suivie de ! : un nom contenant ce caractère doit être mis entre guillemets, comme dans &"vdd!".
Sans guillemets, il s’agit du net vdd suivi du texte libre « ! », et ce niveau n’a pas de net vdd.
Un fichier complet
L’OTA à cinq transistors de l’introduction, montrant le fichier complet à l’étape 2.
T2 · Définitions
AS dit ce que sont les choses ; ATTACH dit ce qu’on leur ajoute
Une définition (@DEFINE) possède des rôles, des paramètres et un corps. L’appliquer avec AS ou ATTACH produit une utilisation : un objet qui peut être nommé et sélectionné. Paires différentielles, paires en miroir, masses et symboles de port naissent tous de cette façon, et leurs définitions résident dans le paquet standard.
Les objets forment ensemble la chose. La définition vient en dernier, et les objets remplissent ses rôles : M1 occupe in_p, M2 occupe in_n.
La chose est ajoutée sur les objets. La définition vient en premier : une masse est ajoutée sur le net vss ; elle n’existe que pour l’affichage et ne crée aucune connexion.
Ce que sont les choses, et comment elles sont dessinées
$CURRENT_MIRROR a un corps vide : l’appliquer note « ceci est un miroir de courant » sans rien changer au dessin. $MIRRORED contient des contraintes dans son corps ; lorsqu’il est appliqué, les rôles sont remplacés par les objets et les contraintes sont développées dans ce niveau. $DIFFERENTIAL_PAIR réunit les deux : il note une paire différentielle, et son corps place le transistor de pied sous le milieu de la paire. Les contraintes des corps du paquet standard sont toutes de priorité low : ce qu’écrit l’auteur passe en premier, et PRIORITY sur une utilisation les désactive.
Écrire sa propre définition
Dans le corps, les rôles s’écrivent ?a et les paramètres ?gap. Les paramètres se placent entre les parenthèses de AS lors de l’application ; sans eux, la valeur par défaut s’applique. Faites glisser le curseur pour modifier gap et observez le fichier et le schéma changer ensemble.
min=?gap est un minimum : un solveur peut les espacer davantage ; ce dessin montre la disposition la plus resserrée.
Définitions dans le paquet standard
Le langage lui-même ignore tout des paires différentielles. Ce sont des définitions ordinaires que le paquet standard écrit en RNL ; cliquez sur l’une d’elles pour la voir. Une définition du même nom dans un fichier les masque.
T3 · Valeurs par défaut
N’écrivez rien, et le schéma se dessine quand même
Le paquet standard est un fichier RNL contenant les symboles, styles, définitions et règles de complétion par défaut. Il est chargé avant chaque fichier, de sorte que tout ce qu’écrit un fichier peut le supplanter ; consultez la galerie des paquets standards pour voir le contenu de chaque paquet. L’étage à émetteur commun ci-dessous commence comme une netlist nue ; parcourez les deux préréglages pour ajouter trois lignes RNL et observer comment évolue la complétion automatique du paquet standard (affichée en gris).
Symboles par défaut
Dans une netlist SPICE, les symboles sont choisis d’abord selon la première lettre du nom de l’instance, puis selon le type du modèle ; dans une netlist Spectre, selon le master et le type du modèle. SET-SYMBOL dans un fichier venant après, il les supplante.
| Instances | Symbole | Bornes |
|---|---|---|
R* C* L* | $RESISTOR $CAPACITOR $INDUCTOR | p n |
V* I* | $VOLTAGE_SOURCE $CURRENT_SOURCE | p n |
D* | $DIODE | a k |
E* G* | $VCVS_4TERM $VCCS_4TERM | p n cp cn |
M* | $NMOS_4TERM ; type pmos $PMOS_4TERM | d g s b |
Q* | $NPN ; type pnp $PNP | c b e |
Les symboles des autres éléments, tels que F, H, B, S, W, J, T et U, ainsi que l’apparence de chaque symbole, se trouvent dans la galerie des paquets standards.
Règles de complétion (extrait)
Le paquet standard est lui-même écrit en RNL. Quelques ensembles servent de points d’ancrage au fichier : ajoutez-y ou retirez-en des éléments, et la complétion suit.
T4 · Ensembles et sélections
Les ensembles se déplient d’un niveau ; les sélections sont des règles
Les accolades écrivent un ensemble ordonné. Un ensemble référencé à l’intérieur d’un autre ensemble y apporte ses membres ; pour le conserver comme un seul membre, entourez-le d’une seconde paire d’accolades. Les objets retenus par une sélection forment eux aussi un ensemble, et une sélection est évaluée à son propre niveau ainsi qu’une fois à chaque niveau inférieur.
Déplier, ou garder comme un seul membre
Supposons %s1 = {#M1 #M2} et %s2 = {#M3 #M4}. Lors de notre banc d’essai d’écriture par LLM, environ 15 essais ont produit la forme de gauche alors qu’ils voulaient exprimer celle de droite. Appuyez sur « Autre disposition » pour voir quelles dispositions chacune autorise.
Membres :M1 M2 M3 M4
Quatre instances ordonnées une par une : uniquement M1 M2 M3 M4, ou l’inverse.
Membres :{M1 M2} {M3 M4}
Les deux groupes sont ordonnés selon leurs centres ; à l’intérieur de chaque groupe, n’importe quel ordre convient.
Sélectionner par condition
Une sélection choisit des objets dans une portée selon une condition : avec #, la portée est tout le niveau ; avec un net, la portée regroupe les objets connectés à ce net. Cliquez sur une instruction pour voir ce qu’elle sélectionne.
Une fois à chaque niveau
Une règle est traitée comme une définition : écrite au sommet, elle est évaluée au niveau supérieur puis une fois dans chaque sous-circuit inférieur, en n’examinant à chaque fois que les objets de ce niveau. Avec recursive=false, elle ne prend effet qu’à son propre niveau.
T5 · Fils
Seul un point partagé relie des fils
WIRE prend un net et une liste ordonnée de points, chacun étant une borne ou un objet point. Le net n’est qu’une indication ; les connexions restent définies par la netlist. Que des fils dessinés se rejoignent ou non dépend uniquement du fait qu’ils partagent le même objet point ou la même borne.
Six modes de tracé
Chaque point de la liste est parcouru ; la façon dont un fil relie deux points voisins est fixée par mode. Hormis auto, chaque mode est une règle stricte que suivent les visionneuses. Cliquez n’importe où sur le dessin pour déplacer le point d’arrivée.
Bus, dérivations et faisceaux
Les netlists n’ont pas de bus : un bus n’est qu’une manière de dessiner plusieurs nets sous la forme d’un unique trait épais. Un fil simple partageant un point avec le bus est une dérivation. Un faisceau (BUNDLE) dessine un groupe d’instances sous la forme d’un seul symbole, dont les broches représentent les bornes de même nom de ses membres.
Pour éviter d’écrire le tracé, &D<1> @ROUTE confie tout le net au solveur : embranchements, tracés et points de jonction sont à sa charge.
T6 · Texte
Du texte sur un objet est une étiquette ; sur un point, une annotation
Ce à quoi s’attache TEXT détermine trois choses : de quel objet ${…} lit les propriétés, où se place le texte par défaut et, avec une clé (key), de quel objet il est l’enfant. La position propre du texte est distincte ; PLACE ou dx et dy permettent de la fixer.
Balisage du texte
Le balisage de texte utilise un petit sous-ensemble de LaTeX que les modèles de langue connaissent bien. Les indices et exposants nécessitent des accolades, de sorte que g_m s’affiche tel quel ; ${…} lit les propriétés de l’objet auquel le texte est attaché, ici M1 (W=2u L=0.5u). Une commande inconnue s’affiche telle qu’elle est écrite avec un avertissement, et le texte reste valide.
T7 · Orientation
x vers la droite, y vers le haut ; huit codes d’orientation
Les coordonnées sont en unités de grille avec y vers le haut, comme dans Virtuoso. Une orientation agit autour de l’origine du symbole : les positions des broches et les directions de départ des fils tournent avec elle, mais pas les bornes auxquelles elles correspondent. Seuls ces huit codes sont acceptés ; R90 tourne dans le sens antihoraire, et MYR90 ainsi que MXR90 appliquent d’abord le miroir, puis la rotation.
Relations d’orientation
ORIENT-RELATION ne fixe aucune orientation absolue, seulement la relation : l’orientation de B est celle de A suivie de cette transformation. $MIRRORED utilise "MY" : quelle que soit l’orientation de A, B est son image en miroir gauche-droite.
T8 · Priorité
Les conflits ne sont pas des erreurs : la priorité d’abord, l’ordre ensuite
Chaque fait géométrique possède une priorité : disabled, low, normal (par défaut) ou high. Les faits sont pris par ordre de priorité, la plus haute d’abord, et à priorité égale le dernier écrit d’abord ; chacun est retenu sauf s’il contredit ceux déjà retenus. Un PLACE représente deux faits, x et y, qui peuvent être écartés séparément ; les faits développés à partir d’une utilisation prennent, dans l’ordre des instructions, la position de l’instruction qui crée cette utilisation.
Comment cohabitent trois enregistrements
Sémantique et contraintes, normal par défaut. Modifiables à volonté.
Coordonnées et fils, high. Remplacé d’un bloc à chaque résolution ; hash note l’entrée qu’il a résolue.
Les retouches manuelles sont ajoutées à la suite, également high : à priorité égale, le dernier écrit l’emporte, elles supplantent donc le solveur.
Lorsque l’entrée change et que l’empreinte hash ne correspond plus, l’ancien résultat continue de s’afficher ; la visionneuse suggère simplement de résoudre à nouveau, sans erreur. Lors de la résolution suivante, les coordonnées high de l’éditeur constituent des positions fixes et tout le reste s’ajuste.
T9 · En-tête
L’enregistrement d’en-tête : version, paquets d’alias, bornes des composants
L’enregistrement d’en-tête est facultatif ; s’il est écrit, c’est le premier enregistrement du fichier, en dehors de tout sous-circuit, et il y en a au plus un. Il est toujours lu en graphie standard, sans alias. Sans lui, le fichier est lu avec la version par défaut de l’outil, et les outils ajoutent l’en-tête lorsqu’ils enregistrent le fichier.
Noms des bornes pour les composants de PDK
Un sous-circuit non défini dans la netlist, tel que sky130_fd_pr__nfet_01v8 issu d’un PDK, n’a pas de noms de bornes connus, de sorte que ses bornes ne peuvent être référencées que par indice de position (tel que :1). @DEVICE déclare les noms de ses bornes, en ciblant les instances par motifs de nom et de modèle.
E · Exemples
Quelques petits exemples
Le fichier est à gauche, le schéma à droite. Survolez une ligne pour voir quelle partie du dessin elle contrôle ; survolez une partie du dessin pour marquer les lignes qui s’y réfèrent.