OSCR

Wafer-scale SOT-MRAM for analog crossbar array applications.

Code ↔ Paper

6 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 6 matches
  1. [1] § RESULTS AND DISCUSSION ↔ stoch_train/train_modules.py, lines 74–223 · score 0.61 · binary weight, PyTorch, Adam, gradient, single device, optimizer
  2. [2] § RESULTS AND DISCUSSION ↔ simulator/parameters/xbar_parameters.py, lines 410–428 · score 0.58 · standard deviation, proportional devices, device conductance, generic, matching, noise
  3. [3] § RESULTS AND DISCUSSION ↔ simulator/parameters/xbar_parameters.py, lines 410–428 · score 0.57 · conductance error, ideal devices, device conductance, deviations, matches, noise
  4. [4] § RESULTS AND DISCUSSION ↔ applications/dnn/inference/interface/inference_net.py, lines 180–222 · score 0.56 · parasitic resistance, proportional devices, proportional noise, generic, bits, modeled
  5. [5] § RESULTS AND DISCUSSION ↔ stoch_train/plot_varswitch_power.py, lines 220–248 · score 0.55 · switching energy, pulse length, Intersections, tail, fit, voltage
  6. [6] § RESULTS AND DISCUSSION ↔ stoch_train/optdigits_keras/keras_infmain.py, lines 78–137 · score 0.50 · training images, 0–100 %, Adam, split, optimizer, validation

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 453 lines · 18 KB · BSD-3-Clause · 2 matches

  1. #
  2. # Copyright 2017 National Technology & Engineering Solutions of Sandia, LLC
  3. # (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government
  4. # retains certain rights in this software.
  5. #
  6. # See LICENSE for full license details
  7. #
  8. from __future__ import annotations
  9. from dataclasses import dataclass
  10. from enum import IntEnum
  11. from typing import Any
  12. from .base_parameters import BaseParameters, BasePairedParameters
  13. class ADCRangeLimits(IntEnum):
  14. """Defines how ADC range limits are used.
  15. "CALIBRATED" : ADC min and max are specified manually
  16. "MAX" : ADC limits are computed to cover the max possible range of ADC inputs,
  17. given the size of the array
  18. "GRANULAR" : ADC limits are computed so that the ADC level spacing is the minimum
  19. possible separation of two ADC inputs given the target resolution of weights.
  20. Assumes input bit slicing is used (with 1-bit DACs).
  21. """
  22. CALIBRATED = 1
  23. MAX = 2
  24. GRANULAR = 3
  25. @dataclass(repr=False)
  26. class XbarParameters(BaseParameters):
  27. """Parameters that describe the behavior of the crossbar (xbar).
  28. Attributes:
  29. device (DeviceParameters): Parameters for the device used
  30. array (ArrayParameters): Parameters for the array
  31. adc (PairedADCParameters): Parameters for the ADC
  32. dac (PairedDACParameters): Parameters for the DAC
  33. Raises:
  34. ValueError: Raised if per input bit slicing improperly configured
  35. ValueError: Raised if gate input mode used without input bit slicing
  36. """
  37. # Using field default factory to avoid isssues with declar
  38. device: DeviceParameters = None
  39. array: ArrayParameters = None
  40. adc: PairedADCParameters = None
  41. dac: PairedDACParameters = None
  42. def validate(self) -> None:
  43. super().validate()
  44. if (self.adc.mvm.adc_per_ibit and not self.dac.mvm.input_bitslicing) or (
  45. self.adc.vmm.adc_per_ibit and not self.dac.vmm.input_bitslicing
  46. ):
  47. raise ValueError(
  48. "ADC per input bit (adc_per_ibit) requires input bit slicing",
  49. )
  50. if self.array.parasitics.gate_input and not self.dac.mvm.input_bitslicing:
  51. raise ValueError("Gate input mode can only be used with input bit slicing")
  52. @dataclass(repr=False)
  53. class DeviceParameters(BaseParameters):
  54. """Parameters that describe device behavior.
  55. Attributes:
  56. cell_bits (int): Programmable bit resolution of device conductance
  57. Rmin (float): Minimum programmable resistance of the device in ohms
  58. Rmax (float): Maximum programmable resistance of the device in ohms
  59. infinite_on_off_ratio (bool): Whether to assume infinite conductance
  60. On/Off ratio. If True, simulates the case of infinite Rmax.
  61. read_noise (WeightErrorParameters): Parameters for device read noise
  62. programming_error (WeightErrorParameters): Parameters for device
  63. programming error
  64. drift_error (DriftErrorParameters):# Parameters for device conductance drift
  65. Returns:
  66. _type_: _description_
  67. """
  68. cell_bits: int = 0
  69. Rmin: float = 1000
  70. Rmax: float = 10000
  71. time: int | float = 0
  72. infinite_on_off_ratio: bool = False
  73. clip_conductance: bool = False
  74. read_noise: WeightErrorParameters = None
  75. programming_error: WeightErrorParameters = None
  76. drift_error: WeightErrorParameters = None
  77. def validate(self) -> None:
  78. super().validate()
  79. # if self.cell_type is not DeviceType.NONE:
  80. # if self.read_noise.model is not WeightErrorModel.NONE:
  81. # self.read_noise.model = value.name
  82. # if self.programming_error.model is not WeightErrorModel.NONE:
  83. # self.programming_error.model = value.name
  84. # if self.drift_error.model is not WeightErrorModel.NONE:
  85. # self.drift_error.model = value.name
  86. @property
  87. def Gmin_norm(self) -> float:
  88. # Return the minimum programmable conductance of the device, normalized
  89. # by the maximum programmable conductance
  90. gmin_norm = 0.0
  91. if not self.infinite_on_off_ratio:
  92. gmin_norm = self.Rmin / self.Rmax
  93. return gmin_norm
  94. @property
  95. def Gmax_norm(self) -> float:
  96. # Return the maximum programmable conductance normalized by itself, which is
  97. # 1 by definition
  98. return 1
  99. @property
  100. def Grange_norm(self) -> float:
  101. # Return the difference between the max and min programmable resistance,
  102. # normalized by the max programmable resistance
  103. return self.Gmax_norm - self.Gmin_norm
  104. @dataclass(repr=False)
  105. class ArrayParameters(BaseParameters):
  106. """Parameters to desribe the behavior of the array.
  107. Attributes:
  108. Icol_max (float): Maximum current in a column, in units of the maximum current
  109. that can be drawn by a single device in the array. Any column current that
  110. exceeds (-Icol_max, +Icol_max) will be clipped to these bounds
  111. parasitics (ParasiticsParameters): Parameters for array parasitics
  112. """
  113. Icol_max: float = 0
  114. parasitics: ParasiticParameters = None
  115. # NOTE why are PairedADCParameters and PairedDACParameters separate?
  116. @dataclass(repr=False)
  117. class PairedADCParameters(BasePairedParameters):
  118. """Pairs ADC parameters for MVM and VMM operations.
  119. Attributes:
  120. _match (bool): Whether to sync mvm and vmm parameters
  121. mvm (ADCParameters): ADC parameters for mvm operations
  122. vmm (ADCParameters): VMM parameters for vmm operations
  123. """
  124. _match: bool = True
  125. mvm: ADCParameters = None
  126. vmm: ADCParameters = None
  127. # TODO: ADC type changer for 3.0, will be replaced in 3.1
  128. def _change_adc_type(self):
  129. if (
  130. self.mvm.model == "RampADC"
  131. or self.mvm.model == "SarADC"
  132. or self.mvm.model == "PipelineADC"
  133. or self.mvm.model == "CyclicADC"
  134. ):
  135. if self.mvm.model == "RampADC":
  136. new_mvm = RampADCParameters()
  137. elif self.mvm.model == "SarADC":
  138. new_mvm = SarADCParameters()
  139. elif self.mvm.model == "PipelineADC" or self.mvm.model == "CyclicADC":
  140. new_mvm = PipelineADCParameters()
  141. new_mvm.update(self.mvm.as_dict())
  142. new_mvm._parent = self
  143. self.mvm = new_mvm
  144. if self._match:
  145. self.vmm = self.mvm
  146. else:
  147. new_mvm = ADCParameters()
  148. for k in new_mvm.as_dict().keys():
  149. setattr(new_mvm, k, getattr(self.mvm, k))
  150. new_mvm._parent = self
  151. self.mvm = new_mvm
  152. if self._match:
  153. self.vmm = self.mvm
  154. if not self._match:
  155. if (
  156. self.vmm.model == "RampADC"
  157. or self.vmm.model == "SarADC"
  158. or self.vmm.model == "PipelineADC"
  159. or self.vmm.model == "CyclicADC"
  160. ):
  161. if self.vmm.model == "RampADC":
  162. new_vmm = RampADCParameters()
  163. elif self.vmm.model == "SarADC":
  164. new_vmm = SarADCParameters()
  165. elif self.vmm.model == "PipelineADC" or self.vmm.model == "CyclicADC":
  166. new_vmm = PipelineADCParameters()
  167. new_vmm.update(self.vmm.as_dict())
  168. new_vmm._parent = self
  169. self.vmm = new_vmm
  170. else:
  171. new_vmm = ADCParameters()
  172. for k in new_vmm.as_dict().keys():
  173. setattr(new_vmm, k, getattr(self.vmm, k))
  174. new_vmm._parent = self
  175. self.vmm = new_vmm
  176. @dataclass(repr=False)
  177. class PairedDACParameters(BasePairedParameters):
  178. """Pairs DAC parameters for MVM and VMM operations.
  179. Attributes:
  180. _match (bool): Whether to sync mvm and vmm parameters
  181. mvm (DACParameters): DAC parameters for mvm operations
  182. vmm (DACParameters): VMM parameters for vmm operations
  183. """
  184. _match: bool = True
  185. mvm: DACParameters = None
  186. vmm: DACParameters = None
  187. @dataclass(repr=False)
  188. class ADCParameters(BaseParameters):
  189. """Parameters for the behavior of the analog-to-digital converter used to digitize
  190. the analog MVM/VMM outputs from the array.
  191. Attributes:
  192. model (str): name of the ADC model. This must match the name of a child class
  193. of IADC, other than "ADC"
  194. bits (int): bit resolution of the ADC digital output
  195. stochastic_rounding (bool): whether to probabilistically round an ADC input
  196. value to one of its two adjacent ADC levels, with a probability set by the
  197. distance to the level. If False, value is always rounded to the closer
  198. level.
  199. adc_per_ibit (bool): whether to digitize the MVM result of each input bit
  200. slice. This is only used if input_bitslicing = True in the associated
  201. DACParameters. If False, it is assumed by shift-and-add accumulation of
  202. input bits is done using analog peripheral circuits and only the final
  203. result is digitized.
  204. calibrated_range (list): the manually specified ADC min and max. This is only
  205. used if adc_range_option = ADCRangeLimits.CALIBRATED. If not using BITSLICED
  206. core, this must be a 1D array of length 2. If using BITSLICED core, this
  207. must be a 2D array with shape (num_slices, 2) that stores the ADC min/max
  208. for each bit slice of the core.
  209. adc_range_option (ADCRangeLimits): Which method is used to set ADC range limits
  210. Raises:
  211. ValueError: Raised if granular ADC is enabled with incompatible options
  212. """
  213. model: str = "IdealADC"
  214. bits: int = 0
  215. signed: bool = True
  216. stochastic_rounding: bool = False
  217. adc_per_ibit: bool = False
  218. calibrated_range: list = None
  219. adc_range_option: ADCRangeLimits = ADCRangeLimits.CALIBRATED
  220. # TODO: Quick little hack for swapping param objects, just till 3.1 changes
  221. def __setattr__(self, name: str, value: Any) -> None:
  222. super().__setattr__(name, value)
  223. if name == "model":
  224. if self.parent is not self:
  225. self.parent._change_adc_type()
  226. def validate(self) -> None:
  227. super().validate()
  228. if self.adc_range_option is ADCRangeLimits.GRANULAR and not self.adc_per_ibit:
  229. raise ValueError(
  230. "Granular ADC range is only supported for digital input"
  231. "shift and add (adc_per_ibit)",
  232. )
  233. # TODO: Temporary for 3.0
  234. @classmethod
  235. def get_adc_type(cls, model: str):
  236. if model == "RampADC":
  237. return RampADCParameters
  238. elif model == "SarADC":
  239. return SarADCParameters
  240. elif model == "PipelineADC" or model == "CyclicADC":
  241. return PipelineADCParameters
  242. else:
  243. return ADCParameters
  244. @dataclass(repr=False)
  245. class RampADCParameters(ADCParameters):
  246. """Ramp ADC specific non-ideality parameters.
  247. Attributes:
  248. gain_db (float): Open-loop gain in decibels of the operational amplifier at the
  249. output of the capacitive DAC (CDAC) used to generate the voltage ramp
  250. sigma_capacitor (float): Standard deviation of the random variability in the
  251. minimum-sized capacitor in the CDAC, normalized by the minimum capacitance
  252. value.
  253. sigma_comparator (float): Standard deviation of the random variability in the
  254. input offset voltage of the comparator used for ramp comparison. There is a
  255. comparator associated with every array column (MVM) and/or row (VMM). The
  256. offset is normalized by the reference voltage used for the ramp.
  257. symmetric_cdac (bool): Whether to use the symmetric CDAC design that treats the
  258. ADC levels as two's complement signed integers. If False, uses an
  259. alternative CDAC design that treats the ADC levels as unsigned integers.
  260. """
  261. gain_db: float = 100
  262. sigma_capacitor: float = 0.0
  263. sigma_comparator: float = 0.0
  264. symmetric_cdac: bool = True
  265. @dataclass(repr=False)
  266. class SarADCParameters(ADCParameters):
  267. """SAR ADC specific non-ideality parameters.
  268. Attributes:
  269. gain_db (float): Open-loop gain in decibels of the operational amplifier at the
  270. output of the capacitive DAC (CDAC)
  271. sigma_capacitor (float): Standard deviation of the random variability in the
  272. minimum-sized capacitor in the CDAC, normalized by the minimum capacitance
  273. value.
  274. sigma_comparator (float): Standard deviation of the random variability in the
  275. input offset voltage of the comparator. The comparator compares the analog
  276. ADC input to the analog CDAC output during each SAR cycle. There is a
  277. comparator for every group of ADC inputs.
  278. split_cdac (bool): Whether to use the split capacitor CDAC design to reduce the
  279. average size of the capacitor in the CDAC.
  280. group_size (int): Number of ADC inputs that share a SAR unit. Inputs within a
  281. group use the same CDAC and comparator. This corresponds to the number of
  282. grouped columns (MVM) or grouped rows (VMM) of the array.
  283. """
  284. gain_db: float = 100
  285. sigma_capacitor: float = 0.0
  286. sigma_comparator: float = 0.0
  287. split_cdac: bool = True
  288. group_size: int = 8
  289. @dataclass(repr=False)
  290. class PipelineADCParameters(ADCParameters):
  291. """Pipeline/Cycli ADC specific non-ideality parameters.
  292. Attributes:
  293. gain_db (float): Open-loop gain in decibels of the operational amplifier used as
  294. the residue amplifier in a 1.5-bit stage of the pipeline ADC.
  295. sigma_C1 (float): Standard deviation of the random variability in capacitor C1
  296. used to amplify the voltage by 2X in the 1.5-bit switched-capacitor stage.
  297. The amplification factor is (1 + C1/C2), where C1 = C2 in the ideal case.
  298. sigma_C2 (float): Standard deviation of the random variability in capacitor C2
  299. in the 1.5-bit ADC stage, normalized by the nominal value of C2.
  300. sigma_Cpar (float): Standard deviation of the random variability in the
  301. parasitic capacitance at the negative input of the operational amplifier in
  302. the 1.5-bit stage, normalized by the nominal value of C1.
  303. sigma_comparator (float): Standard deviation of the random variability in the
  304. input offset voltage of the comparators used in the 1.5-bit stages.
  305. group_size (int): Number of ADC inputs that share single pipeline ADC and its
  306. random capacitor mismatches and comparator offsets. This corresponds to the
  307. number of grouped columns (MVM) or grouped rows (VMM) of the array.
  308. """
  309. gain_db: float = 100
  310. sigma_C1: float = 0.0
  311. sigma_C2: float = 0.0
  312. sigma_Cpar: float = 0.0
  313. sigma_comparator: float = 0.0
  314. group_size: int = 8
  315. @dataclass(repr=False)
  316. class DACParameters(BaseParameters):
  317. """Parameters for the digital-to-analog converter used to quantize the input signals
  318. that are passed to the array.
  319. Attributes:
  320. model (DACModel): name of the model used to specify quantization behavior. This
  321. must match the name of a child class of IDAC, other than "DAC"
  322. bits (int): bit resolution of the digital input
  323. input_bitslicing (bool): whether to bit slice the digital inputs to the MVM/VMM
  324. and accumulate the results from the different input bit slices using
  325. shift-and-add operations.
  326. sign_bit (bool): whether the digital input is encoded using sign-magnitude
  327. representation with a range that is symmetric around zero
  328. slice_size (int): Default slice size for input bit slicing. Can be overridden
  329. from within the individual cores
  330. Raises:
  331. ValueError: Raised if input bitslicing is enabled with incompatible options
  332. """
  333. model: str = "IdealDAC"
  334. bits: int = 0
  335. input_bitslicing: bool = False
  336. signed: bool = True
  337. slice_size: int = 1
  338. @property
  339. def sign_bit(self):
  340. return self.min < 0
  341. def validate(self) -> None:
  342. super().validate()
  343. if self.input_bitslicing and self.bits == 0:
  344. raise ValueError("Cannot use input bit slicing if inputs are not quantized")
  345. @dataclass(repr=False) # Maybe rename this
  346. class WeightErrorParameters(BaseParameters):
  347. """Parameters for the weight error model used.
  348. Attributes:
  349. enable (bool): Flag to enable adding weight errors
  350. model (WeightErrorModel): Weight error model to use. This must match the name of
  351. a child class of IDevice, other than "Device", "EmptyDevice", and
  352. "GenericDevice"
  353. magnitude (float): Standard deviation of the random conductance error that is
  354. applied either as programming error or read noise when using one of the
  355. generic device models. This is normalized either to either the maximum
  356. device conductance (NormalIndependentDevice) or the target device
  357. conductance (NormalProportionalDevice)
  358. """
  359. enable: bool = False
  360. model: str = "IdealDevice"
  361. magnitude: float = 0
  362. @dataclass(repr=False)
  363. class ParasiticParameters(BaseParameters):
  364. """Parameters to describe behavior of parasitics.
  365. Attributes:
  366. enable (bool): Whether to enable parasitic resistance model. For bit sliced,
  367. this indicates whether parasitics is enabled for ANY of the slices
  368. Rp_row (float): Parasitic resistance of the row metallic interconnects
  369. Rp_col (float): Parasitic resistince of the column metallic interconnects
  370. gate_input (bool): If True, no parasitic voltage drops occur on the input side
  371. regardless of Rp value. This implements the configuration where the input
  372. row or column is connected to the gate of a transistor at every cell.
  373. Because the transistor behaves as a switch, the input signal must be binary.
  374. That means input bit slicing must be enabled
  375. """
  376. enable: bool = False
  377. Rp_row: float = 0
  378. Rp_col: float = 0
  379. gate_input: bool = False
  380. def __post_init__(self):
  381. return super().__post_init__()

