Breve introduction aux systemes et processeurs Alpha Neal Crook, Digital Equipment (Publication: David Mosberger ) (Adaptation Francaise par Christophe Vallat (miodrag@mygale.org)) V0.11, 6 Juin 1997 Ce document est un rapide apercu des processeurs et systemes Alpha existants. Il y a un peu de parti pris, a cause de mon experience personnelle. Bien que je sois un employe de Digital Equipment Corpora- tion, il ne s'agit pas d'un d'un document officiel de Digital et les opinions exprimees sont les miennes, pas celles de Digital. 11.. QQuu''eesstt--ccee qquuee AAllpphhaa ?? "Alpha" est le nom donne a l'architecture RISC 64 bits de Digital. Le projet Alpha commenca a Digital a la mi-1989, dans le but de fournir une voie de migration haute-performance pour les clients VAX. Il ne s'agit pas de la premiere architecture RISC produite par Digital, mais ce fut la premiere a etre mise sur le marche. Quand Digital a annonce Alpha en mars 1992, elle a pris la decision d'entrer sur le marche des composants electroniques en vendant des microprocesseurs Alpha. Alpha est parfois designe par Alpha AXP, pour de vieilles et obscures raisons qu'il est inutile de preciser. Il suffit de dire que c'est exactement la meme chose. 22.. QQuu''eesstt--ccee qquuee DDiiggiittaall SSeemmiiccoonndduuccttoorr ?? Digital Semiconductor (DS) est la section commerciale de Digital Equipment Corporation (Digital - nous n'aimons pas le sigle DEC) qui vend les composants electroniques. Parmi les produits de Digital figurent les processeurs, les chipsets associes, les pontages PCI-PCI et les composants PCI pour la communication et le multimedia. 33.. PPrroocceesssseeuurrss AAllpphhaa Il y a actuellement 2 generations de base de processeur implementant l'architecture Alpha : +o EV4 +o EV5 Les avis different quant au sens de "EV" (note : la vraie reponse est bien entendu "Electro Vlassic" ``[1]''), mais le chiffre represente la premiere generation de technologie CMOS de Digital avec laquelle le processeur a ete concu. Ainsi, EV4 a ete initialement concue en CMOS4. Au fil du temps, un processeur tend a trouver une nouvelle jeunesse en etant optiquement retrecie dans la nouvelle generation de CMOS. EV45 est donc la base EV4 concue en CMOS5. Il y a une grande difference entre retrecir une conception pour une technologie particuliere et la reconcevoir pour cette technologie (mais je ne veux pas entrer dans les details). Il y a encore quelques variantes : la CMOS4S (retrecissement optique de la CMOS4) et une CMOS5L. Les vrais technophiles seront curieux de savoir que CMOS4 est une gravure en 0,75 micron, CMOS5 est une gravure en 0,5 micron, et CMOS6 est une gravure en 0,35 micron. Pour faire correspondre ces bases de processeur aux _p_u_c_e_s nous avons: 2211006644--115500,,116666 EV4 (initialement), EV4S (maintenant) 2211006644--220000 EV4S 2211006644AA--223333,,227755,,330000 EV45 2211006666 LCA4S (base EV4, avec coprocesseur EV4) 2211006666AA--223333 LCA45 (base EV4, mais avec coprocesseur EV45) 2211116644--223333,,330000,,333333 EV5 2211116644AA--441177 EV56 2211226644 EV6 La base EV4 est un noyau double-ecoulement (il peut traiter 2 instructions processeur par cycle d'horloge) super-pipeline avec une unite de calcul entier, une unite de calcul flottant et prediction de branchement. Il a des bus de donnees internes de 64 bits et des caches de 8Ko etroitement couples, un jeu de chaque pour les instructions, et pour les donnees. Les caches sont en ecriture immediate ("write- through"). La base EV45 a quelques ameliorations par rapport a la base EV4 : l'unite de calcul flottant est legerement amelioree, et les caches sont de 16Ko. (Note : Neal Crook a indique dans un courrier separe que les modifications de l'unite de calcul flottant ameliorent les performances de la division. La FPU de l'EV4 prend 34 cycles pour une division en simple precision et 63 cycles pour une division en double- precision (quelles que soient les donnees). En comparaison, le FPU de l'EV45 prend generalement 19 cycles (34 au pire) pour la simple precision et 29 cycles (63 au pire) pour la double-precision (en fonction des donnees).) La base EV5 est un noyau quadruple-ecoulement, egalement super- pipeline etc etc. Il a des caches de 8 Ko etroitement couples, un de pour les instructions et un pour les donnees. Ces caches sont en ecriture immediate. Il dispose egalement d'un cache de deuxieme niveau de 96 Ko sur le processeur (le Scache) qui est associatif 3-morceaux et en ecriture differee ("write back"). Le gain de performance de l'EV4 a l'EV5 est superieur au seul gain genere par l'augmentation de la frequence. En plus des caches plus grands et du quadruple- ecoulement, il y a aussi des ameliorations de sa microarchitecture pour reduire les temps d'attente producteur/consommateur dans certaines voies. La base EV56 est fondamentalement la meme microarchitecture que l'EV5, mais ajoute quelques nouvelles instructions pour la lecture et l'ecriture sur 8 et 16 bits (cf. section ``Les octets et leur multiples''). Elles sont principalement destinees aux pilotes de peripheriques. La base EV56 est realisee en CMOS6, en 2,0 Volts. Le 21064 a ete annonce en mars 1992. Il utilise la base EV4, avec un bus de 128 bits. L'interface du bus supporte une connexion 'facile' d'un cache externe de deuxieme niveau, avec une taille de bloc de 256 bits (2 fois la taille du bus). La vitesse de ce Bcache est entierement configurable logiciellement. Le 21064 peut aussi etre configure pour utiliser un bus externe de 64 bits (mais je crois qu'aucun systeme n'utilise ce mode). Le 21064 n'impose aucune contrainte sur le Bcache, mais il est generalement configure en ecriture differee. Le 21064 contient un systeme permettant a du materiel separe de maintenir la coherence entre le Bcache et le cache interne, mais c'est complexe. Le 21066 utilise la base EV4 et integre un controleur de memoire et un pontage de bus PCI. Pour economiser des broches, le controleur de memoire a un bus de 64 bits (mais les caches internes ont une taille de bloc de 256 bits, comme le 21064, donc une lecture de bloc prend 4 cycles du bus). Le controleur de memoire supporte le BCache et la DRAM externe. La vitesse du Bcache et de la DRAM est entierement configurable logiciellement, et peut etre controle a la vitesse du processeur. La decomposition en 4 acces pour remplir un bloc de cacte n'est pas si mauvais qu'on peut le penser parce que l'acces a la DRAM est fait en mode page. Malheureusement, le controleur de memoire ne supporte ni les types de DRAM esoterique (SDRAM, EDO ou BEDO), ni les RAMs de cache synchrone. L'interface du bus PCI est entierement compatible avec PCI 2.0 et tourne jusqu'a 33 MHz. Le 21164 a un bus de donnees de 128 bits et supporte les lectures partielles, avec jusqu'a deux lectures en cours en meme temps (ce qui permet une utilisation a 100% du bus de donnees dans les meilleures conditions de reve, i.e. il est possible theoriquement de transferer 128 bits de donnees a chaque cycle du bus). Le 21164 supporte une connexion facile d'un cache de troisieme niveau (Bcache) et a tout le systeme pour permettre a du materiel externe de maintenir la coherence de tous les caches. De cette facon, les conceptions de multiprocesseur symetrique sont 'faciles'. Le 21164A a ete annonce en octobre 1995. Il utilise la base EV56. Son brochage est compatible avec celui du 21164, mais necessite des lignes d'alimentation separees ; toutes les broches qui etaient +3,3 Volts sur le 21164 ont ete divisees en deux groupes ; un groupe fournit 2,0 Volts au coeur du processeur, l'autre fournissant 3,3 Volts aux unites d'entrees/sorties. Contrairement aux anciennes conceptions, les broches du 21164A n'acceptent pas 5 Volts. Le resultat de ce changement est que les systemes 21164 ne peuvent en general pas etre mis a jour en 21164A (bien qu'il soit relativement simple de concevoir un systeme 21164A qui puisse aussi accepter un 21164). Le 21164A dispose egalement de quelques nouvelles broches pour supporter les lectures et ecritures sur 8 et 16 bits. Il ameliore egalement le support du 21164 pour les SRAMs synchrones qui composent le Bcache. 44.. PPeerrffoorrmmaanncceess ccoommppaarreeeess dduu 2211006644 eett dduu 2211006666 Le 21064 et le 21066 ont la meme base (EV4). Si le meme programme tourne sur un 21064 et un 21066, a la meme frequence, alors la difference de performance provient uniquement de la bande passante entre le Bcache et la memoire. Du code qui tombe principalement dans les caches _i_n_t_e_r_n_e_s tournera aussi rapidement. Il y a 2 principaux tueurs de performances : 1. Du code qui ecrit enormement. Malgre les buffers en ecriture du 21064 et du 21066 pour economiser certains delais, du code qui ecrit enormement sera etrangle par la bande passante en ecriture du bus systeme. Cela est du au fait que les cache du processeur sont en ecriture immediate. 2. Du code qui veut traiter les flottants en tant qu'entiers. L'architecture Alpha ne permet pas des transferts entre registres entiers et registres flottants. Une telle conversion doit etre faite en memoire (Et du coup, puisque les caches du processeur sont en ecriture immediate, via le Bcache). (Note : il semble que l'EV4 et l'EV45 peuvent effectuer la conversion via le premier cache de donnees (Dcache), a partir du moment ou la memoire est cachee. Dans ce cas, l'ecriture faite par la sequence de conversion mettra a jour le Dcache et la lecture qui va suivre sera, dans certaines circonstances, capable de lire la valeur du Dcache, evitant un couteux transfert depuis le Bcache. En particulier, il semble meilleur d'executer les instructions stq/ldt ou stt/ldq dos a dos, ce qui est plutot contraire a l'intuition.) Si vous effectuez la meme comparaison entre un 21064A et un 21066A, il y a un facteur supplementaire du aux differentes tailles des Icache et Dcache entre les deux processeurs. Maintenant, le 21164 resoud ces deux problemes : il atteint des _b_i_e_n meilleures bandes passantes du bus systeme (malgre le meme nombre de broches de signal - oui, je _s_a_i_s que c'est a peu pres deux fois plus qu'un 21064, mais les supplementaires sont l'alimentation et la masse ! (oui, reellement!!)) et il a des caches en ecriture differee. Le seul probleme restant est la reponse a la question "combien il coute ?" 55.. QQuueellqquueess nnootteess ssuurr lleess ffrreeqquueenncceess Tous les processeurs Alpha actuels utilisent des horloges a haute vitesse, parce que leur microarchitecture a ete concue comme "en cycles courts". Cependant, du coup, aucun des bus systemes n'a besoin de tourner a de telles vitesses : +o sur les 21066(A), 21064(A) et 21164 la vitesse du cache externe (Bcache) est entierement programmable, a la resolution de l'horloge du processeur. Par exemple, pour un processeur a 275 MHz, le temps d'acces en lecture du Bcache peut etre controle avec une resolution de 3,6 ns. +o sur les 21066(A), la vitesse des DRAM est entierement programmable, a la resolution de l'horloge du processeur (_p_a_s celle du bus PCI). +o sur les 21064(A) et 21164(A), la frequence du bus systeme est un sous-multiple de cele du processeur. La plupart des cartes meres 21064 utilisent une horloge du bus systeme a 33 MHz. +o Le systemes a base de 21066 peuvent faire tourner le bus PCI a n'importe quelle frequence par rapport au processeur. En general, le bus PCI tourne a 33 MHz. +o Les systemes qui utilisent les chipset APECS (cf. section ``'') ont toujours la frequence du bus processeur egale a celle du bus PCI. Cela signifie que les deux bus tendent a tourner soit a 25 MHz, soit a 33 MHz (puisque ce sont les frequences qui sont sous- multiples de celle du processeur). Sur les systemes APEC, la vitesse du controleur de DRAM est programmable logiciellement en fonction de la frequence du bus processeur. NNoottee:: quelqu'un a suggere qu'il obtenait de mauvaises performances sur un systeme 21066 parce que le controleur de memoire du 21066 ne tourne qu'a 33 MHz. En fait, ce sont soulement les systemes super-rapides 21064A qui ont des controleurs de memoire qui tournent 'seulement' a 33 MHz. 66.. LLeess cchhiippsseett DS vend deux chipsets de support processeur. Le chipset 2107x (denomme APECS) supporte les 21064(A). Le chipset 2117x (denomme ALCOR) supporte les 21164. Il y aura aussi un chipset 2117xA (denomme ALCOR 2) qui supportera le 21164A. Ces deux chipsets fournissent des controleurs de memoire et des pontages PCI pour leur processeur. APECS fournit un pontage PCI de 32 bits, ALCOR fournit un pontage PCI de 64 bits qui (conformement a la specification PCI) peut supporter des peripheriques PCI aussi bien 32 bits que 64 bits. APECS consiste en 6 puces de 208 broches (4 registres de 32 bits (DECADE), 1 controleur systeme (COMANCHE), 1 controleur PCI (EPIC)). Il fournit un controleur de DRAM (bus memoire de 128 bits) et une interface PCI. Il effectue egalement tout le travail de maintien de la coherence quand un peripherique PCI effectue une operation DMA vers (ou depuis) la memoire. ALCOR consiste en 5 puces (4 registres de 64 bits (Data Switch, DSW) 208 broches PQFP et 1 controleur (Control, I/O Address, CIA) - un boitier plastique de 383 broches). Il fournit un controleur de DRAM (bus memoire de 256 bits) et une interface PCI. Il effectue egalement tout le travail de maintion de coherence quand un peripherique PCI effectue une operation DMA vers (ou depuis) la memoire. Il n'existe pas de chipset supportant le 21066, puisque le controleur de memoire et le pontage PCI sont integres dans le processeur. 77.. LLeess ssyysstteemmeess Le groupe applications de DS produit des exemples de conceptions utilisant les processeurs et leurs chipsets associes. Il s'agit typiquement de cartes meres de format PC-AT, avec toutes les fonctionnalites que vous trouverez typiquement sur une carte mere Pentium haut de gamme. Initialement, ces exemples de conception etaient destines a etre utilises comme point de depart pour des tierces parties pour concevoir des cartes meres. Ces conceptions de premiere generation furent nommees Evaluation Boards (EB). Comme la quantite de travail necessaire pour concevoir une carte mere a augmente (a cause de la montee en frequence des processeurs et pour respecter les regles sur l'emission de frequences radio) l'accent a ete mis sur la conception de cartes meres utilisables pour une production en masse. Les groupes systeme de Digital ont produit plusieurs generations de machines a base de processeurs Alpha. Certains de ces systemes utilisent des chipsets concues par les groupes systeme, d'autres utilisent les chipsets de DS. Dans certains cas, les systemes utilisent une combinaison des deux. Plusieurs tierces parties ont construit des systemes a base de processeurs Alpha. Certaines de ces entreprises ont concu leurs systemes a partir de zero, d'autres ont utilise les chipsets de DS, ou ont copie/modifie les exemples de conception de DS, ou simplement assemblent leurs systemes a partir des cartes fabriquees et verifiees par DS. L'EB64 : Conception obsolete utilisant un 21064 avec un controleur de memoire implemente en logique programmee. Entrees/Sorties realisees par de la logique programmee pour s'interfacer a un chipset de pontage 486<->ISA. Ethernet, SuperI/O (2S, 1P, LD) integre sur la carte mere, bus ISA. Taille PC-AT. Alimentation standard PC. L'EB64+ : Utilise un 21064 ou un 21064A, et un APECS. Bus ISA et PCI (3 emplacements ISA, 2 emplacements PCI, une paire sur un emplacement partage). Supporte des SIMMs de DRAM 36 bits. Le bus ISA est gere par un chipset de pontage Intel Saturn. Controleur SCSI (NCR 810 PCI), ethernet (Digital 21040), controleur clavier et souris (PS/2), SuperI/O (2S, 1P, LD), memoire CMOS et horloge sur la carte mere. ROM de demarrage en EPROM. Taille PC-AT. Alimentation standard PC. L'EB66 : Utilise un 21066 ou un 21066A. Le sous-systeme d'entrees sorties est identique a celui de l'EB64+. Taille baby PC-AT. Alimentation standard PC. Les schemas de l'EB66 furent publies dans des publicites vantant le 21066 comme "le premier microprocesseur au monde avec PCI integre" (pour les amateurs d'anecdotes : il y a deux versions de cette publicite - j'ai dessine les circuits et ecrit le boniment dans la premiere version, et des americains ont malmene le boniment pour la deuxieme version) L'EB164 : Utilise un 21164 et ALCOR. Bus ISA et PCI (3 emplacements ISA, 2 emplacements PCI 64 bits (dont un partage avec un emplacement ISA) et 2 emplacements PCI 32 bits). Emplacement SIMM pour le Bcache. Le sous-systeme d'entrees sorties fournit un controleur SuperI/O (2S, 1P, LD), un controleur clavier et souris (PS/2), memoire CMOS et horloge. ROM de demarrage en memoire flash. Taille PC-AT. Necessite une alimentation en 3,3 Volts. L'AlphaPC64 (aussi nommee Cabriolet) : derive de l'EB64+ mais desormais en taille baby PC-AT avec une ROM de demarrage en flash, et plus de controleur SCSI et ethernet sur la carte mere. 3 emplacements ISA, 4 emplacements PCI (dont un partage avec un emplacement ISA), emplacement SIMM pour le Bcache. Necessite une alimentation en 3,3 Volts. L'AXPpci33 (aussi nommee NoName), est basee sur l'EB66. Cette conception est produite par le groupe technique OEM de Digital (TOEM). A base d'un processeur 21066 tournant a 166 MHz ou 233 MHz. Taille baby PC-AT, necessite une alimentation standard PC. 5 emplacements ISA et 3 emplacements PCI (dont un partage avec un emplacement ISA). Il existe deux versions, avec un connecteur soit PS/2, soit DIN pour le clavier. D'autres cartes meres a base de 21066 : la plupart, sinon toutes, disponibles sur le marche sont basees sur l'EB66 - il n'y a pas beaucoup d'options dans la conception d'un systeme 21066, parce que tout le controle est fait par les puces. Multia (aussi nomme Universal Desktop Box) : il s'agit d'un systeme boitier bureau tres compact a base de 21066. Il comporte deux ports PCMCIA, une carte graphique 21030 (TGA), une carte ethernet 21040 et un controleur SCSI NCR 810, ainsi qu'un lecteur de disquettes, 2 port serie et un port parallele. Ses capacites d'extension sont limitees (un emplacement PCI) a cause de sa petite taille (il y a en plus des restrictions sur l'utilisation de l'emplacement PCI, dont je ne me souviens plus). (Notez que des Multia a base de 21066A ou de Pentium sont aussi disponibles). DEC PC 150 AXP (aussi nomme Jensen) : c'est un tres vieux systeme Digital - l'un des systemes Alpha de premiere generation. Il n'est mentionne ici que parce qu'un certain nombre de ces systemes semblent etre disponibles sur le marche de l'occasion. Le Jensen est un systeme grande tour qui utilise un 21064 a 150 MHz (des versions plus recentes utiliserent des processeurs plus rapides mais je ne suis pas sur des vitesses). Il utilisait de la logique programmee pour interfacer le processeur a un pontage 486<->EISA. D'autres systemes a base de 21064(A) : il existe encore 3 ou 4 autres conceptions de cartes mere (sans compter les _s_y_s_t_e_m_e_s Digital) et tous ceux que je connais sont derives de l'EB64+. Parmi ceux-ci : +o EB64+ (certains vendeurs l'ont assemble et vendu sans modifications); taille AT. +o Carte mere Aspen Systems : derivee de l'EB64+ ; taille baby AT. +o Carte serveur Aspen Systems : beaucoup d'emplacements PCI (inclut un pontage PCI). +o AlphaPC64 (aussi nommee Cabriolet), taile baby AT. D'autres systemes a base de 21164(A) : le seul que je connaisse qui ne soit pas un simple clone d'un EB164 est un systeme de DeskStation. Ce systeme est construit avec un controleur de memoire et d'entrees/sorties proprietaire de DeskStation. Je ne sais pas quelle est leur attitude vis-a-vis de Linux. 88.. LLeess oocctteettss eett lleeuurr mmuullttiipplleess Quand l'architecture Alpha fut presentee, elle etait unique par rapport aux autres architectures RISC en empechant les lectures et ecritures sur 8 et 16 bits. Elle supportait les lectures et ecritures sur 32 et 64 bits (mot long et quadruple mot, dans la terminologie Digital). Les co-architectes (Dick Sites et Rich Witek) justifiaient ce choix par ces avantages : 1. Le support des octets dans le cache et le sous-systeme memoire tend a ralentir les acces pour les quantites de 32 et 64 bits. 2. Le support des octets rend difficile la creation d'un circuit de correction d'erreur haute-vitesse dans le cache et le sous-systeme memoire. L'Alpha compense par de puissantes instructions pour la manipulation des octets et des groupes d'octets dans les registres de 64 bits. Les tests de performances standard pour les operations sur les chaines de caracteres (par exemples, certains tests de Byte) montrent que l'Alpha se comporte tres bien pour la manipulation des octets. L'absence de lectures et ecritures sur octet a des repercussions sur certains semaphores logiciels et sur la conception des sous-systemes d'entrees/sorties. La solution de Digital au probleme des entrees/sorties est d'utiliser certaines lignes d'adresse de bas niveau pour specifier la taille des donnees pendant les transferts de donnees, et de les decoder en masque d'octets. Cet adressage denomme "adressage clairseme" gache une partie de l'espace d'adressage et rend l'espace d'entrees/sorties non contigue (j'en dirais plus sur cet adressage clairseme quand j'aurai fini par l'ecrire). Notez que l'espace d'entrees/sorties, dans ce contexte, se refere a toutes les ressources presentes sur le bus PCI et comprend aussi bien l'espace memoire PCI que l'espace d'entrees/sorties PCI. Avec l'apparition du 21164A, l'architecture Alpha a ete etendue pour inclure l'adressage des octets. L'execution des nouvelles instructions sur un processeur plus ancien declenchera une exception PALcode OPCDEC, pour que le PALcode puisse gerer cet acces. Cela aura une incidence sur les performances. Les ramifications de ceci font que l'utilisation de ces instructions devraient (a mon humble avis) etre limitee aux pilotes de peripheriques plutot qu'aux applications. Ces nouvelles possibilite de lecture et ecriture au niveau octet signifient que de futurs chipsets pourront supporter un espace d'entrees/sorties contigue. 99.. LLee PPAALLccooddee Cet emplacement est destine a une section expliquant le PALcode. Je l'ecrirai s'il y a suffisemment d'interet. 1100.. PPoorrttaabbiilliittee La possibilite de faire tourner Linux sur n'importe quelle machine Alpha est generalement limitee par votre possibilite d'obtenir des informations sur les details sanglants de ses arcanes. Puisque des portages de Linux existent pour les cartes meres EB66, EB64+ et EB164, tous les systemes bases sur les 21066, 21064/APECS et 21164/ALCOR devraient pouvoir faire tourner Linux avec tres peu voire aucune modification. La principale difference entre toutes ces cartes meres est la facon dont elles diffusent les interruptions. Il y a trois sources d'interruptions : +o peripheriques integres +o peripheriques PCI +o peripheriques ISA Tous les systemes utilisent un systeme de pontage d'entrees/sorties (SIO) Intel en tant que pontage entre les bus PCI et ISA (le bus principal est PCI, le bus ISA est un bus secondaire utilise pour supporter les peripheriques anciens ou basse vitesse). Le SIO contient la traditionnelle paire de 8259 chaines. Certains systemes (par exemple le NoName) diffusent leurs interruptions via le SIO vers le processeur. Certains systemes ont un controleur d'interruptions separe et diffusent toutes les interruptions PCI plus l'interruption SIO (sortie du 8259) via ce controleur, et toutes les interruptions ISA via le SIO. Les autres differences entre ces systemes comprennent : +o de combien d'emplacements ils disposent +o quels sont les peripheriques PCI integres +o si la ROM de demarrage est en memoire flash ou en EPROM 1111.. PPlluuss dd''iinnffoorrmmaattiioonnss Toutes les conceptions de cartes d'evaluation et de cartes meres de DS sont libres de droits et la documentation complete pour une conception coute environ 50$ (300FF). Cela comprend tous les schemas, les sources des parties programmees, les feuilles d'informations du processeur et du chipset. Les kits de documentation sont disponibles aupres des distributeurs de Digital Semiconductor. Je ne suggere pas de vous precipiter aller l'acheter, mais je veux faire remarquer que ces informations sont disponibles. J'espere que cela vous a ete utile. Les commentaires, mises a jour, suggestions d'extension sont a envoyer a Neal Crook . 1122.. RReeffeerreenncceess [1] Bill Hamburgen, Jeff Mogul, Brian Reid, Alan Eustace, Richard Swan, Mary Jo Doherty, and Joel Bartlett. _C_h_a_r_a_c_t_e_r_i_z_a_t_i_o_n _o_f _O_r_g_a_n_i_c _I_l_l_u_m_i_n_a_t_i_o_n _S_y_s_t_e_m_s. DEC WRL, Technical Note 13, April 1989.