FR 3121261 A1 20220930 FR 2103164 A 20210329 L’invention concerne un dispositif mémoire (100) pourvu d’un tableau de mémoire DRAM (200) et configuré pour prévenir un effet de martelage de rang susceptible de survenir entre les rangs de mémoire formant ledit tableau. Notamment, le dispositif mémoire met en œuvre des compteurs d’activation (Cai) des rangs de mémoire et un bloc logique de rafraîchissement (300) configuré pour initier des rafraîchissements préventifs dès lors qu’un critère associé au comptage du nombre d’activations de chacun des rangs de mémoire est vérifié. Dans le contexte de la présente invention, la portée du martelage de rang est supérieure ou égale à 2 de sorte que la seule comparaison du nombre d’activations de chacun des rangs avec la valeur de martelage critique M ne suffit plus à en prévenir les effets. La présente invention propose d’établir un nouveau critère de comptage basé sur la portée p du martelage de rang. Figur e 1 dispositif mémoire DRAM configuré pour permettre une gestion d’un effet de martelage de rang d’une portée p supérieure ou égale à 2 DOMAINE DE L’INVENTION La présente invention concerne le domaine des mémoires, et notamment le domaine des mémoires à accès aléatoire dynamique. En particulier, la présente invention porte sur la gestion de l’effet de martelage de rang de mémoire (« Row Hammer » selon la terminologie anglo-Saxonne). A cet égard, la présente invention propose une architecture d’un dispositif mémoire permettant de gérer et prévenir l’effet de martelage de rang de mémoire pour des dispositifs mémoire de grande capacité sans pénaliser les performances desdits dispositifs. ARRIERE PLAN TECHNOLOGIQUE DE L’INVENTION L’effet de martelage de rang (« Row Hammer » selon la terminologie Anglo-Saxonne) dans les mémoires à accès aléatoire dynamique (« DRAM » ou « Dynamic Random Access Memory » selon la terminologie Anglo-Saxonne) est bien connu de l’homme du métier. Cet effet trouve son origine dans l’activation répétée d’un rang d’un banc d’une mémoire DRAM. Plus particulièrement, lorsque le nombre d’activations d’un rang donné, dit « rang agresseur », dépasse une valeur de martelage critique M, les rangs qui lui sont immédiatement adjacents, dits « rangs victimes », voient certains de leurs bits inversées. La valeur de martelage critique est, à cet égard, caractéristique du banc de mémoire considéré. Ainsi, le document US 9,685,240 B1 divulgue un dispositif mémoire qui comprend un tableau de mémoire DRAM formé de rangs de mémoire. En particulier, le dispositif mémoire est configuré pour gérer, et notamment prévenir, l’effet de martelage de rang susceptible d’intervenir au sein du tableau de mémoire DRAM. A cette fin, le dispositif comprend une pluralité de compteurs d’activation. Plus particulièrement, chaque compteur d’activation est associé à un rang de mémoire donné, et est configuré pour compter le nombre d’activations dudit rang. Selon cette configuration, dès lors que le nombre d’activations d’un rang atteint la valeur de martelage critique M, les deux rangs de mémoire immédiatement adjacents au rang considéré sont rafraîchis selon un cycle dit de rafraîchissement préventif. Néanmoins, le martelage de rang considéré dans le document US 9,685,240 B1 reste d’une portée limitée aux seuls rangs de mémoire immédiatement adjacents au rang de mémoire « agresseur ». Il est toutefois des situations pour lesquelles un martelage de rang au-delà des seuls rangs immédiatement adjacents à un rang de mémoire « agresseur » est observé. Cet accroissement de la portée de l’effet de martelage de rang est notamment le résultat de la densification, au sein du tableau mémoire, des cellules mémoire. Ainsi, lors de son activation, un rang d’indice topologique i (dit « rang i ») agressera non seulement les deux rangs d’indices topologiques i-1 et i+1 qui lui sont immédiatement adjacents, mais également, et dans une moindre mesure, les rangs i-p à i-2 et les rangs i+2 à i+p, où p désigne la portée du martelage de rang. Le niveau d’agression d’un rang victime i dans le cadre d’un effet de martelage de rang de portée p peut s’exprimer comme la somme pondérée des activations des 2 x p rangs voisins : + (nombre d’activations du rang i-p) x RH_coeff_p + (nombre d’activations du rang i-(p-1)) x RH_coeff_(p-1) + . . . + (nombre d’activations du rang i-2) x RH_coeff_2 + (nombre d’activations du rang i-1) x RH_coeff_1 + (nombre d’activations du rang i+1) x RH_coeff_1 + (nombre d’activations du rang i+2) x RH_coeff_2 + . . . + (nombre d’activations du rang i+(p-1)) x RH_coeff_(p-1) + (nombre d’activations du rang i+p) x RH_coeff_p Aussi dès lors que cette somme atteint une valeur critique de martelage, les données stockées dans le rang i sont susceptibles d’être altérées. La valeur critique de martelage est définie de telle façon que le coefficient (RH_coeff) appliqué pour le nombre d’activations des rangs i-1 et i+1 soit 1, de telle façon que la définition d’un niveau d’agression d’ordre 1 corresponde à la définition habituelle et antérieure du martelage de rang. Bien entendu les coefficients RH_coeff_n deviennent de plus en plus faibles à mesure que l’on s’éloigne du rang martelé. Ainsi, dès lors que la portée p de l’effet de martelage de rang est supérieure ou égale à 2, il est nécessaire, lors de l’activation d’un rang i, non seulement de considérer les agressions subies par les rangs i-1 et i+1 qui lui sont immédiatement adjacents, mais également celles subies par les rangs i-p à i-2 et i+2 à i+p. En d’autres termes, lors de l’activation du rang i, les compteurs d’agression des rangs i-p à i-1 et i+1 à i+p doivent tous être mis à jour. Chacun de ces compteurs doit notamment prendre en compte les coefficients RH_coeff_k (pour k allant de i-p à i-1 et de i+1 à i+p). Ces aspects nécessitent de mettre en œuvre une logique de prévention destinée à mettre à jour un nombre important de compteurs d’agressions qui peut, par voie de conséquence, poser des problèmes de réalisation. Par ailleurs, les dispositifs mémoire connus de l’état de la technique mettent également en œuvre des rafraîchissements dit périodiques, destinés à réécrire les cellules des rangs qui composent lesdits dispositifs afin de prévenir toute perte d’information. Ces rafraichissements périodiques, obligatoires, sont une opportunité pour réduire l’impact en performance des dispositifs de prévention de l’effet de martelage de rang. En effet, le rafraichissement périodique d’un rang i donné, efface l’accumulation d’agressions que ce rang a subies jusqu’alors, de sorte que l’intervalle de temps au cours duquel les agressions peuvent s’accumuler sur un rang donné est donc réduit à l’intervalle séparant deux rafraichissements périodiques de ce rang. En conséquence, il est beaucoup moins facile d’atteindre une valeur critique de martellement dans ce temps réduit que dans un temps illimité où cette occurrence est quasi certaine. Ainsi, dans de nombreux scénarios représentatifs d’accès, une logique de prévention tenant compte des rafraichissements périodiques permet de limiter le nombre de rafraichissements préventifs générés, et donc de limiter l’impact en performance de la prévention de l’effet de martelage de rang. Toutefois, exploiter les rafraichissements périodiques dans un algorithme de prévention d’un effet de martelage d’une portée supérieure ou égale à 2 est complexe. En effet, s’il efface le martelage passé subit par ce rang i, il n’efface aucunement les agressions que ce rang i à fait subir à ces voisins. Par surcroit, un rafraichissement périodique d’un rang donné correspond à une activation dudit rang, et constitue donc une agression supplémentaire de ses voisins Ainsi, un but de la présente invention est de proposer un dispositif mémoire DRAM configuré pour permettre une gestion simple et efficace d’un effet de martelage de rang d’une portée p supérieure ou égale à 2. Un autre but de la présente invention est de proposer un dispositif mémoire permettant de concilier également de manière efficace et simple les rafraîchissements préventifs et les rafraîchissements périodiques dès lors que l’effet de martelage de rang est d’une portée p supérieure ou égale à 2. BREVE DESCRIPTION DE L’INVENTION La présente invention concerne un dispositif mémoire comprenant : - au moins un tableau de mémoire DRAM pourvu de n rangs de mémoires, dits rang i pour i entier variant de 1 à n, chaque rang i étant susceptible d’exercer un martelage de rang de portée p supérieure ou égale à 2, l’effet de martelage de rang étant caractérisé par une valeur de martelage critique M, ladite valeur de martelage critique M étant le nombre d’activations nécessaires d’un rang i pour que ce dernier dégrade l’information contenue dans les rangs i-1 et i+1, le rang i étant également susceptible d’exercer un effet de martelage à l’encontre de ses 2p rangs plus proches voisins, lesdits 2p rangs comprennent un premier groupe de p rangs à des distances topologiques respectives notées k pour k allant de 1 à p, et un deuxième groupe de p rangs à des distances topologiques respectives notées -k, pour k allant de 1 à p, le premier et le deuxième groupe étant disposés, respectivement, de part et d’autre du rang i, l’effet de martelage du rang i à l’encontre d’un rang du premier groupe à une distance topologique k correspondant au produit de M par un coefficient RH_coeff_k, et l’effet de martelage du rang i à l’encontre d’un rang du deuxième groupe à une distance topologique -k correspondant au produit de M par un coefficient RH_coeff_(-k) ; - n compteurs d’activations, dits compteur i associé chacun à un rang i pour i entier allant de 1 à n, chaque compteur i étant configuré pour stocker un comptage i du nombre d’activations du rang i auquel il est associé ; - un bloc logique de rafraîchissement configuré pour protéger l’ensemble des rangs i, pour i allant de 1 à n, contre un effet de martelage de rang par initiation de rafraîchissements préventifs, un rafraîchissement préventif étant initié pour l’ensemble des rangs m pour m entier allant de k-p à k-1 et de k+1 à k+p dès lors que le comptage k, associé au rang k, atteint une valeur M’ inférieure ou égale à M/(RH_coeff_sum), où RH_coeff_sum est la somme de tous les coefficients RH_coeff_k et RH_coeff_(-k) pour k allant de 1 à p. Il est entendu que la distance topologique k ou (-k) au regard d’un rang donné, par exemple le rang i, au regard d’un rang j correspond à la différence entre leurs indexes topologiques i-j. A titre d’exemple, la distance topologique entre un rang i et un rang i-k vaut i-(i-k)=k. De manière équivalente, la distance topologique entre un rang i et un rang i+k vaut i-(i+k)=(-k). Il est également entendu, sans qu’il soit nécessaire de le préciser, qu’au moins l’un des coefficients RH_coeff_1 et RH_coeff_(-1) vaut 1. Selon un mode de réalisation, le bloc logique de rafraîchissement est également configuré pour initier des rafraîchissements périodiques des différents rangs de mémoire. Selon un mode de réalisation, les rafraîchissements périodiques susceptibles d’être initiés par le bloc logique de rafraîchissement sont des rafraîchissements non strictement topologiquement linéaires, et la valeur M’ est égale à (M – (2 x REFp_ACT))/(RH_coeff_sum), où REFp_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REFp_PER, ladite durée REFp_PER étant la durée maximal nécessaire au rafraichissement périodique de p rangs mémoires topologiquement adjacents. A titre d’exemple, la durée REFp_PER peut correspondre au rafraichissement de p rangs mémoire ou plus en fonction du degré de linéarité topologique du rafraichissement périodique. Pour illustrer ce fait, si on considère la séquence de rafraichissement suivante, avec une portée de 3 : - rang 1000 - rang 2000 - rang 1001 - rang 2001 - rang 1002 - rang 2002 REF1_PER étant la durée maximale entre deux rafraichissements périodiques, alors, dans l’exemple considéré, REF3_PER = REF1_PER x 5, car 3 rangs mémoires topologiquement adjacents, 1000, 1001, et 1002, sont rafraichis dans le temps nécessaire pour rafraichir 5 rangs. Selon un mode de réalisation optimisé vis à vis d’un cycle de rafraichissement périodiques strictement topologiquement linéaire, la valeur M’ est égale à M/(RH_coeff_sum) – REF1_ACT, où REF1_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REF1_PER, ladite durée REF1_PER étant est une durée séparant le rafraîchissement de deux rangs de mémoire successifs lors de l’exécution d’un cycle de rafraîchissement périodique. Selon un mode de réalisation, le bloc logique de rafraîchissement est également configuré pour remettre à zéro le comptage i associé à un rang i dès lors que ledit comptage i atteint la valeur M’. Selon un mode de réalisation, le bloc logique de rafraîchissement est également configuré pour remettre à zéro le comptage i associé à un rang i dès lors que ledit rang i est rafraîchi au cours d’un cycle de rafraîchissement périodique. Selon un mode de réalisation, pour i allant de 1 à n, chaque compteur i est configuré pour que le comptage i soit incrémenté d’une unité à chaque nouvelle activation du rang i. Selon un mode de réalisation, chaque rang i, pour i allant de 1 à n, comprend une section de bits destinée à former le compteur i auquel il est associé. Selon un mode de réalisation, ledit dispositif comprend un tableau mémoire auxiliaire, distinct du tableau de mémoire DRAM, formant les compteurs i pour i allant de 1 à n. L’invention concerne également un procédé de protection d’un dispositif mémoire contre l’effet de martelage de rang, le dispositif mémoire comprenant au moins un tableau de mémoire DRAM pourvu de n rangs de mémoires, dits rang i pour i entier variant de 1 à n, chaque rang i étant susceptible d’exercer un martelage rang de portée p strictement supérieure à 1, le dispositif mémoire comprend également n compteurs d’activation, dits compteur i pour i entier allant de 1 à n, chaque compteur i étant configuré pour stocker un comptage i du nombre d’activations du rang i auquel il est associé, l’effet de martelage de rang étant caractérisé par une valeur de martelage critique M, ladite valeur de martelage critique M étant le nombre d’activations nécessaires d’un rang i pour que ce dernier dégrade l’information contenue dans les rangs i-1 et i+1, le rang i étant également susceptible d’exercer un effet de martelage à l’encontre de ses 2p rangs plus proches voisins, lesdits 2p rangs comprennent un premier groupe de p rangs à des distances topologiques respectives notées k pour k allant de 1 à p, et un deuxième groupe de p rangs à des distances topologiques respectives notées -k, pour k allant de 1 à p, le premier et le deuxième groupe étant disposés, respectivement, de part et d’autre du rang i, l’effet de martelage du rang i à l’encontre d’un rang du premier groupe à une distance topologique k correspondant au produit de M par un coefficient RH_coeff_k, et l’effet de martelage du rang i à l’encontre d’un rang du deuxième groupe à une distance topologique -k correspondant au produit de M par un coefficient RH_coeff_(-k) ; le procédé comprenant, dès lors qu’un rang i, parmi les rangs k pour k allant de 1 à n, est activé : - l’incrémentation du comptage i d’une unité ; et si le comptage i atteint une valeur M’, alors : - le comptage i est remis à zéro, et - les rangs i-p à i-1 et les rangs i+1 à i+p sont rafraîchis, la valeur M’ étant inférieure ou égale à M/(RH_coeff_sum), où RH_coeff_sum est la somme de tous les coefficients RH_coeff_k et RH_coeff_(-k) pour k allant de 1 à p. Selon un mode de réalisation, ledit procédé comprend également la mise en œuvre de rafraîchissements périodiques des différents rangs de mémoire. Selon un mode de réalisation, les rafraîchissements périodiques sont des rafraîchissements topologiquement non strictement linéaires et la valeur M’ est égale à (M – (2 x REFp_ACT))/(RH_coeff_sum), où REFp_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REFp_PER, ladite durée REFp_PER étant la durée maximale nécessaire au rafraichissement périodique de p rangs mémoires topologiquement adjacents. Selon un mode de réalisation, les rafraîchissements périodiques sont des rafraîchissements périodiques topologiquement linéaire, et la valeur M’ est égale à M/(RH_coeff_sum) – REF1_ACT, où REF1_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REF1_PER, ladite durée REF1_PER étant est une durée maximale séparant le rafraîchissement périodique de deux rangs de mémoire adjacents. D’autres caractéristiques et avantages de l’invention ressortiront de la description détaillée qui va suivre en référence aux figures annexées sur lesquelles : La une représentation schématique d’un dispositif mémoire selon un premier mode de réalisation conforme à la présente invention ; La une représentation schématique d’un dispositif mémoire selon un deuxième mode de réalisation conforme à la présente invention ; La est une représentation schématique d’une cellule mémoire DRAM susceptible d’être mise en œuvre dans le cadre de la présente invention. Dispositif mémoire (100) comprenant : - au moins un tableau de mémoire DRAM (200) pourvu de n rangs de mémoires, dits rang i (Ri) pour i entier variant de 1 à n, chaque rang i (Ri) étant susceptible d’exercer un martelage de rang de portée p supérieure ou égale à 2, l’effet de martelage de rang étant caractérisé par une valeur de martelage critique M, ladite valeur de martelage critique M étant le nombre d’activations nécessaires d’un rang i (Ri) pour que ce dernier dégrade l’information contenue dans les rangs i-1 et i+1, le rang i (Ri) étant également susceptible d’exercer un effet de martelage à l’encontre de ses 2p rangs plus proches voisins, lesdits 2p rangs comprennent un premier groupe de p rangs à des distances topologiques respectives notées k pour k allant de 1 à p, et un deuxième groupe de p rangs à des distances topologiques respectives notées -k, pour k allant de 1 à p, le premier et le deuxième groupe étant disposés, respectivement, de part et d’autre du rang i (Ri), l’effet de martelage du rang i (Ri) à l’encontre d’un rang du premier groupe à une distance topologique k correspondant au produit de M par un coefficient RH_coeff_k, et l’effet de martelage du rang i (Ri) à l’encontre d’un rang du deuxième groupe à une distance topologique -k correspondant au produit de M par un coefficient RH_coeff_(-k) ; - n compteurs d’activation, dits compteur i (CAi)associé chacun à un rang i (Ri) pour i entier allant de 1 à n, chaque compteur i (CAi)étant configuré pour stocker un comptage i du nombre d’activations du rang i (Ri) auquel il est associé ; - un bloc logique de rafraîchissement (300) configuré pour protéger l’ensemble des rangs i, pour i allant de 1 à n, contre un effet de martelage de rang par initiation de rafraîchissements préventifs, un rafraîchissement préventif étant initié pour l’ensemble des rangs m pour m entier allant de k-p à k-1 et de k+1 à k+p dès lors que le comptage k, associé au rang k, atteint une valeur M’ inférieure ou égale à M/(RH_coeff_sum), où RH_coeff_sum est la somme de tous les coefficients RH_coeff_k et RH_coeff_(-k) pour k allant de 1 à p. Dispositif selon la revendication 1, dans lequel le bloc logique de rafraîchissement (300) est également configuré pour initier des rafraîchissements périodiques des différents rangs de mémoire. Dispositif selon la revendication 2, dans lequel les rafraîchissements périodiques susceptibles d’être initiés par le bloc logique de rafraîchissement (300) sont des rafraîchissements non strictement topologiquement linéaires, et la valeur M’ est égale à (M – (2 x REFp_ACT))/(RH_coeff_sum), où REFp_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REFp_PER, ladite durée REFp_PER étant la durée nécessaire au rafraichissement de p rangs de mémoire topologiquement adjacents. Dispositif selon la revendication 2, dans lequel les rafraîchissements périodiques susceptibles d’être initiés par le bloc logique de rafraîchissement (300) sont des rafraîchissements périodiques topologiquement linéaires, et la valeur M’ est égale à M/(RH_coeff_sum) – REF1_ACT, où REF1_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REF1_PER, ladite durée REF1_PER étant est une durée séparant le rafraîchissement de deux rangs de mémoire successifs lors de l’exécution d’un cycle de rafraîchissement périodique. Dispositif mémoire selon l’une des revendications 2 à 4, dans lequel le bloc logique de rafraîchissement (300) est également configuré pour remettre à zéro le comptage i associé à un rang i (Ri) dès lors que ledit rang i (Ri) est rafraîchi au cours d’un cycle de rafraîchissement périodique. Dispositif mémoire selon l’une des revendications 1 à 5, dans lequel le bloc logique de rafraîchissement (300) est également configuré pour remettre à zéro le comptage i associé à un rang i (Ri) dès lors que ledit comptage i atteint la valeur M’. Dispositif mémoire selon l’une des revendications 1 à 6, dans lequel, pour i allant de 1 à n, chaque compteur i (CAi)est configuré pour que le comptage i soit incrémenté d’une unité à chaque nouvelle activation du rang i (Ri). Dispositif mémoire selon l’une des revendications 1 à 7, dans lequel chaque rang i (Ri), pour i allant de 1 à n, comprend une section de bits destinée à former le compteur i (CAi)auquel il est associé. Dispositif mémoire selon l’une des revendications 1 à 7, dans lequel ledit dispositif comprend un tableau mémoire auxiliaire (TMA), distinct du tableau de mémoire DRAM (200), formant les compteurs i pour i allant de 1 à n. Procédé de protection d’un Dispositif mémoire (100) contre de l’effet de martelage de rang, le Dispositif mémoire (100) comprenant au moins un tableau de mémoire DRAM (200) pourvu de n rangs de mémoires, dits rang i (Ri) pour i entier variant de 1 à n, chaque rang i (Ri) étant susceptible d’exercer un martelage rang de portée p strictement supérieure à 1, le Dispositif mémoire (100) comprend également n compteurs d’activation, dits compteur i (CAi)pour i entier allant de 1 à n, chaque compteur i (CAi)étant configuré pour stocker un comptage i du nombre d’activations du rang i (Ri) auquel il est associé, l’effet de martelage de rang étant caractérisé par une valeur de martelage critique M, ladite valeur de martelage critique M étant le nombre d’activations nécessaires d’un rang i (Ri) pour que ce dernier dégrade l’information contenue dans les rangs i-1 et i+1, le rang i (Ri) étant également susceptible d’exercer un effet de martelage à l’encontre de ses 2p rangs plus proches voisins, lesdits 2p rangs comprennent un premier groupe de p rangs à des distances topologiques respectives notées k pour k allant de 1 à p, et un deuxième groupe de p rangs à des distances topologiques respectives notées -k, pour k allant de 1 à p, le premier et le deuxième groupe étant disposés, respectivement, de part et d’autre du rang i (Ri), l’effet de martelage du rang i (Ri) à l’encontre d’un rang du premier groupe à une distance topologique k correspondant au produit de M par un coefficient RH_coeff_k, et l’effet de martelage du rang i (Ri) à l’encontre d’un rang du deuxième groupe à une distance topologique -k correspondant au produit de M par un coefficient RH_coeff_(-k) ; le procédé comprenant, dès lors qu’un rang i (Ri), parmi les rangs k pour k allant de 1 à n, est activé : - l’incrémentation du comptage i d’une unité ; et si le comptage i atteint une valeur M’, alors : - le comptage i est remis à zéro, et - les rangs i-p à i-1 et les rangs i+1 à i+p sont rafraîchis, la valeur M’ étant inférieure ou égale à M/(RH_coeff_sum), où RH_coeff_sum est la somme de tous les coefficients RH_coeff_k et RH_coeff_(-k) pour k allant de 1 à p. Procédé selon la revendication 10, dans lequel ledit procédé comprend également la mise en œuvre de rafraîchissements périodiques des différents rangs de mémoire. Procédé selon la revendication 11, dans lequel les rafraîchissements périodiques sont des rafraîchissements topologiquement non strictement linéaires et la valeur M’ est égale à (M – (2 x REFp_ACT))/(RH_coeff_sum), où REFp_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REFp_PER, ladite durée REFp_PER étant la durée maximale nécessaire au rafraichissement périodique de p rangs de mémoire topologiquement adjacents. Procédé selon la revendication 11, dans lequel les rafraîchissements périodiques sont des rafraîchissements périodiques topologiquement linéaire, et la valeur M’ est égale à M/(RH_coeff_sum) – REF1_ACT, où REF1_ACT est un nombre maximum d’activations de rangs de mémoire susceptible d’intervenir lors d’une durée REF1_PER, ladite durée REF1_PER étant est une durée maximale séparant le rafraîchissement périodique de deux rangs de mémoire adjacent.