xbar_parameters.py at commit 30f5ad1, under BSD-3-Clause · at the source

Overview

Authors: Samuel Liu1,2, Vivian Rogers1,2, Chen-Yu Hu3, Ming-Yuan Song3, Xinyu Bao3, Jean Anne C. Incorvia1,2
  1. Chandra Family Department of Electrical and Computer Engineering, The University of Texas at Austin, Austin, TX, USA
  2. Microelectronics Research Center, The University of Texas at Austin, Austin, TX, USA
  3. Corporate Research, Taiwan Semiconductor Manufacturing Company, Hsinchu, Taiwan
Journal: Science advances, volume 12, issue 35, article eaee6952
Dates: received 11 December 2025; accepted 20 July 2026; published online 28 August 2026; in print August 2026
Type: Research article · Language: English
License: CC BY-NC
Identifiers: DOI 10.1126/sciadv.aee6952 · PMID 42664328 · PMCID PMC13524016 · OpenAlex W7204601326
Open access: gold, a free copy (OpenAlex)
Status: code verified
Journal subjects: Physical and Materials Sciences, Engineering, Applied Sciences and Engineering
Topic: Magnetic properties of thin films (Atomic and Molecular Physics, and Optics, Physics and Astronomy), according to OpenAlex
Funding: Taiwan Semiconductor Manufacturing Corporation
Citations: not cited yet (Europe PMC); 97 references in the paper

