Xyce  6.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
N_DEV_Synapse2.C
Go to the documentation of this file.
1 //-----------------------------------------------------------------------------
2 // Copyright Notice
3 //
4 // Copyright 2002 Sandia Corporation. Under the terms
5 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S.
6 // Government retains certain rights in this software.
7 //
8 // Xyce(TM) Parallel Electrical Simulator
9 // Copyright (C) 2002-2011 Sandia Corporation
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //-----------------------------------------------------------------------------
24 
25 //----------------------------------------------------------------------------
26 // Filename : $RCSfile: N_DEV_Synapse2.C,v $
27 //
28 // Purpose :
29 //
30 // Special Notes :
31 //
32 // Creator : Christy Warrender, SNL, Cognitive Modeling
33 //
34 // Creation Date : 11/18/10
35 //
36 // Revision Information:
37 // ---------------------
38 //
39 // Revision Number: $Revision: 1.34.2.2 $
40 //
41 // Revision Date : $Date: 2014/03/06 23:33:43 $
42 //
43 // Current Owner : $Author: tvrusso $
44 //----------------------------------------------------------------------------
45 
46 #include <Xyce_config.h>
47 
48 
49 // ---------- Standard Includes ----------
50 
51 // ---------- Xyce Includes ----------
52 //
53 #include <N_DEV_Const.h>
54 #include <N_DEV_DeviceOptions.h>
55 #include <N_DEV_DeviceMaster.h>
56 #include <N_DEV_ExternData.h>
57 #include <N_DEV_MatrixLoadData.h>
58 #include <N_DEV_SolverState.h>
59 #include <N_DEV_Synapse2.h>
60 #include <N_DEV_Message.h>
61 #include <N_ERH_ErrorMgr.h>
62 
63 #include <N_DEV_Synapse.h>
64 
65 #include <N_LAS_Matrix.h>
66 #include <N_LAS_Vector.h>
67 
68 namespace Xyce {
69 namespace Device {
70 
71 
72 namespace Synapse2 {
73 
74 
76 {
77  // Set up configuration constants:
78 }
79 
81 {
82  // Set up map for double precision variables:
83  // Default values are taken from Destexhe 98, values for AMPA receptor
84  // although since this Synapse2::Model is different, those values may not have the same meaning
85  p.addPar ("GMAX", 1.0E-9, &Synapse2::Model::gMax)
86  .setUnit(U_OHMM1)
87  .setDescription("Maximal Synaptic Conductance");
88 
89  p.addPar ("EREV", 0.0, &Synapse2::Model::eRev)
90  .setUnit(U_VOLT)
91  .setDescription("Reversal Potential");
92 
93  p.addPar ("ALPHA", 1.1E-6, &Synapse2::Model::alpha)
94  .setUnit(U_SECM1)
95  .setDescription("Forward rate constant for receptor opening");
96 
97  p.addPar ("BETA", 190.0, &Synapse2::Model::beta)
98  .setUnit(U_SECM1)
99  .setDescription("Backward rate constant for receptor opening");
100 
101  p.addPar ("VP", 0.002, &Synapse2::Model::vP)
102  .setUnit(U_VOLT)
103  .setDescription("Presynaptic voltage that activates postsynaptic current");
104 
105  p.addPar ("TMAX", 0.001, &Synapse2::Model::tMax)
106  .setDescription("Maximal neurotransmitter concentration");
107 
108  // NOTE: not including concentration units - TMAX should be in moles/liter, and
109  // alpha has concentration in the denominator; they cancel out
110 }
111 
112 
113 std::vector< std::vector<int> > Instance::jacStamp;
114 
115 // Class Instance
116 //-----------------------------------------------------------------------------
117 // Function : Instance::processParams
118 // Purpose :
119 // Special Notes :
120 // Scope : public
121 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
122 // Creation Date : 6/03/02
123 //-----------------------------------------------------------------------------
125 {
126  // now set the temperature related stuff.
127  //updateTemperature(temp);
128 
129  return true;
130 }
131 
132 //-----------------------------------------------------------------------------
133 // Function : Instance::Instance
134 // Purpose : instance block constructor
135 // Special Notes :
136 // Scope : public
137 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
138 // Creation Date : 3/16/00
139 //-----------------------------------------------------------------------------
141  const Configuration & configuration,
142  const InstanceBlock & IB,
143  Model & Riter,
144  const FactoryBlock & factory_block)
145 
146  : DeviceInstance(IB, configuration.getInstanceParameters(), factory_block),
147  model_(Riter),
148  li_Prev(-1),
149  li_Post(-1),
150  APostEquPostNodeOffset(-1),
151  APostEquRNodeOffset(-1),
152  AREquPostNodeOffset(-1),
153  AREquRNodeOffset(-1),
154  f_PostEquPostNodePtr(0),
155  f_PostEquRNodePtr(0),
156  f_REquPostNodePtr(0),
157  f_REquRNodePtr(0)
158 {
159  numIntVars = 1;
160  numExtVars = 2;
161  numStateVars = 0;
162 
163  if( jacStamp.empty() )
164  {
165  // Vpre, Vpost, r
166  jacStamp.resize(3);
167  jacStamp[0].resize(0);
168  jacStamp[1].resize(2);
169  jacStamp[2].resize(2);
170  jacStamp[1][0] = 1; // Vpost PostPostVar
171  jacStamp[1][1] = 2; // r PostRVar
172  jacStamp[2][0] = 0; // Vpre RVpre
173  jacStamp[2][1] = 2; // r RR
174  }
175 
176 
177  // Set up mapping from param names to class variables:
178 
179  // Set params to constant default values:
180  setDefaultParams ();
181 
182  // Set params according to instance line and constant defaults from metadata:
183  setParams (IB.params);
184 
185  // Set any non-constant parameter defaults:
186 
187  // Calculate any parameters specified as expressions:
189 
190  // calculate dependent (ie computed) params and check for errors:
191  processParams ();
192 }
193 
194 //-----------------------------------------------------------------------------
195 // Function : Instance::~Instance
196 // Purpose : destructor
197 // Special Notes :
198 // Scope : public
199 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
200 // Creation Date : 3/16/00
201 //-----------------------------------------------------------------------------
203 {
204 }
205 
206 //-----------------------------------------------------------------------------
207 // Function : Instance::registerLIDs
208 // Purpose :
209 // Special Notes :
210 // Scope : public
211 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
212 // Creation Date : 6/12/02
213 //-----------------------------------------------------------------------------
214 void Instance::registerLIDs( const std::vector<int> & intLIDVecRef,
215  const std::vector<int> & extLIDVecRef )
216 {
217  AssertLIDs(intLIDVecRef.size() == numIntVars);
218  AssertLIDs(extLIDVecRef.size() == numExtVars);
219 
220 #ifdef Xyce_DEBUG_DEVICE
221  if (getDeviceOptions().debugLevel > 0)
222  {
223  Xyce::dout() << std::endl << section_divider << std::endl;
224  Xyce::dout() << " SynapseInstance::registerLIDs" << std::endl;
225  Xyce::dout() << " name = " << getName() << std::endl;
226  }
227 #endif
228 
229  // copy over the global ID lists.
230  intLIDVec = intLIDVecRef;
231  extLIDVec = extLIDVecRef;
232 
233  li_Prev = extLIDVec[0];
234  li_Post = extLIDVec[1];
235 
236 #ifdef Xyce_DEBUG_DEVICE
237  if (getDeviceOptions().debugLevel > 0 )
238  {
239  Xyce::dout() << " li_Prev = " << li_Prev << std::endl;
240  Xyce::dout() << " li_Post = " << li_Post << std::endl;
241  }
242 #endif
243 
244  li_rVar = intLIDVec[0];
245 
246 #ifdef Xyce_DEBUG_DEVICE
247  if (getDeviceOptions().debugLevel > 0 )
248  {
249  Xyce::dout() << section_divider << std::endl;
250  }
251 #endif
252 }
253 
254 //-----------------------------------------------------------------------------
255 // Function : Instance::getIntNameMap
256 // Purpose :
257 // Special Notes :
258 // Scope : public
259 // Creator : Christina Warrender, SNL, Cognitive Modeling
260 // Creation Date : 10/17/11
261 //-----------------------------------------------------------------------------
262 std::map<int,std::string> & Instance::getIntNameMap ()
263 {
264  // set up the internal name map, if it hasn't been already.
265  if (intNameMap.empty ())
266  {
267  std::string tmpstr;
268 
269  tmpstr = getName() + "_r";
270  spiceInternalName (tmpstr);
271  intNameMap[ li_rVar ] = tmpstr;
272  }
273  return intNameMap;
274 }
275 
276 //-----------------------------------------------------------------------------
277 // Function : Instance::registerStateLIDs
278 // Purpose : Note that the Synapse2 does not have any state vars.
279 // Special Notes :
280 // Scope : public
281 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
282 // Creation Date : 06/12/02
283 //-----------------------------------------------------------------------------
284 void Instance::registerStateLIDs(const std::vector<int> & staLIDVecRef )
285 {
286  AssertLIDs(staLIDVecRef.size() == numStateVars);
287 }
288 
289 //-----------------------------------------------------------------------------
290 // Function : Instance::jacobianStamp
291 // Purpose :
292 // Special Notes :
293 // Scope : public
294 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
295 // Creation Date : 08/20/01
296 //-----------------------------------------------------------------------------
297 const std::vector< std::vector<int> > & Instance::jacobianStamp() const
298 {
299  return jacStamp;
300 }
301 
302 //-----------------------------------------------------------------------------
303 // Function : Instance::registerJacLIDs
304 // Purpose :
305 // Special Notes :
306 // Scope : public
307 // Creator : Robert Hoekstra, SNL, Parallel Computational Sciences
308 // Creation Date : 08/27/01
309 //-----------------------------------------------------------------------------
310 void Instance::registerJacLIDs( const std::vector< std::vector<int> > & jacLIDVec )
311 {
312  DeviceInstance::registerJacLIDs( jacLIDVec );
313 
314  APostEquPostNodeOffset = jacLIDVec[1][0];
315  APostEquRNodeOffset = jacLIDVec[1][1];
316  AREquPostNodeOffset = jacLIDVec[2][0];
317  AREquRNodeOffset = jacLIDVec[2][1];
318 }
319 
320 //-----------------------------------------------------------------------------
321 // Function : Instance::setupPointers
322 // Purpose :
323 // Special Notes :
324 // Scope : public
325 // Creator : Eric Keiter, SNL
326 // Creation Date : 11/30/08
327 //-----------------------------------------------------------------------------
329 {
330 #ifndef Xyce_NONPOINTER_MATRIX_LOAD
331  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
336 #endif
337 }
338 
339 //-----------------------------------------------------------------------------
340 // Function : Instance::updateIntermediateVars
341 // Purpose : update intermediate variables for one diode instance
342 // Special Notes :
343 // Scope : public
344 // Creator : Eric R. Keiter, Dept. 9233.
345 // Creation Date : 3/05/04
346 //-----------------------------------------------------------------------------
348 {
349  bool bsuccess = true;
350 
351  N_LAS_Vector * solVecPtr = extData.nextSolVectorPtr;
352 
353  if( getSolverState().dcopFlag )
354  {
355  // no firing during DCOP; r=0, so postsynaptic current is 0 and unchanging
356  ipost = 0.0;
357  didVpost = 0.0;
358  didr = 0.0;
359  rFval = 0.0;
360  drFdVpre = 0.0;
361  drFdr = 0.0;
362  }
363  else
364  {
365  double vPre = (*solVecPtr)[li_Prev];
366  double vPost = (*solVecPtr)[li_Post];
367  double rVar = (*solVecPtr)[li_rVar];
368 
369  // Load RHS vector element for the positive circuit node KCL equ.
370  {
371  Sacado::Fad::SFad<double,2> vPostVar( 2, 0, vPost );
372  Sacado::Fad::SFad<double,2> rVarS( 2, 1, rVar);
373 
374  // parameters
375  Sacado::Fad::SFad<double,2> gMaxVar( model_.gMax );
376  Sacado::Fad::SFad<double,2> eRevVar( model_.eRev );
377 
378  Sacado::Fad::SFad<double,2> resultFad;
379  resultFad = PostCurrentEqu( vPostVar, rVarS, gMaxVar, eRevVar );
380  ipost = resultFad.val();
381  didVpost = resultFad.dx(0);
382  didr = resultFad.dx(1);
383  }
384  {
385  Sacado::Fad::SFad<double,2> vPreVar( 2, 0, vPre );
386  Sacado::Fad::SFad<double,2> rVarS( 2, 1, rVar);
387 
388  // parameters
389  Sacado::Fad::SFad<double,2> alphaVar( model_.alpha );
390  Sacado::Fad::SFad<double,2> betaVar( model_.beta );
391  Sacado::Fad::SFad<double,2> tMaxVar( model_.tMax );
392  Sacado::Fad::SFad<double,2> vPVar( model_.vP );
393 
394  Sacado::Fad::SFad<double,2> resultFad;
395  resultFad = rEquF( vPreVar, rVarS, alphaVar, betaVar, tMaxVar, vPVar);
396  rFval = resultFad.val();
397  drFdVpre = resultFad.dx(0);
398  drFdr = resultFad.dx(1);
399  }
400  }
401 
402  return bsuccess;
403 }
404 
405 //-----------------------------------------------------------------------------
406 // Function : Instance::updatePrimaryState
407 // Purpose :
408 // Special Notes :
409 // Scope : public
410 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
411 // Creation Date : 01/29/01
412 //-----------------------------------------------------------------------------
414 {
415  bool bsuccess = updateIntermediateVars();
416  return bsuccess;
417 }
418 
419 //-----------------------------------------------------------------------------
420 // Function : Instance::updateSecondaryState
421 // Purpose :
422 // Special Notes :
423 // Scope : public
424 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
425 // Creation Date : 01/29/01
426 //-----------------------------------------------------------------------------
428 {
429  return true;
430 }
431 
432 //-----------------------------------------------------------------------------
433 // Function : Instance::loadDAEQVector
434 //
435 // Purpose : Loads the Q-vector contributions for a single
436 // Synapse2
437 //
438 // Special Notes : The "Q" vector is part of a standard DAE formalism in
439 // which the system of equations is represented as:
440 //
441 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
442 //
443 // Scope : public
444 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
445 // Creation Date : 8/31/2010
446 //-----------------------------------------------------------------------------
448 {
449  N_LAS_Vector * qVecPtr = extData.daeQVectorPtr;
450  N_LAS_Vector * solVecPtr = extData.nextSolVectorPtr;
451  double rVar = (*solVecPtr)[li_rVar];
452  (*qVecPtr)[li_rVar] -= rVar;
453 
454  return true;
455 }
456 //-----------------------------------------------------------------------------
457 // Function : Instance::loadDAEFVector
458 //
459 // Purpose : Loads the F-vector contributions for a single
460 // Synapse2 instance.
461 //
462 // Special Notes : This is an algebraic constaint, and as such the Synapse2
463 // does make a contribution to it.
464 //
465 // Scope : public
466 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
467 // Creation Date : 01/24/03
468 //-----------------------------------------------------------------------------
470 {
471  N_LAS_Vector * fVecPtr = extData.daeFVectorPtr;
472  (*fVecPtr)[li_Prev] += 0.0;
473  (*fVecPtr)[li_Post] += ipost;
474  (*fVecPtr)[li_rVar] += rFval;
475  return true;
476 }
477 
478 //-----------------------------------------------------------------------------
479 // Function : Instance::loadDAEdQdx
480 //
481 // Purpose : Loads the dQdx-matrix contributions for a single
482 // Synapse2 instance.
483 //
484 // Special Notes : The "Q" vector is part of a standard DAE formalism in
485 // which the system of equations is represented as:
486 //
487 // f(x) = dQ(x)/dt + F(x) - B(t) = 0
488 //
489 // The "Q" vector contains charges and fluxes, mostly.
490 // However, it is ordered like the solution vector, and as
491 // it is part of the KCL formulation, the terms in Q will
492 // actually be *sums* of charges, rather than single
493 // distinct charges.
494 //
495 // This function assumes that updatePrimaryState has been
496 // called recently enough for the contents of q0 to be
497 // valid.
498 //
499 // Scope : public
500 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
501 // Creation Date : 03/05/04
502 //-----------------------------------------------------------------------------
504 {
505  N_LAS_Matrix & dQdx = *(extData.dQdxMatrixPtr);
506  dQdx[li_rVar][AREquRNodeOffset] += -1.0;
507 
508  return true;
509 }
510 
511 //-----------------------------------------------------------------------------
512 // Function : Instance::loadDAEdFdx ()
513 //
514 // Purpose : Loads the F-vector contributions for a single
515 // Synapse2 instance.
516 //
517 // Special Notes : This is an algebraic constaint, and as such the Synapse2
518 // does make a contribution to it.
519 //
520 // Scope : public
521 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
522 // Creation Date : 03/05/04
523 //-----------------------------------------------------------------------------
525 {
526  N_LAS_Matrix & dFdx = *(extData.dFdxMatrixPtr);
528  dFdx[li_Post][APostEquRNodeOffset] += didr;
530  dFdx[li_rVar][AREquRNodeOffset] += drFdr;
531 
532  return true;
533 }
534 
535 //-----------------------------------------------------------------------------
536 // Function : Instance::updateTemperature
537 // Purpose :
538 // Special Notes :
539 // Scope : public
540 // Creator : Tom Russo, Component Information and Models
541 // Creation Date : 02/27/01
542 //-----------------------------------------------------------------------------
543 bool Instance::updateTemperature ( const double & temp_tmp)
544 {
545  bool bsuccess = true;
546  return bsuccess;
547 }
548 
549 //-----------------------------------------------------------------------------
550 // Function : Model::processParams
551 // Purpose :
552 // Special Notes :
553 // Scope : public
554 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
555 // Creation Date : 6/03/02
556 //-----------------------------------------------------------------------------
558 {
559 
560  return true;
561 }
562 
563 //----------------------------------------------------------------------------
564 // Function : Model::processInstanceParams
565 // Purpose :
566 // Special Notes :
567 // Scope : public
568 // Creator : Dave Shirely, PSSI
569 // Creation Date : 03/23/06
570 //----------------------------------------------------------------------------
572 {
573 
574  std::vector<Instance*>::iterator iter;
575  std::vector<Instance*>::iterator first = instanceContainer.begin();
576  std::vector<Instance*>::iterator last = instanceContainer.end();
577 
578  for (iter=first; iter!=last; ++iter)
579  {
580  (*iter)->processParams();
581  }
582 
583  return true;
584 }
585 
586 //-----------------------------------------------------------------------------
587 // Function : Model::Model
588 // Purpose : model block constructor
589 // Special Notes :
590 // Scope : public
591 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
592 // Creation Date : 5/16/00
593 //-----------------------------------------------------------------------------
595  const Configuration & configuration,
596  const ModelBlock & MB,
597  const FactoryBlock & factory_block)
598  : DeviceModel(MB, configuration.getModelParameters(), factory_block),
599  gMax(0.0),
600  eRev(0.0),
601  alpha(0.0),
602  beta(0.0),
603  vP(0.0),
604  tMax(0.0)
605 {
606 
607  // Set up mapping from param names to class variables:
608 
609  // Set params to constant default values:
610  setDefaultParams ();
611 
612  // Set params according to .model line and constant defaults from metadata:
613  setModParams (MB.params);
614 
615  // Set any non-constant parameter defaults:
616 
617  // Calculate any parameters specified as expressions:
619 
620  // calculate dependent (ie computed) params and check for errors:
621  processParams();
622 }
623 
624 //-----------------------------------------------------------------------------
625 // Function : Model::~Model
626 // Purpose : destructor
627 // Special Notes :
628 // Scope : public
629 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
630 // Creation Date : 3/16/00
631 //-----------------------------------------------------------------------------
633 {
634  std::vector<Instance*>::iterator iter;
635  std::vector<Instance*>::iterator first = instanceContainer.begin();
636  std::vector<Instance*>::iterator last = instanceContainer.end();
637 
638  for (iter=first; iter!=last; ++iter)
639  {
640  delete (*iter);
641  }
642 }
643 
644 //-----------------------------------------------------------------------------
645 // Function : Model::printOutInstances
646 // Purpose : debugging tool.
647 // Special Notes :
648 // Scope : public
649 // Creator : Eric Keiter, SNL, Parallel Computational Sciences
650 // Creation Date : 4/03/00
651 //-----------------------------------------------------------------------------
652 std::ostream &Model::printOutInstances(std::ostream &os) const
653 {
654  std::vector<Instance*>::const_iterator iter;
655  std::vector<Instance*>::const_iterator first = instanceContainer.begin();
656  std::vector<Instance*>::const_iterator last = instanceContainer.end();
657 
658  int i,isize;
659  isize = instanceContainer.size();
660  os << std::endl;
661  os << "Number of Synapse2 Instances: " << isize << std::endl;
662  os << " name model name Parameters" << std::endl;
663  for (i=0, iter=first; iter!=last; ++iter, ++i)
664  {
665  os << " " << i << ": " << (*iter)->getName() << "\t";
666  os << getName();
667  os << std::endl;
668  }
669 
670  os << std::endl;
671  return os;
672 }
673 
674 //-----------------------------------------------------------------------------
675 // Function : Model::forEachInstance
676 // Purpose :
677 // Special Notes :
678 // Scope : public
679 // Creator : David Baur
680 // Creation Date : 2/4/2014
681 //-----------------------------------------------------------------------------
682 /// Apply a device instance "op" to all instances associated with this
683 /// model
684 ///
685 /// @param[in] op Operator to apply to all instances.
686 ///
687 ///
688 void Model::forEachInstance(DeviceInstanceOp &op) const /* override */
689 {
690  for (std::vector<Instance *>::const_iterator it = instanceContainer.begin(); it != instanceContainer.end(); ++it)
691  op(*it);
692 }
693 
694 
695 // Synapse2 Master functions:
696 
697 //-----------------------------------------------------------------------------
698 // Function : Master::updateState
699 // Purpose :
700 // Special Notes :
701 // Scope : public
702 // Creator : Eric Keiter, SNL
703 // Creation Date : 11/26/08
704 //-----------------------------------------------------------------------------
705 bool Master::updateState (double * solVec, double * staVec, double * stoVec)
706 {
707  for (InstanceVector::const_iterator it = getInstanceBegin(); it != getInstanceEnd(); ++it)
708  {
709  (*it)->updateIntermediateVars();
710  }
711 
712  return true;
713 }
714 
715 //-----------------------------------------------------------------------------
716 // Function : Master::updateSecondaryState
717 // Purpose :
718 // Special Notes :
719 // Scope : public
720 // Creator : Eric Keiter, SNL
721 // Creation Date : 11/26/08
722 //-----------------------------------------------------------------------------
723 bool Master::updateSecondaryState ( double * staDerivVec, double * stoVec )
724 {
725  return true;
726 }
727 
728 Device *Traits::factory(const Configuration &configuration, const FactoryBlock &factory_block)
729 {
730 
731  return new Master(configuration, factory_block, factory_block.solverState_, factory_block.deviceOptions_);
732 }
733 
735 {
737  .registerDevice("synapse", 2)
738  .registerModelType("synapse", 2);
739 }
740 
741 } // namespace Synapse2
742 } // namespace Device
743 } // namespace Xyce