diff --git a/ivl_target.h b/ivl_target.h index 216ed39a2..42dbe167b 100644 --- a/ivl_target.h +++ b/ivl_target.h @@ -1,7 +1,7 @@ #ifndef IVL_ivl_target_H #define IVL_ivl_target_H /* - * Copyright (c) 2000-2015 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2016 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -315,6 +315,7 @@ typedef enum ivl_lpm_type_e { IVL_LPM_CMP_NEE= 19, /* Case NE (!==) */ IVL_LPM_DIVIDE = 12, IVL_LPM_FF = 3, + IVL_LPM_LATCH = 40, IVL_LPM_MOD = 13, IVL_LPM_MULT = 4, IVL_LPM_MUX = 5, @@ -336,8 +337,7 @@ typedef enum ivl_lpm_type_e { IVL_LPM_SUB = 8, IVL_LPM_SUBSTITUTE=39, /* IVL_LPM_RAM = 9, / obsolete */ - IVL_LPM_UFUNC = 14, - IVL_LPM_LATCH = 40 + IVL_LPM_UFUNC = 14 } ivl_lpm_type_t; /* The path edge type is the edge type used to select a specific @@ -1310,13 +1310,13 @@ extern unsigned ivl_lpm_lineno(ivl_lpm_t net); * inputs and the Q. All the types must be exactly the same. * * - D-FlipFlop (IVL_LPM_FF) - * This data is an edge sensitive register. The ivl_lpm_q output and - * single ivl_lpm_data input are the same with, ivl_lpm_width. This + * This device is an edge sensitive register. The ivl_lpm_q output and + * single ivl_lpm_data input are the same width, ivl_lpm_width. This * device carries a vector like other LPM devices. * * - Latch (IVL_LPM_LATCH) - * This data is an asynchronous latch. The ivl_lpm_q output and - * single ivl_lpm_data input are the same with, ivl_lpm_width. This + * This device is an asynchronous latch. The ivl_lpm_q output and + * single ivl_lpm_data input are the same width, ivl_lpm_width. This * device carries a vector like other LPM devices. * * - Memory port (IVL_LPM_RAM) (deprecated in favor of IVL_LPM_ARRAY) @@ -1438,14 +1438,14 @@ extern ivl_scope_t ivl_lpm_define(ivl_lpm_t net); extern ivl_nexus_t ivl_lpm_enable(ivl_lpm_t net); /* IVL_LPM_ADD IVL_LPM_CONCAT IVL_LPM_FF IVL_LPM_PART IVL_LPM_MULT IVL_LPM_MUX IVL_LPM_POW IVL_LPM_SHIFTL IVL_LPM_SHIFTR IVL_LPM_SUB - IVL_LPM_UFUNC IVL_LPM_SUBSTITUTE IVL_LPM_LATCH*/ + IVL_LPM_UFUNC IVL_LPM_SUBSTITUTE IVL_LPM_LATCH */ extern ivl_nexus_t ivl_lpm_data(ivl_lpm_t net, unsigned idx); /* IVL_LPM_ADD IVL_LPM_MULT IVL_LPM_POW IVL_LPM_SUB IVL_LPM_CMP_EQ IVL_LPM_CMP_EEQ IVL_LPM_CMP_EQX IVL_LPM_CMP_EQZ IVL_LPM_CMP_NEE */ extern ivl_nexus_t ivl_lpm_datab(ivl_lpm_t net, unsigned idx); /* IVL_LPM_ADD IVL_LPM_FF IVL_LPM_MULT IVL_LPM_PART IVL_LPM_POW IVL_LPM_SUB IVL_LPM_UFUNC IVL_LPM_CMP_EEQ IVL_LPM_CMP_EQX - IVL_LPM_CMP_EQZ IVL_LPM_CMP_NEE IVL_LPM_SUBSTITUTE IVL_LPM_LATCH*/ + IVL_LPM_CMP_EQZ IVL_LPM_CMP_NEE IVL_LPM_SUBSTITUTE IVL_LPM_LATCH */ extern ivl_nexus_t ivl_lpm_q(ivl_lpm_t net); extern ivl_drive_t ivl_lpm_drive0(ivl_lpm_t net); extern ivl_drive_t ivl_lpm_drive1(ivl_lpm_t net); diff --git a/t-dll-api.cc b/t-dll-api.cc index b739bd79b..9fe60d365 100644 --- a/t-dll-api.cc +++ b/t-dll-api.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2015 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2016 Stephen Williams (steve@icarus.com) * Copyright CERN 2013 / Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it @@ -1149,7 +1149,7 @@ extern "C" ivl_nexus_t ivl_lpm_enable(ivl_lpm_t net) case IVL_LPM_FF: return net->u_.ff.we; case IVL_LPM_LATCH: - return net->u_.latch.we; + return net->u_.latch.e; default: assert(0); return 0; diff --git a/t-dll.cc b/t-dll.cc index 52bb17581..626f3a74f 100644 --- a/t-dll.cc +++ b/t-dll.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2015 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2016 Stephen Williams (steve@icarus.com) * Copyright CERN 2013 / Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it @@ -2066,17 +2066,11 @@ void dll_target::lpm_latch(const NetLatch*net) const Nexus*nex; - /* If there is a clock enable, then connect it up to the FF - device. */ - if (net->pin_Enable().is_linked()) { - nex = net->pin_Enable().nexus(); - assert(nex->t_cookie()); - obj->u_.latch.we = nex->t_cookie(); - assert(obj->u_.latch.we); - nexus_lpm_add(obj->u_.latch.we, obj, 0, IVL_DR_HiZ, IVL_DR_HiZ); - } else { - obj->u_.latch.we = 0; - } + nex = net->pin_Enable().nexus(); + assert(nex->t_cookie()); + obj->u_.latch.e = nex->t_cookie(); + assert(obj->u_.latch.e); + nexus_lpm_add(obj->u_.latch.e, obj, 0, IVL_DR_HiZ, IVL_DR_HiZ); nex = net->pin_Q().nexus(); assert(nex->t_cookie()); diff --git a/t-dll.h b/t-dll.h index 7baa9263c..b85bb2d43 100644 --- a/t-dll.h +++ b/t-dll.h @@ -1,7 +1,7 @@ #ifndef IVL_t_dll_H #define IVL_t_dll_H /* - * Copyright (c) 2000-2015 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2016 Stephen Williams (steve@icarus.com) * * This source code is free software; you can redistribute it * and/or modify it in source code form under the terms of the GNU @@ -390,8 +390,7 @@ struct ivl_lpm_s { ivl_expr_t sset_value; } ff; struct ivl_lpm_latch_s { - unsigned negedge_flag :1; - ivl_nexus_t we; + ivl_nexus_t e; union { ivl_nexus_t*pins; ivl_nexus_t pin;