Abstract

Analog crossbar arrays consisting of emerging memory devices can alleviate the computational strain required by vector matrix multiplications for neural network applications. The ability to produce spin orbit torque-magnetic random-access memory (SOT-MRAM) at wafer-scale positions SOT-MRAM as a strong memory candidate. In this work, we fabricate and measure 300 mm-compatible SOT-MRAM with 150% tunnel magnetoresistance (TMR) ratio, fast (2 ns) and low voltage (<1 V) operation, low energy dissipation (2 pJ), low write noise (0.1%), and low device-to-device variation of 10%. SOT-MRAM characteristics were shown to be effective for inference on calibrated models. The bi-stable anisotropy and stochastic switching of SOT-MRAM was leveraged for binary neural network training, able to reach ideal accuracy for a single device. Lastly, the devices were evaluated on probabilistic graph modeling and the interplay of TMR ratio and probability distribution is analyzed. Through these results, SOT-MRAM is shown to be a uniquely effective candidate for implementation of crossbar accelerators in memory- and energy-limited applications.

Reproduced under the paper's license (CC BY-NC), from the paper cited above.

Repositories

Its files are read in the Code ↔ Paper reader above, with 6 matches between paragraphs and lines of code.

Zenodo 19510921

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Data, code, and materials availability:”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)

Zenodo 19510936

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Data, code, and materials availability:”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)

liukts/tsmc-sotmram-git

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: eba84ec94894e843b3f1b897227d6cc6fb0f93f2, 1 April 2026
Languages: Python (25)
Size: 340 files, 25 scripts
Software Heritage: not archived
Found in: the Zenodo archive record
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: NumPy (22 files), Matplotlib (14 files), PyTorch (8 files), SciPy (8 files), scikit-learn (2 files), seaborn (2 files), Keras (1 file), TensorFlow (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
26 files

liukts/cross-sim-tsmc

License: BSD-3-Clause
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 30f5ad119b80280a27c3c17e91f65bbc0045b594, 8 April 2026
Languages: Python (99), Jupyter (3), MATLAB (1)
Size: 1,196 files, 103 scripts
Software Heritage: not archived
Found in: the Zenodo archive record
Holds: README, license file, environment (pyproject.toml), documentation, 3 notebooks
Not found: CITATION.cff, tests, continuous integration
Tools: NumPy (59 files), CuPy (23 files), SciPy (23 files), TensorFlow (14 files), Keras (11 files), Matplotlib (11 files), Pillow (5 files), OpenCV (4 files), PyTorch (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
105 files

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 4 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 128 scripts, each with its path and the digest of its content;
  • 6 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

No dataset and no data link were found in the paper.

Data, code, and materials availability

All data and code needed to evaluate and reproduce the results in the paper are present in the paper, in the Supplementary Materials and in the Zenodo repositories (https://doi.org/10.5281/zenodo.19510921 and https://doi.org/10.5281/zenodo.19510936). This study did not generate new materials.

Reproduced under the paper's license (CC BY-NC), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 1 funder, 32 references.

Cite

This paper

Liu, S., Rogers, V., Hu, C.-Y., Song, M.-Y., Bao, X., & Incorvia, J. A. C. (2026). Wafer-scale SOT-MRAM for analog crossbar array applications. Science advances, 12(35), eaee6952. https://doi.org/10.1126/sciadv.aee6952

BibTeX

@article{liu2026wafer,
author = {Liu, Samuel and Rogers, Vivian and Hu, Chen-Yu and Song, Ming-Yuan and Bao, Xinyu and Incorvia, Jean Anne C.},
title = {{Wafer-scale SOT-MRAM for analog crossbar array applications}},
journal = {Science advances},
year = {2026},
month = aug,
volume = {12},
number = {35},
pages = {eaee6952},
publisher = {American Association for the Advancement of Science},
issn = {2375-2548},
doi = {10.1126/sciadv.aee6952},
url = {https://doi.org/10.1126/sciadv.aee6952},
pmid = {42664328},
pmcid = {PMC13524016}
}

RIS

TY - JOUR
AU - Liu, Samuel
AU - Rogers, Vivian
AU - Hu, Chen-Yu
AU - Song, Ming-Yuan
AU - Bao, Xinyu
AU - Incorvia, Jean Anne C.
TI - Wafer-scale SOT-MRAM for analog crossbar array applications
T2 - Science advances
J2 - Sci Adv
PY - 2026
DA - 2026/08/28
VL - 12
IS - 35
SP - eaee6952
SN - 2375-2548
PB - American Association for the Advancement of Science
DO - 10.1126/sciadv.aee6952
UR - https://doi.org/10.1126/sciadv.aee6952
LA - en
ER -

CSL-JSON

{
"id": "10.1126/sciadv.aee6952",
"type": "article-journal",
"title": "Wafer-scale SOT-MRAM for analog crossbar array applications",
"container-title": "Science advances",
"author": [
{
"family": "Liu",
"given": "Samuel"
},
{
"family": "Rogers",
"given": "Vivian"
},
{
"family": "Hu",
"given": "Chen-Yu"
},
{
"family": "Song",
"given": "Ming-Yuan"
},
{
"family": "Bao",
"given": "Xinyu"
},
{
"family": "Incorvia",
"given": "Jean Anne C."
}
],
"container-title-short": "Sci Adv",
"volume": "12",
"issue": "35",
"page": "eaee6952",
"DOI": "10.1126/sciadv.aee6952",
"PMID": "42664328",
"PMCID": "PMC13524016",
"ISSN": "2375-2548",
"publisher": "American Association for the Advancement of Science",
"URL": "https://doi.org/10.1126/sciadv.aee6952",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
28
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: CuPy, Keras, TensorFlow, 8 other tools
[2] doi:10.1038/s41592-026-03057-2 [code]
CREsted: modeling genomic and synthetic cell-type-specific enhancers across tissues and species.
Journal: Nature methods
In common: CuPy, Keras, TensorFlow, 7 other tools
[3] doi:10.1371/journal.pcbi.1014571 [code]
SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.
Journal: PLoS computational biology
In common: Keras, TensorFlow, OpenCV, 7 other tools
[4] doi:10.1364/boe.605322 [code]
Generalized plaque digitization framework for multi-dimensional mesoscopic images.
Journal: Biomedical optics express
In common: Keras, TensorFlow, OpenCV, 7 other tools
[5] doi:10.1038/s41467-026-72057-9 [code]
Sex-specific behavioral feedback modulates sensorimotor processing and drives flexible social behavior.
Journal: Nature communications
In common: Keras, TensorFlow, OpenCV, 7 other tools
[6] doi:10.1038/s41597-025-05174-7 [code]
A large-scale MEG and EEG dataset for object recognition in naturalistic scenes
Journal: n/a
In common: Keras, TensorFlow, OpenCV, 7 other tools
[7] doi:10.1371/journal.pone.0347867 [code]
LiteFeatNet: A parameter-efficient and performance-centric deep learning model for multi-ocular disease identification using intermediate feature reduction from fundus images.
Journal: PloS one
In common: Keras, TensorFlow, OpenCV, 6 other tools
[8] doi:10.1126/sciadv.aed3650 [code]
Truthful visualizations for mass spectrometry imaging enable high-spatial-resolution interactive &lt;i&gt;m/z&lt;/i&gt; mapping and exploration.
Journal: Science advances
In common: Keras, TensorFlow, OpenCV, 6 other tools
[9] doi:10.1093/jnen/nlaf152 [code]
Clinical and pathologic correlations of machine learning quantification of Aβ deposits across 3 brain regions of decedents with Alzheimer disease.
Journal: Journal of neuropathology and experimental neurology
In common: Keras, TensorFlow, OpenCV, 6 other tools
[10] doi:10.1016/j.isci.2026.116825 [code]
Social hierarchy shapes behavioral and transcriptional responses to chronic stress and ketamine in male mice.
Journal: iScience
In common: CuPy, OpenCV, Pillow, 6 other tools

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.